2

我正在尝试使用NLTK实现作者身份识别,到目前为止,我无法弄清楚我应该如何安排语料库,并假设使用BOW作为特征的最简单场景,我不知道如何存储这个特征,如列表、集合、FreqDist 或 Dic?我想做的是将我的文档放在文件夹中,每个文件夹都是类标签,就像 author1 作为文件夹,他的所有培训文档都在该文件夹中,其他作者也是如此。到目前为止我所玩的是制作所有一位作者的文档作为一个大文本文件保存在古腾堡语料库中,并移动了原始古腾堡文件并使用:

从 nltk.corpus 导入古腾堡

通过这种方式,我确实可以访问我的文件并且可以执行 BOW,但不知道如何存储它们以进行分类。我试图修改以下示例的 movie_reviews 以适合我的语料库,但失败了:

import numpy as np
import nltk
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=200)),
                     ('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.batch_classify(pos[100:]))
l_neg = np.array(classif.batch_classify(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())

任何帮助将不胜感激,如果有任何人可以合作,最好是为每个作者在文件夹中保存文件,或者为每个作者保存一个大文本文件

谢谢

4

0 回答 0