【问题标题】:python - Picking most relevant words for a tag cloud from text using nltk and scikit-learnpython - 使用 nltk 和 scikit-learn 从文本中为标签云挑选最相关的词
【发布时间】:2013-01-23 00:57:22
【问题描述】:

我想从文本中获取最相关的词以准备标签云。

我使用了 scikit-learn 包中的 CountVectoriser:

cv = CountVectorizer(min_df=1, charset_error="ignore",
    stop_words="english", max_features=200)

这很好,因为它给了我单词和频率:

counts = cv.fit_transform([text]).toarray().ravel()
words = np.array(cv.get_feature_names())

我可以过滤掉不常用的词:

words = words[counts > 1]
counts = counts[counts > 1]

还有单词,即数字:

words = words[np.array(map(lambda x: x.isalpha(), words))]
counts = counts[np.array(map(lambda x: x.isalpha(), words))]

但它仍然不完美......

我的问题是:

  1. 如何过滤掉动词?
  2. 如何进行词干提取以去除同一个词的不同形式?
  3. 如何调用 CountVectoriser 过滤掉两个字母的单词?

另请注意:

  1. 我对 nltk 没问题,但像“你应该尝试 nltk”这样的回答不是答案,请给我一个代码。
  2. 我不想使用贝叶斯分类器和其他需要训练模型的技术。我没有时间,也没有训练分类器的示例。
  3. 语言是英语

【问题讨论】:

    标签: python data-mining nltk text-mining scikit-learn


    【解决方案1】:

    1- 如何过滤掉动词?

    取决于您要支持的语言。您将需要一个好的句子 + 单词标记器对和一个词性标注器。所有三个组件通常都使用机器学习模型来实现(尽管您可以使用基于规则的句子和单词标记器获得良好的结果)。如果你只想支持英语,你可以在 nltk 中找到预训练模型,但我不是专家,你必须阅读文档和教程:)

    一旦您知道如何将文本拆分为句子和单词并识别和删除动词,您就可以将其包装为 Python 函数并将其传递给 CountVectorizer 构造函数,如下所示。

    2- 如何进行词干提取以去除同一个词的不同形式?

    您必须将可调用的自定义tokenizer python 传递给CountVectorizer 构造函数,以同时处理令牌提取、词干提取和可选过滤。这在documentation 中有解释。

    对于词干本身,这取决于您要支持的语言,但您可以从http://nltk.org/api/nltk.stem.html开始

    有一个拉取请求可以更自然地插入词干分析器:

    https://github.com/scikit-learn/scikit-learn/pull/1537

    3-如何调用CountVectorizer过滤掉两个字母的单词?

    您可以更改用于标记化的默认正则表达式:

    >>> from sklearn.feature_extraction.text import CountVectorizer
    >>> CountVectorizer().token_pattern
    u'(?u)\\b\\w\\w+\\b'
    >>> CountVectorizer(token_pattern=u'(?u)\\b\\w{3,}\\b').build_tokenizer()(
    ...    'a ab abc abcd abcde xxxxxxxxxxxxxxxxxxxxxx')
    ['abc', 'abcd', 'abcde', 'xxxxxxxxxxxxxxxxxxxxxx']
    >>> CountVectorizer(token_pattern=u'(?u)\\b\\w{3,9}\\b').build_tokenizer()(
    ...     'a ab abc abcd abcde xxxxxxxxxxxxxxxxxxxxxx')
    ['abc', 'abcd', 'abcde']
    

    但在您的情况下,您可能希望整体替换分词器。您仍然可以查看source of the default implementation

    不过要说一句:要构建标签云,直接使用 nltk 和 python 标准库中的 collections.Counter 类可能要容易得多。 sklearn 不会为这项任务提供太多帮助。

    【讨论】:

    • 因为它在“请注意”部分?
    猜你喜欢
    • 2016-07-12
    • 2014-11-25
    • 2012-10-21
    • 2016-06-02
    • 2019-07-25
    • 2019-05-10
    • 2015-07-10
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多