阿拉伯语预处理技术中的问题

时间:2018-03-05 10:16:02

标签: python nlp

我正在尝试在阿拉伯字符串列表中应用预处理技术,但我没有得到正确的结果。

这是我的代码:

import re
import sys
import itertools
from nltk.tokenize import TweetTokenizer
from nltk.stem.isri import ISRIStemmer

foo = 'السـلاام عــليكم 32 هذه تجّربة'
TATWEEL = u"\u0640"
stemmer = ISRIStemmer()
tknzr = TweetTokenizer()
text = tknzr.tokenize(foo)

for index in text:
    newList = [i for i in text if not i.isdigit()] # Remove digit 
    newList = ' '.join([i.lower() for i in text if not i.startswith(('@', '#'))]) # Remove mentions and hashtags
    newList = re.sub(r"http\S+", "",index) # Remove links
    newList = stemmer.norm(index, num=1) # #emove diacritics
    newList = re.sub(r'[^\w\s]','', index)  # Remove punctuation
    newList = index.replace(TATWEEL, '')
    newList = ''.join(i for i, _ in itertools.groupby(index)) # Remove consecutive duplicate

print (newList)

我应该得到的清单是:

السلام عليكم هذه تجربة

但我得到的是:

ربة

当我尝试单独测试每种方法时,它可以正常工作,但当我将它们聚集在一起时,它就会混乱。

- 我正在使用Python 3

谢谢。

2 个答案:

答案 0 :(得分:0)

您看到的值是列表text中的最后一项。所有前面的项目都会丢失,因为它们没有存储在任何地方。

此外,for循环体中的操作序列将值赋给newList,但是后续操作中未引用newList,因此任何累积效果都会丢失。

要解决第一个问题,您可以在for循环之前创建一个新的空列表,在处理它们时将附加项目。这将是最终结果列表。

第二个问题将通过在每个步骤中引用index并将结果分配回index来解决。

这是一个解决方案:

import re
import sys
import itertools
from nltk.tokenize import TweetTokenizer
from nltk.stem.isri import ISRIStemmer

foo = 'ﺎﻠﺴـﻻﺎﻣ ﻊــﻠﻴﻜﻣ 32 ﻩﺬﻫ ﺖﺟّﺮﺑﺓ'
TATWEEL = u"\u0640"
stemmer = ISRIStemmer()
tknzr = TweetTokenizer()
text = tknzr.tokenize(foo)

result = []     # cleaned strings are stored here

for word in text:
    if word.startswith(('@', '#')):    # filter out hashtags
        continue
    word = word.lower()
    word = ''.join([i for i in word if not i.isdigit()]) # Remove digits
    word = re.sub(r"http\S+", "",word) # Remove links
    word = stemmer.norm(word, num=1) # #emove diacritics
    word = re.sub(r'[^\w\s]','', word)  # Remove punctuation
    word = word.replace(TATWEEL, '')
    word = ''.join(i for i, _ in itertools.groupby(word)) # Remove consecutive duplicate
    if word:
        result.append(word)

print(' '.join(result))

<强>输出

ﺎﻠﺴﻻﺎﻣ ﻊﻠﻴﻜﻣ ﻩﺬﻫ ﺖﺟ ﺮﺑﺓ

答案 1 :(得分:0)

有一个特定的rtl语言包,例如名为Hazm的阿拉伯语。它修改了nltk以与rtl语言兼容。 这是链接Hazm