Notes on using Python for language detection and tokenization

My upcoming works involves some text analysis so I’m exploring some of the available tools in Python. Today I tested some of the basic operations with the polyglot package.

Installation

Following the installation instructions, I install the dependencies for polyglot on my Ubuntu 20.04 machine with:

sudo apt-get install python-numpy libicu-dev

But I still got an ModuleNotFoundError for icu when I try to import polyglot in, so I fixed this by installing the module with pip:

sudo pip3 install pyicu

After that my imports started working properly.

Language detection

For language detection, I also need to install pycld2, which provides python bindings to the Google Chromium’s embedded compact language detection library (CLD2).

sudo pip3 install pycld2

Let’s try it out with a Chinese poem and its Sino-Vietnamese translations:

#!/usr/bin/env python3

from polyglot.detect import Detector

mixed_text = u"""
世俗逢元旦,
攜錢賜小兒。
孩子雖未識,
利祿卻先期。
古道懷毋誑,
人情惡自欺。
童蒙在始教,
可不慎其機。

Thế tục phùng nguyên đán,
Huề tiền tứ tiểu nhi.
Hài tử tuy vị thức,
Lợi lộc khước tiên kỳ.
Cổ đạo hoài vô cuống,
Nhân tình ác tự khi.
Đồng mông tại thuỷ giáo,
Khả bất thận kỳ cơ.
"""

detector = Detector(mixed_text)

for i in detector.languages:
    print(i)

Which produces:

name: Vietnamese  code: vi       confidence:  64.0 read bytes:  1366
name: Chinese     code: zh_Hant  confidence:  35.0 read bytes:  1920
name: un          code: un       confidence:   0.0 read bytes:     0

That was good. The detector covers quite a lot of languages:

print(len(Detector.supported_languages()))
196

Text tokenization

For text tokenization, we need to install another module:

sudo pip3 install Morfessor

Let’s test that out with Vietnamese translations for the same poem.

#!/usr/bin/env python3

from polyglot.text import Text

sample_text = u"""
Thế tục gặp ngày nguyên đán
Mang tiền mừng tuổi cho trẻ thơ
Bé con tuy chưa biết gì
Nhưng trước đã biết mong lợi lộc
Đạo xưa mong muốn không nói dối
Tính người ta ghét tự lừa mình
Dạy trẻ từ thuở thơ ấu
Không thể không thận trọng những lúc như thế
"""

print(Text(sample_text).words)
['Thế', 'tục', 'gặp', 'ngày', 'nguyên', 'đán', 'Mang', 'tiền', 'mừng', 'tuổi', 'cho', 'trẻ', 'thơ', 'Bé', 'con', 'tuy', 'chưa', 'biết', 'gì', 'Nhưng', 'trước', 'đã', 'biết', 'mong', 'lợi', 'lộc', 'Đạo', 'xưa', 'mong', 'muốn', 'không', 'nói', 'dối', 'Tính', 'người', 'ta', 'ghét', 'tự', 'lừa', 'mình', 'Dạy', 'trẻ', 'từ', 'thuở', 'thơ', 'ấu', 'Không', 'thể', 'không', 'thận', 'trọng', 'những', 'lúc', 'như', 'thế']

Hmm, so none of the Vietnamese portmanteaus was correctly tokenized. Let’s try another example:

sample_text = u"""
Lì xì hay mừng tuổi dịp Tết Nguyên đán là một phong tục lâu đời của người Việt. Dù là Tết xưa hay Tết nay, tục lệ này vẫn luôn được gìn giữ và trở thành một nét đẹp văn hóa truyền thống không thể thiếu trong những ngày Tết đến Xuân về. Tuy nhiên, cùng với sự phát triển của xã hội, phong tục này ít nhiều bị lợi dụng, biến tướng, lệch lạc so với giá trị tốt đẹp vốn có. Do đó, bảo tồn và phát huy tính biểu trưng của phong tục này là một việc vô cùng ý nghĩa.
"""

# The text is long, so I break it into sentences
for i in Text(sample_text).sentences:
    print(i.words)
['Lì', 'xì', 'hay', 'mừng', 'tuổi', 'dịp', 'Tết', 'Nguyên', 'đán', 'là', 'một', 'phong', 'tục', 'lâu', 'đời', 'của', 'người', 'Việt', '.']
['Dù', 'là', 'Tết', 'xưa', 'hay', 'Tết', 'nay', ',', 'tục', 'lệ', 'này', 'vẫn', 'luôn', 'được', 'gìn', 'giữ', 'và', 'trở', 'thành', 'một', 'nét', 'đẹp', 'văn', 'hóa', 'truyền', 'thống', 'không', 'thể', 'thiếu', 'trong', 'những', 'ngày', 'Tết', 'đến', 'Xuân', 'về', '.']
['Tuy', 'nhiên', ',', 'cùng', 'với', 'sự', 'phát', 'triển', 'của', 'xã', 'hội', ',', 'phong', 'tục', 'này', 'ít', 'nhiều', 'bị', 'lợi', 'dụng', ',', 'biến', 'tướng', ',', 'lệch', 'lạc', 'so', 'với', 'giá', 'trị', 'tốt', 'đẹp', 'vốn', 'có', '.']
['Do', 'đó', ',', 'bảo', 'tồn', 'và', 'phát', 'huy', 'tính', 'biểu', 'trưng', 'của', 'phong', 'tục', 'này', 'là', 'một', 'việc', 'vô', 'cùng', 'ý', 'nghĩa', '.']

Maybe tokenization does not work with Vietnamese at all?