关于python:如何从文本数据中获取单词?

How to get bag of words from textual data?

我正在使用一个大的文本数据集处理预测问题。我正在实现一袋字模型。

什么是最好的方法来获得这些词语?现在,我有各种单词的tf idf,而且单词的数目太大,无法用于进一步的任务。如果我使用tf idf标准,那么tf idf阈值应该是什么?或者我应该使用其他一些算法。我正在使用python。


使用Collections.Counter类

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> import collections, re
>>> texts = ['John likes to watch movies. Mary likes too.',
   'John also likes to watch football games.']
>>> bagsofwords = [ collections.Counter(re.findall(r'\w+', txt))
            for txt in texts]
>>> bagsofwords[0]
Counter({'likes': 2, 'watch': 1, 'Mary': 1, 'movies': 1, 'John': 1, 'to': 1, 'too': 1})
>>> bagsofwords[1]
Counter({'watch': 1, 'games': 1, 'to': 1, 'likes': 1, 'also': 1, 'John': 1, 'football': 1})
>>> sumbags = sum(bagsofwords, collections.Counter())
>>> sumbags
Counter({'likes': 3, 'watch': 2, 'John': 2, 'to': 2, 'games': 1, 'football': 1, 'Mary': 1, 'movies': 1, 'also': 1, 'too': 1})
>>>


一袋单词可以定义为一个矩阵,其中每一行代表一个文档,每一列代表单个标记。还有一件事,文本的顺序没有被维护。建立一个"字袋"需要3个步骤

  • 标志法
  • 计数
  • 正火
  • 要记住的限制:1。无法捕获短语或多单词表达式2。对拼写错误敏感,可以使用拼写矫正器或字符表示来解决拼写错误,

    例如

    1
    2
    3
    4
    5
    6
    7
    from sklearn.feature_extraction.text import CountVectorizer
    vectorizer = CountVectorizer()
    data_corpus = ["John likes to watch movies. Mary likes movies too.",
    "John also likes to watch football games."]
    X = vectorizer.fit_transform(data_corpus)
    print(X.toarray())
    print(vectorizer.get_feature_names())


    文字袋模型是一种很好的文本表示方法,可以应用于不同的机器学习任务。但在第一步中,您需要从不必要的数据中清除数据,例如标点符号、HTML标记、停止词等。对于这些任务,您可以很容易地利用库,比如漂亮的soup(删除HTML标记)或python中的nltk(删除停止词)。在清理完数据之后,您需要创建一个向量特性(用于机器学习的数据的数字表示),这就是一袋单词发挥作用的地方。Scikit Learn有一个模块(Feature_Extraction模块),可以帮助您创建单词包功能。

    在本教程中,您可能会发现您所需要的所有详细信息,而且本教程非常有用。我发现它们都很有用。


    正如其他人已经提到的,如果您想要稳定和可扩展的东西,使用EDOCX1[1]将是您最好的选择。它是高度可配置的。

    但是,如果你想调整默认值,它有一个相当陡的学习曲线的缺点。

    我曾经遇到过一种情况,我想要一袋话。问题是,它涉及的是关于具有外来名称的技术,如-_等,如vue-router_.js等。

    例如,nltk的word_tokenize的默认配置是将vue-router分成两个单独的vuerouter字。我甚至都没说_.js

    因此,不管它值多少钱,我最后还是写了这个小程序,根据我自己的标点符号标准,把所有的单词标记成一个list

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import re

    punctuation_pattern = ' |\.$|\. |, |\/|\(|\)|\'|"|\!|\?|\+'
    text ="This article is talking about vue-router. And also _.js."
    ltext = text.lower()
    wtext = [w for w in re.split(punctuation_pattern, ltext) if w]

    print(wtext)
    # ['this', 'article', 'is', 'talking', 'about', 'vue-router', 'and', 'also', '_.js']

    这个程序可以很容易地与patty3118关于collections.Counter的回答结合起来,这可以让你知道文章中提到_.js的次数。


    从《机器学习Python》一书中:

    1
    2
    3
    4
    5
    import numpy as np
    from sklearn.feature_extraction.text import CountVectorizer
    count = CountVectorizer()
    docs = np.array(['blablablatext'])
    bag = count.fit_transform(docs)

    您应该查看scikits-learn,它有一系列内置的功能。他们的网站上甚至还有一些示例代码。

    另一个选项是nltk,它具有许多良好的语言处理功能。我没有用那么多,但它似乎应该有一些设施来做你正在做的事情。