如何从文本数据中获取单词?

时间:2013-03-19 18:06:23

标签: python machine-learning text-processing

我正在使用大型文本数据集处理预测问题。我正在实施Bag of Words Model.

什么应该是最好的方法来获得一揽子文字?现在,我有tf-idf个各种单词,单词数量太大,无法用于进一步的分配。如果我使用tf-idf标准,那么获取单词包的tf-idf阈值应该是多少?或者我应该使用其他一些算法。我正在使用python。

6 个答案:

答案 0 :(得分:24)

使用collections.Counter class

>>> 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})
>>> 

答案 1 :(得分:13)

可以将多个单词定义为矩阵,其中每行表示文档,列表示单个标记。还有一件事,不保持文本的连续顺序。建立一个“袋子的话”涉及3个步骤

  1. 标记化
  2. 计数
  3. 正火
  4. 要记住的限制:  1.无法捕捉短语或多词表达  2.对拼写错误敏感,可以使用拼写纠正器或角色表示来解决这个问题,

    e.g。

    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())
    

答案 2 :(得分:4)

词汇模型是一种很好的方法,可以将文本表示应用于不同的机器学习任务中。但是在第一步中,您需要清除不必要数据中的数据,例如标点符号,html标记,停用词......对于这些任务,您可以轻松利用Beautiful Soup之类的库(删除HTML标记)或在Python中NLTK(删除停用词)。  清理完数据后,您需要创建一个矢量要素(机器学习数据的数字表示),这就是Bag-Of-Words扮演的角色。 scikit-learn 有一个模块( feature_extraction 模块),可以帮助您创建词袋功能。

您可以在此tutorial中找到您需要的所有内容,this也可以提供帮助。我发现它们都很有用。

答案 3 :(得分:2)

正如其他人已经提到的,如果你想要一些稳定且可扩展的东西,使用nltk将是你最好的选择。它具有高度可配置性。

然而,如果你想调整默认值,它有一个非常陡峭的学习曲线的缺点。

我曾经遇到过一种情况,我想要一个单词。问题是,它涉及有关充满-_等异域名称的技术的文章,例如vue-router_.js等。

nltk word_tokenize的默认配置是将vue-router拆分为两个单独的vuerouter字词。我甚至没有谈论_.js

因此,为了它的价值,我最终编写了这个小例程,根据我自己的标点符号将所有单词标记为list

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的次数。

答案 4 :(得分:0)

您应该查看scikits-learn,其中包含了大量此功能。在他们的网站上甚至还有一些sample code

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

答案 5 :(得分:0)

从一本书“机器学习python”:

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