gpt4 book ai didi

python - 在 NLTK 中实现词袋朴素贝叶斯分类器

转载 作者:IT老高 更新时间:2023-10-28 20:26:17 25 4
gpt4 key购买 nike

我基本上有same question as this guy .. example in the NLTK book因为朴素贝叶斯分类器只考虑一个词是否出现在文档中作为一个特征。它不考虑词的频率作为要查看的特征(“词袋”)。

One of the answers似乎暗示这不能用内置的 NLTK 分类器来完成。是这样吗?如何使用 NLTK 进行频率/词袋 NB 分类?

最佳答案

scikit-learnan implementation of multinomial naive Bayes ,这是在这种情况下朴素贝叶斯的正确变体。不过,支持向量机 (SVM) 可能会更好。

正如 Ken 在评论中指出的那样,NLTK 有 a nice wrapper for scikit-learn classifiers .根据文档修改,这里有一个有点复杂的,它进行 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

不完美,但还不错,考虑到这不是一个 super 简单的问题,而且只训练了 100/100。

关于python - 在 NLTK 中实现词袋朴素贝叶斯分类器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10098533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com