用于Python NLTK中的utf-8的NLP NaiveBayesClassifier

时间:2017-03-30 07:40:59

标签: python utf-8 nltk

我正在尝试使用NLTK对阿拉伯语短语执行一些NLP NLTK分类。如果我在分类器中输入原生单词,那么它会抱怨非ascii字符。目前,我正在使用word.decode('utf-8')然后将其输入到培训师。

当我测试分类器时,如果存在完全匹配,则结果会有所帮助。但是,如果我在原始训练单词中测试单词的子字符串,那么结果看起来有点随机。

我只想区分这是一个糟糕的分类器,还是编码中存在一些降低分类器性能的根本原因。这是将非ascii文本输入分类器的合理方法吗?

#!/usr/bin/python
# -*- coding: utf-8 -*-

from textblob.classifiers import NaiveBayesClassifier

x = "الكتاب".decode('utf-8')
...

train = [
(x,'pos'),
]

cl = NaiveBayesClassifier(train)

t = "كتاب".decode('utf-8')
cl.classify(t)

t中的单词只是x,删除了前两个字母。我当然用更大的数据集来运行它。

1 个答案:

答案 0 :(得分:1)

您的帖子基本上包含两个问题。第一个是关于编码,第二个是关于预测训练中看到的词的子串。

对于编码,您应该直接使用unicode文字,因此可以省略decode()部分。像这样:

x = u"الكتاب"

然后你已经有一个解码的表示。

关于子字符串,分类器不会为您做到这一点。如果您要求对训练中未包含完全相同拼写的令牌进行预测,那么它将被视为未知单词 - 无论它是否是训练中出现的单词的子串或不。

无论如何,子字符串的情况都不会很明确:让我们说你查找单个字母Alif - 可能,培训中看到的很多单词都包含它。应该使用哪一个?一个随机的?概率最高的那个?所有匹配概率的总和?对此没有简单的答案。

我怀疑您正在尝试匹配同一根的形态变体。如果是这种情况,那么你应该尝试使用lemmatiser。因此,在训练之前,以及在预测之前,你通过将它们转换为它们的引理(我认为通常是阿拉伯语的根)来预处理所有标记。我怀疑NLTK带有阿拉伯语的形态模型,所以你可能需要在其他地方寻找它(但现在这超出了这个答案的范围)。