web-dev-qa-db-ja.com

Spacyにバイグラムとトライグラムの機能はありますか?

以下のコードは文を個々のトークンに分割し、出力は以下のようになります

 "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にバイグラムまたはトライグラムを許可する機能はありますか?

6
venkatttaknev

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')]
>>> 
2
DhruvPathak

スペイシーdocがある場合は、それを textacy に渡すことができます。

ngrams = list(textacy.extract.ngrams(doc, 2, min_freq=2))
0
Suzana

私にも同様の問題がありました(バイグラム、トライグラム、「クラウドコンピューティング」のような)。 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)に配置します。

0
user9165100