如何使用 n-gram 进行分类任务?

Posted

技术标签:

【中文标题】如何使用 n-gram 进行分类任务?【英文标题】:How to work with n-grams for classification tasks? 【发布时间】:2021-02-09 02:15:00 【问题描述】:

我将使用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)

【问题讨论】:

您可以使用 sklearn 包进行特征提取和创建模型。 scikit-learn.org/stable/modules/feature_extraction.html 【参考方案1】:

在数据训练之前,您需要将您的 n-gram 转换为大小为 的代码矩阵。例如,文档表示是一个词袋,其中语料库词典的每个单词/n-gram 在文档中都有其频率。

朴素贝叶斯分类器是最简单的分类器。但它对嘈杂的数据效果不佳,需要平衡的数据类分布进行训练。您可以尝试使用任何提升分类器,例如梯度提升机或支持向量机。

scikit-learn 库中提供了所有分类器和转换器。

【讨论】:

以上是关于如何使用 n-gram 进行分类任务?的主要内容,如果未能解决你的问题,请参考以下文章

语言建模的交叉熵

如何训练 n-gram 的朴素贝叶斯分类器 (movie_reviews)

文本清洗+文本分类

字节 vs 字符 vs 单词 - n-gram 的粒度是多少?

文本摘要:如何选择合适的 n-gram 大小

【自然语言处理】CNN在NLP文本分类任务上的经典之作——TextCNN