web-dev-qa-db-ja.com

テキストデータから単語の袋を取得するにはどうすればよいですか?

大規模なテキストデータセットを使用して予測問題に取り組んでいます。私は実装しています Bag of Words Model。

言葉の袋を手に入れる最良の方法は何でしょうか?現在、さまざまな単語の tf-idf があり、単語の数が多すぎて次の割り当てに使用できません。 tf-idf基準を使用する場合、バッグオブワードを取得するためのtf-idfしきい値はどのようにする必要がありますか?または、他のアルゴリズムを使用する必要があります。私はpythonを使用しています。

17
hshed

collections.Counterクラス を使用する

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

Bag of Wordは、各行がドキュメントを表し、列が個々のトークンを表すマトリックスとして定義できます。さらに、テキストの順番は維持されません。 「Bag of Words」の構築には3つのステップが必要です

  1. トークン化
  2. カウント
  3. 正規化

注意すべき制限:1.フレーズや複数単語の表現をキャプチャできない2.スペルミスに敏感で、スペルコレクターまたは文字表現を使用して回避できる

例えば.

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

Bag-of-wordsモデルは、テキスト表現をさまざまな機械学習タスクに適用するための優れた方法です。しかし、最初のステップでは、句読点、htmlタグ、ストップワードなどの不要なデータからデータをクリーンアップする必要があります...これらのタスクでは、 Beautiful Soup ( HTMLマークアップ)または [〜#〜] nltk [〜#〜] (ストップワードを削除するため)Pythonでは。データをクリーンアップした後、ベクターフィーチャー(機械学習用のデータの数値表現)を作成する必要があります。ここでBag-Of-Wordsが役割を果たします。 scikit-learnに役立つモジュール(feature_extractionmodule)がありますBag-of-Words機能を作成します。

この チュートリアル でも詳細に必要なものがすべて見つかるかもしれません this 1つは非常に役立ちます。どちらもとても便利だと思いました。

5
Far

他の人がすでに述べたように、安定していてスケーラブルなものが必要な場合は、nltkを使用するのが最善の方法です。高度な設定が可能です。

ただし、デフォルトを微調整する場合は、学習曲線が非常に急になるという欠点があります。

かつて、一言分の袋が欲しくなりました。問題は、-_など、vue-router_.jsなどのエキゾチックな名前を持つテクノロジーに関する記事に関するものでした。

たとえば、nltkのWord_tokenizeのデフォルト設定では、vue-routerを2つの別々の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']

このルーチンは、collections.Counterに関するPatty3118の回答と簡単に組み合わせることができます。たとえば、記事で_.jsが言及された回数を知ることができます。

2
Jivan

本「機械学習パイソン」から:

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

あなたはチェックアウトする必要がありますscikits-learn、この機能の多くが組み込まれています。Webサイトには サンプルコード も含まれています。

もう1つのオプションはnltkで、これには多くのNice言語処理機能があります。私はそれをあまり使用していませんが、あなたがしていることを行うためのいくつかの機能が必要なようです。

0
BenDundee