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?