[英]How to work with n-grams for classification tasks?
我将使用n-gram
在样本数据集上训练分类器。 我搜索了相关内容,写了下面的代码。 由于我是 python 的初学者,我有两个问题。
1- 为什么字典应该有这个“真实”的结构(用注释标记)? 这与朴素贝叶斯分类器输入有关吗?
2- 你推荐哪个分类器来完成这个任务?
欢迎任何其他缩短代码的建议:)。
from nltk.corpus import movie_reviews
from nltk.corpus import stopwords
from nltk import ngrams
from nltk.classify import NaiveBayesClassifier
import nltk.classify.util
stoplist = set(stopwords.words("english"))
def stopword_removal(words):
useful_words = [word for word in words if word not in stoplist]
return useful_words
def create_ngram_features(words, n):
ngram_vocab = ngrams(words, n)
my_dict = dict([(ng, True) for ng in ngram_vocab]) # HERE
return my_dict
for n in [1,2]:
positive_data = []
for fileid in movie_reviews.fileids('pos'):
words = stopword_removal(movie_reviews.words(fileid))
positive_data.append((create_ngram_features(words, n), "positive"))
print('\n\n---------- Positive Data Sample----------\n', positive_data[0])
negative_data = []
for fileid in movie_reviews.fileids('neg'):
words = stopword_removal(movie_reviews.words(fileid))
negative_data.append((create_ngram_features(words, n), "negative"))
print('\n\n---------- Negative Data Sample ----------\n', negative_data[0])
train_set = positive_data[:100] + negative_data[:100]
test_set = positive_data[100:] + negative_data[100:]
classifier = NaiveBayesClassifier.train(train_set)
accuracy = nltk.classify.util.accuracy(classifier, test_set)
print('\n', str(n)+'-gram accuracy:', accuracy)
在数据训练之前,您需要将 n-gram 转换为大小为 <number_of_documents, max_document_representation_length> 的代码矩阵。 例如,文档表示是一个词袋,其中语料库词典的每个词/n-gram 在文档中都有其频率。
朴素贝叶斯分类器是最简单的分类器。 但它在嘈杂的数据上效果不佳,并且需要平衡数据类的分布进行训练。 您可以尝试使用任何提升分类器,例如梯度提升机或支持向量机。
所有分类器和转换器都在scikit-learn
库中可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.