使用 TF_IDF 提取特征后如何使用朴素贝叶斯分类器

Posted

技术标签:

【中文标题】使用 TF_IDF 提取特征后如何使用朴素贝叶斯分类器【英文标题】:How to use naive bayes classifier after Extract the features using TF_IDF 【发布时间】:2019-10-24 10:35:58 【问题描述】:

我正在尝试使用朴素贝叶斯分类器对特征进行分类,我使用 TF_IDF 进行特征提取。

finaltfidfVector是一个向量列表,每个向量代表一个数字列表,0如果没有找到单词,如果找到单词的权重。

classlabels 包含每个向量的所有类标签。我正在尝试使用此代码对其进行分类,但它不起作用。

26652 行数据集

from nltk.classify import apply_features

def naivebyse(finaltfidfVector,classlabels,reviews):

    train_set = []
    j = 0
    for vector in finaltfidfVector:
        arr=
        if j<18697:
            arr[tuple(vector)] = classlabels[j]
            train_set.append((arr, reviews[j]))
            j += 1

    test_set = []
    j = 18697
    for vector in finaltfidfVector:
        arr = 
        if j < 26652 and j>=18697:
            arr[tuple(vector)] = classlabels[j]
            test_set.append((arr, reviews[j]))
            j += 1

    classifier = nltk.NaiveBayesClassifier.train(train_set)
    print(nltk.classify.accuracy(classifier, test_set))

输出:

0.0

使用的TF_IDF 引用并应用于finaltfidfVector https://triton.ml/blog/tf-idf-from-scratch?fbclid=IwAR3UlCToGYFEQSmugXo3M5Q9fcld79JfXSfBaDG7wKv5a49O0ZDEft9DFNg。 数据集

this is sample about the used data set before preprocessing and TF_IDF

这是finaltfidfVector 列表中索引为零的第一个向量的示例

[0.0,0.0, 0.0, 0.6214608098422192, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5115995809754083,0.0,0.0, 0.0, 0.0, 0.5521460917862246, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6214608098422192,0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6214608098422192, 0.0, 0.0, 0.0, 0.6214608098422192]

classlabels 包含每个向量的类标签 , 1 代表讽刺 0 代表不讽刺。索引0的类标签为1,这个1为finaltfidfVector中的第一个向量。

train_set 的第一项是

((0.0, 0.0, 1.3803652294655615,.....ect): '0', "former versace store clerk sues over secret 'black code' for minority shoppers")

【问题讨论】:

您能发布一下您是如何创建finaltfidfVector classlabels 的吗?最好显示一些数据。 完成了,还有什么吗? 我已经修改了我的帖子。 您能否重新格式化您的帖子并提供一个最小的、可运行的代码 sn-p 示例?我试图重现您的问题,但您的 naivebayes 函数有语法错误。请修复该问题并再次发布相关代码。 你能告诉我错误到底在哪里吗? ,我真的很失望。 【参考方案1】:

这是一个可复制的玩具示例:

# let's define a train_set
train_set = [
    ('adam': 0.05,'is': 0.0, 'a': 0.0, 'good': 0.02, 'man': 0.0, 1),
    ('eve': 0.0, 'is':  0.0, 'a':  0.0,'good':  0.02,'woman': 0.0, 1),
    ('adam': 0.05, 'is': 0.0, 'evil': 0.0, 0)]

玩具数据集是使用手工制作的“tfidf”分数字典创建的:

tfidf_dict = 
 'adam': 0.05,
 'eve': 0.05,
 'evil': 0.02,
 'kind': 0.02,
 'good': 0.02,
 'bad': 0.02

每个已知单词都有一个 tfidf 分数,一个未知单词的分数是 0。而且在 train_set 中,我们有标记为 1 的句子的正分数(“adam is good”),标记为 0 的负分数(“adam是邪恶的”)。

现在运行一些测试:

import nltk
clf = nltk.NaiveBayesClassifier.train(train_set)

看看这在玩具火车上是如何工作的:

>>> nltk.classify.accuracy(clf, train_set)
1.0

由于测试集与训练集具有相同的结构,这足以说明如何训练和运行朴素贝叶斯分类器。

【讨论】:

好的,我试试这个 @AsmaaAbd_El3al 与此特定帖子无关,我将关闭后续内容。为您的下一个问题提出一个新问题。 @AsmaaAbd_El3al 如果我的帖子对我有帮助,请考虑支持投票。或者如果不是,这就是我能为这个做的一切。

以上是关于使用 TF_IDF 提取特征后如何使用朴素贝叶斯分类器的主要内容,如果未能解决你的问题,请参考以下文章

无法在朴素贝叶斯中训练模型

朴素贝叶斯分类器

使用朴素贝叶斯情感分析实现 PoS

如何在朴素贝叶斯分类器中使用优势比特征选择

为 Twitter 情绪分析项目寻找 C# 中的开源朴素贝叶斯分类器 [关闭]

如何计算精度和F1?