【问题标题】:scikit learn classifies stopwordsscikit learn 对停用词进行分类
【发布时间】:2014-09-08 11:41:31
【问题描述】:

这是一个示例,其中有一步一步的过程来使系统学习和分类输入数据。

它为给定的 5 个数据集域正确分类。此外,它还对停用词进行分类。

例如

输入:docs_new = ['God is love', 'what is where']

输出:

'God is love' => soc.religion.christian
'what is where' => soc.religion.christian

此处what is where 不应归类,因为它仅包含停用词。在这种情况下 scikit 如何学习函数?

【问题讨论】:

    标签: machine-learning scikit-learn classification


    【解决方案1】:

    我不确定您使用的是什么分类器。但我们假设您使用朴素贝叶斯分类器。

    在这种情况下,样本被标记为在给定特定单词模式的情况下后验概率最大的类。
    后验概率计算为

    后验=似然x先验

    请注意,证据项已被删除,因为它是恒定的)。此外,还有一个附加平滑可以避免可能性为零的情况。
    无论如何,如果您的输入文本中只有停用词,则所有类别的可能性都是恒定的,后验概率完全由您的先验概率决定。因此,基本上发生的是朴素贝叶斯分类器(如果先验是根据训练数据估计的)将分配训练数据中最常出现的类标签。

    【讨论】:

    • 所以,如果输入查询是域外的,同样的情况也会发生。对吗?
    • 基本上,每次你遇到完全“新”的东西,即所有不在训练集中的单词文本时,类条件概率(可能性)为 0 - 并考虑加法平滑这将是一个常数项> 0。因此,一切(后验和基于后验的决策规则)都取决于(类)先验。
    • 非常感谢您的解释。如果存在,您能否为此提供任何 scikit 参考?
    • 当然,看看scikit-learn.org/stable/modules/naive_bayes.html。顺便说一句,我正在准备一个关于朴素贝叶斯分类的更详细的教程,解释这些概念,并最终将它们应用于使用 scikit learn 进行垃圾邮件过滤。它远未完成,但如果有帮助,这里是一个预览:nbviewer.ipython.org/github/rasbt/pattern_classification/blob/…
    【解决方案2】:

    根据定义,分类器总是预测它在训练阶段看到的类别之一。我不知道您为生成分类器做了什么,但很可能它只是预测任何没有有趣特征的样本的多数类;这就是朴素贝叶斯、线性 SVM 和其他典型文本分类器所做的。

    【讨论】:

    • 是的,理想情况下它应该做你提到的,而且我也遵循了给定的程序。但它仍然将stopwords 分类。如果可能的话,只需花 2-3 分钟来测试这个训练分类器的示例 scikit-learn.org/stable/tutorial/text_analytics/…,并进行输入查询 what is where。看看输出的是什么。结果对我来说很奇怪
    • @user2129623 这是预期的行为。正如我在答案中详述的那样,任何文档,甚至是空文档,都将被分配一个类。
    • 好的,我同意。但是,如果查询中的文本与任何训练有素的类不匹配,那么它会随机分配任何类或什么。这就是我想知道的
    • 正如我所说,当没有任何特征匹配时,它将分配多数类。
    【解决方案3】:

    标准文本分类使用 TfidfVectorizer 将文本转换为标记和特征向量作为分类器的输入。 init 参数之一是 stop_words,如果 stop_words='english' 向量化器将不会为句子“what is where”生成任何特征。 停用词使用内置的英文停用词列表与每个输入标记进行词法匹配,您可以在此处查看:https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/feature_extraction/stop_words.py

    【讨论】:

    • @D:谢谢,我也是这么理解的; vectorizer 不会为句子“what is where”产生任何特征。但它仍然为电影提供了 33% 的收益。对于 4 个域,结果为 'what is what' => films => 0.333333333333 'what is what' => laptops => 0.333333333333 'what is what' => medicine => 0.166666666667 'what is what' => mobile_phones => 0.166666666667
    • 这取决于矢量化器、分类器的确切设置以及用于训练分类器的训练数据。您看到的结果只是每个类别的初始分布。大概是每个类别的训练数据的比例。
    • 是的,不仅是使用 Tf-idf 的情况,还有 Count vectorizers 等。
    猜你喜欢
    • 2017-08-08
    • 2016-05-16
    • 2014-10-27
    • 2016-03-17
    • 2015-02-05
    • 2021-03-26
    • 2016-05-08
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多