以下のコードは文を個々のトークンに分割し、出力は以下のようになります
"cloud" "computing" "is" "benefiting" " major" "manufacturing" "companies"
import en_core_web_sm
nlp = en_core_web_sm.load()
doc = nlp("Cloud computing is benefiting major manufacturing companies")
for token in doc:
print(token.text)
「クラウドコンピューティング」は技術的には1つの単語なので、一緒に読むのが理想的です。
基本的に私はバイグラムを探しています。 Spacyにバイグラムまたはトライグラムを許可する機能はありますか?
Spacyは名詞チャンクの検出を可能にします。名詞句を単一のエンティティとして解析するには、次のようにします。
/ 1。名詞チャンクを検出 https://spacy.io/usage/linguistic-features#noun-chunks
/ 2。名詞チャンクをマージする/ 3。依存関係の解析を再度実行すると、「クラウドコンピューティング」が単一のエンティティとして解析されるようになります。
>>> import spacy
>>> nlp = spacy.load('en')
>>> doc = nlp("Cloud computing is benefiting major manufacturing companies")
>>> list(doc.noun_chunks)
[Cloud computing, major manufacturing companies]
>>> for noun_phrase in list(doc.noun_chunks):
... noun_phrase.merge(noun_phrase.root.tag_, noun_phrase.root.lemma_, noun_phrase.root.ent_type_)
...
Cloud computing
major manufacturing companies
>>> [(token.text,token.pos_) for token in doc]
[('Cloud computing', 'NOUN'), ('is', 'VERB'), ('benefiting', 'VERB'), ('major manufacturing companies', 'NOUN')]
>>>
スペイシーdoc
がある場合は、それを textacy に渡すことができます。
ngrams = list(textacy.extract.ngrams(doc, 2, min_freq=2))
私にも同様の問題がありました(バイグラム、トライグラム、「クラウドコンピューティング」のような)。 nグラム、Word_3gram、Word_2gramsなどの単純なリストを作成しました。グラムを基本単位として使用しました(cloud_computing)。 「安価なのでクラウドコンピューティングが好き」という文章があるとします。センテンス_2gramは次のとおりです。「I_like」、「like_cloud」、「cloud_computing」、「computing_because」...バイグラムリストを比較すると、「cloud_computing」のみが有効なバイグラムとして認識されます。文の他のすべてのバイグラムは人工です。他のすべての単語を回復するには、他の単語の最初の部分を取り、
"I_like".split("_")[0] -> I;
"like_cloud".split("_")[0] -> like
"cloud_computing" -> in bigram list, keep it.
skip next bi-gram "computing_because" ("computing" is already used)
"because_it's".split("_")[0]" -> "because" etc.
文の最後の単語( "安い")もキャプチャするために、トークン "EOL"を追加しました。私はこれをpythonで実装しました。速度は問題なく(3分間で500kワード)、8Gのi5プロセッサーでした。とにかく、あなたはそれを一度だけ行う必要があります。これは公式の(スペイシースタイルの)チャンクアプローチよりも直感的です。また、非スペイシーフレームワークでも機能します。
「クラウドコンピューティング」を可能な限りバイグラムにするため、私はこれを公式のトークン化/見出し語化の前に行います。しかし、これが最良の/正しいアプローチであるかどうかはわかりません。提案?
アンドレアス
PS:完全なコードが必要な場合は、行を1つドロップしてください。コードをサニタイズして、ここ(およびgithub)に配置します。