【问题标题】:NLTK: feature reduction after vectorization [closed]NLTK:矢量化后的特征减少[关闭]
【发布时间】:2018-05-13 06:23:53
【问题描述】:

我已经从大约 3000 个文档中提取了非结构化文本数据,并且我正在尝试使用这些数据来对该文档进行分类。

但是,即使在移除停用词和标点符号并对数据进行词形还原之后,计数向量化仍会产生超过 64000 个特征。

其中许多功能包含不必要的标记,例如随机数和不同语言的文本。

我用过的库有:

  • 标记化:Punkt (NLTK)
  • pos 标记:Penn Treebank (NLTK)
  • 词形化:WordNet(NLTK)
  • 矢量化:CountVectorizer (sk-learn)

谁能建议我如何减少训练分类器的特征数量?

【问题讨论】:

  • 计数向量器总是会为任何类型的大型语料库产生大量特征。您应该尝试为它提供一个词汇表以限制它。制作一个好的词汇表本身就是一个很好的问题。
  • 没错。这个特殊问题的问题在于,对我来说,它处于未知领域。所以我什至不确定我应该尝试找到的单词
  • 如果您想了解是什么让单词对识别/分类文档很重要,我建议您研究tf/idf 算法。它甚至可能是 CountVectorizer 在内部用于加权的方法,但如果您很好地掌握了单词的选择方式,您应该能够从语料库中列出最重要的单词。这能解决你的问题吗?
  • 希望对您有所帮助:kaggle.com/alvations/basic-nlp-with-nltk
  • 为了扩展我上次的评论,我记得一个教程,它使用 sklearn 和字数向量 ins 的方式与您相同,但将它与 tf idf 结合起来处理数据量。你可能会在那里找到帮助:scikit-learn.org/stable/auto_examples/model_selection/…

标签: python machine-learning scikit-learn nlp nltk


【解决方案1】:

这里有两种选择,可以互补:

  1. 使用更强大的规则更改您的标记化,使用正则表达式删除您不感兴趣的数字或其他标记。
  2. 使用特征选择来保留与分类相关的特征子集。这是一个将 50% 的特征保留在数据中的示例代码:

from sklearn.datasets import load_iris

from sklearn.feature_selection import SelectPercentile
from sklearn.feature_selection import chi2
import numpy
iris = load_iris()
X, y = iris.data, iris.target
selector = SelectPercentile(score_func=chi2, percentile=50)
X_reduced = selector.fit_transform(X, y)

【讨论】:

  • 正则表达式肯定会减少我在矢量化时拥有的令牌数量。但是如果我需要进一步减少变量,SelectPercentile 类应该是正确的方法。感谢您的输入!分类器启动并运行后将更新
猜你喜欢
  • 1970-01-01
  • 2016-05-17
  • 2016-06-07
  • 2013-08-01
  • 2016-11-01
  • 2021-03-01
  • 1970-01-01
  • 2021-03-04
  • 2013-08-20
相关资源
最近更新 更多