web-dev-qa-db-ja.com

スペイシーを使用して最も一般的な単語を見つける方法は?

私はpythonでスペイシーを使用しており、各単語にタグを付けるのにうまく機能していますが、文字列内の最も一般的な単語を見つけることが可能であるかどうか疑問に思っていました。一般的な名詞、動詞、副詞など?

Count_by関数が含まれていますが、意味のある方法で実行することができません。

15
Harry Loyd

最近、テキストファイル内のすべてのトークンの頻度を数える必要がありました。 pos_属性を使用すると、単語をフィルターで除外して、好きなPOSトークンを取得できます。以下に簡単な例を示します。

import spacy
from collections import Counter
nlp = spacy.load('en')
doc = nlp(u'Your text here')
# all tokens that arent stop words or punctuations
words = [token.text for token in doc if token.is_stop != True and token.is_punct != True]

# noun tokens that arent stop words or punctuations
nouns = [token.text for token in doc if token.is_stop != True and token.is_punct != True and token.pos_ == "NOUN"]

# five most common tokens
Word_freq = Counter(words)
common_words = Word_freq.most_common(5)

# five most common noun tokens
noun_freq = Counter(nouns)
common_nouns = noun_freq.most_common(5)
22
Paras Dahal

これは、基本的にはPythonで他のものを数えるのと同じように見えるはずです。 spaCyを使用すると、ドキュメントを反復処理するだけで、Tokenオブジェクトのシーケンスを取得できます。これらを使用して注釈にアクセスできます。

from __future__ import print_function, unicode_literals
import spacy
from collections import defaultdict, Counter

nlp = spacy.load('en')

pos_counts = defaultdict(Counter)
doc = nlp(u'My text here.')

for token in doc:
    pos_counts[token.pos][token.orth] += 1

for pos_id, counts in sorted(pos_counts.items()):
    pos = doc.vocab.strings[pos_id]
    for orth_id, count in counts.most_common():
        print(pos, count, doc.vocab.strings[orth_id])

.orthおよび.pos属性は整数であることに注意してください。 .orth_および.pos_属性を介して、それらがマップする文字列を取得できます。 .orth属性は、トークンの非正規化されたビューです。lower、.lemmaなどのstring-viewもあります。 .norm関数をバインドして、独自の文字列正規化を行うことができます。詳細はドキュメントを参照してください。

大きなコーパスでカウントしている場合は、カウントプログラムでメモリをより効率的に使用できるため、整数はカウントに役立ちます。追加の速度と効率のために、頻繁なカウントをnumpy配列に保存することもできます。これに煩わされたくない場合は、.orth_属性を直接数えるか、エイリアス.textを使用してかまいません。

上記のスニペットの.pos属性は、品詞タグの大まかなセットを提供することに注意してください。より豊富なツリーバンクタグは、.tag属性で使用できます。

9
syllogism_

私はかなり遅れてこのスレッドに追加しています。ただし、実際には、spacyでdoc.count_by()関数を使用してこれを行う組み込みの方法があります。

import spacy
import spacy.attrs
nlp = spacy.load("en_core_web_sm")
doc = nlp("It all happened between November 2007 and November 2008")

# Returns integers that map to parts of speech
counts_dict = doc.count_by(spacy.attrs.IDS['POS'])

# Print the human readable part of speech tags
for pos, count in counts_dict.items():
    human_readable_tag = doc.vocab[pos].text
    print(human_readable_tag, count)

出力は次のとおりです。

動詞1

ADP 1

CCONJ 1

DET 1

NUM 2

PRON 1

PROPN 2

2
kalidurge