在NLTK中实现单词袋Naive-Bayes分类器
machine-learning
nlp
nltk
python
4
0

我基本上和这个人同样的问题 .. NLTK书中针对朴素贝叶斯分类器的示例仅考虑单词是否在文档中作为特征出现。它不考虑单词的出现频率作为特征。看一下(“词袋”)。

答案之一似乎表明,内置NLTK分类器无法做到这一点。是这样吗如何使用NLTK进行频率/单词袋NB分类?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

scikit-learn具有多项式朴素贝叶斯的实现,在这种情况下,它是朴素贝叶斯的正确变体。不过,支持向量机(SVM)可能会更好地工作。

正如Ken在评论中指出的那样,NLTK 对于scikit-learn分类器来说是一个很好的包装器 。根据文档进行了修改,这是一个有点复杂的操作,它执行TF-IDF加权,根据chi2统计量选择1000个最佳功能,然后将其传递给多项式朴素的贝叶斯分类器。 (我打赌这有点笨拙,因为我对NLTK或scikit-learn都不是很熟悉。)

import numpy as np
from nltk.probability import FreqDist
from nltk.classify import SklearnClassifier
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

pipeline = Pipeline([('tfidf', TfidfTransformer()),
                     ('chi2', SelectKBest(chi2, k=1000)),
                     ('nb', MultinomialNB())])
classif = SklearnClassifier(pipeline)

from nltk.corpus import movie_reviews
pos = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('pos')]
neg = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('neg')]
add_label = lambda lst, lab: [(x, lab) for x in lst]
classif.train(add_label(pos[:100], 'pos') + add_label(neg[:100], 'neg'))

l_pos = np.array(classif.classify_many(pos[100:]))
l_neg = np.array(classif.classify_many(neg[100:]))
print "Confusion matrix:\n%d\t%d\n%d\t%d" % (
          (l_pos == 'pos').sum(), (l_pos == 'neg').sum(),
          (l_neg == 'pos').sum(), (l_neg == 'neg').sum())

这印给我:

Confusion matrix:
524     376
202     698

考虑到这不是一个超级容易的问题,它并不完美,但还算不错,并且仅接受100/100的培训。

收藏
评论
  • 将您要查看的字符串分成列表,分成单词
  • 对于列表中的每个项目,请询问:此项目是我在功能列表中具有的功能吗?
  • 如果是,请正常添加对数概率,否则请忽略它。

如果您的句子多次具有相同的单词,则只会多次添加概率。如果单词在同一班上出现多次,则您的训练数据应在单词数中反映出来。

为了提高准确性,请将所有二元语法,三元语法等算作单独的特征。

它有助于手动编写自己的分类器,以便您准确了解正在发生的事情以及需要采取哪些措施来提高准确性。如果您使用预打包的解决方案,但效果不佳,则无能为力。

收藏
评论

NLTK贝叶斯分类器中的功能是“标称”而不是数字。这意味着它们可以采用有限数量的离散值(标签),但是不能将它们视为频率。

因此,使用贝叶斯分类器,您不能直接使用词频作为功能-您可以执行以下操作,例如将每个文本中的50个更频繁的词用作特征集,但这是完全不同的事情

但是,也许在NLTK中还有其他分类器取决于频率。我不知道,但是你看了吗?我会说值得一试。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号