Waheeb Al-Abyadh Waheeb Al-Abyadh - 3 months ago 28
Python Question

Error while stemming arabic text in file using ISRIStemmer

I am trying to stem the contents of a text file (text.txt) in Arabic Language using nltk.stem.isri .
The text.txt file contains the following Arabic text:

تتنوع المشاعر التي يشعر بها الإنسان خلال حياته، وتكون هذه المشاعر تبعاً لمواقف أو أشخاص معينين، ويعتبر الحب أحد المشاعر الجميلة التي تصيب الإنسان فتغير من نظرته للعالم من حوله ويصبح إيجابياً أكثر، وهي العلاقة العاطفية التي تجمع بين الرجل والمرأة أو بين الأشخاص المختلفين في حياته، وما تجره من مشاعر الاهتمام والمودة واللطف. الحب أيضاً حالةٌ من الانجذاب والإعجاب بين الأشخاص، ويقال بأنه نوعٌ من الكيمياء المتبادلة، إذ يعبر عن نوعٍ من التفاعل بين الناس، وفي الحب يفرز الجسم هرمون الأوكسيتوسين وهو الهرمون الذي يدعى بهرمون المحبين والمحبة الذي يفرزه الجسم فور اللقاء بين الأحبة، وفيما يلي من سطورٍ سنتحدث عن بعض المعلومات العامة حول الحب بشيءٍ من التفصيل والتوضيح.

I used the following code by referring to a previous question: Python Stemming words in a File

# -*- coding: UTF-8 -*-

from nltk.stem.isri import ISRIStemmer
def stemming_text_1():
with open('test.txt', 'r') as f:
for line in f:
print line
singles = []

stemmer = ISRIStemmer()
for plural in line.split():
singles.append(stemmer.stem(plural))
print ' '.join(singles)

stemming_text_1()


It prints the contents of the file and this error:

/home/waheeb/anaconda2/lib/python2.7/site-packages/nltk/stem/isri.py:154: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
if token in self.stop_words:
Traceback (most recent call last):
File "Arabic_stem.py", line 15, in <module>
stemming_text_1()
File "Arabic_stem.py", line 12, in stemming_text_1
singles.append(stemmer.stem(plural))
File "/home/waheeb/anaconda2/lib/python2.7/site-packages/nltk/stem /isri.py", line 156, in stem
token = self.pre32(token) # remove length three and length two prefixes in this order
File "/home/waheeb/anaconda2/lib/python2.7/site-packages/nltk/stem /isri.py", line 198, in pre32
if word.startswith(pre3):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd8 in position 0: ordinal not in range(128)

Answer

Try decoding the lines from the file to unicode before passing it to the stemmer. I am assuming that your input file is encoded as UTF8 (seems likely looking at the error), however, you can change the encoding as suits:

for line in f:
    line = line.decode('utf8')    # use the correct encoding here
    ...

Alternatively you can use io.open(), specify the encoding, and Python will decode the incoming stream to unicode:

with io.open('test.txt', encoding='utf8') as f:
    ...