2017-06-05 13 views
7

思考実験のビットとして、私はpyCyを使ってpyCyを使ってニュース記事の件名を見つけ出し、それを選んだ名詞に置き換えます。問題は、正確にはうまくいかず、改善できると思っていました。私はspaCyをよく理解していません。ドキュメントは理解するのが少し難しいです。spaCyを使用して文の「トピック」を置き換えます。

まず、コード:

doc=nlp(thetitle) 
for text in doc: 
    #subject would be 
    if text.dep_ == "nsubj": 
     subject = text.orth_ 
    #iobj for indirect object 
    if text.dep_ == "iobj": 
     indirect_object = text.orth_ 
     #dobj for direct object 
    if text.dep_ == "dobj": 
     direct_object = text.orth_ 
try: 
    subject 
except NameError: 
    if not thetitle: #if empty title 
     thetitle = "cat" 
     subject = "cat" 
    else: #if unknown subject 
     try: #do we have a direct object? 
      direct_object 
     except NameError: 
      try: #do we have an indirect object? 
       indirect_object 
      except NameError: #still no?? 
       subject = random.choice(thetitle.split()) 
      else: 
       subject = indirect_object 
     else: 
      subject = direct_object 
else: 
    thecat = "cat" #do nothing here, everything went okay 
newtitle = re.sub(r"\b%s\b" % subject, toreplace, thetitle) 
if (newtitle == thetitle) : #if no replacement happened due to regex 
    newtitle = thetitle.replace(subject, toreplace) 
return newtitle 

「猫」の行は、何もしないフィラー線です。 "thetitle"は、私がRSSフィードから引き出しているランダムなニュース記事タイトルの変数です。 "toreplace"は、見つかったサブジェクトが何であっても文字列を置き換える変数です。

のは、例を使ってみましょう:

「テレビをアニメーション化するべきビデオゲーム番組 - 画面の暴言を」そして、ここではそのdisplaCyの内訳です:コードを変更することを決定したhttps://demos.explosion.ai/displacy/?text=Video%20Games%20that%20Should%20Be%20Animated%20TV%20Shows%20-%20Screen%20Rant&model=en&cpu=1&cph=1

単語がされてしまいました」それは、この文の名詞でもないが、対象、間接的な対象、または直接的な対象を見つけることができなかったため、ランダムな単語選択のフォールバックをもたらしたようだ。私の希望は、この例では「ビデオゲーム」のようなものを見つけることです。

最後のビットを外して(ニュース記事のソースであると思われる)、表示されていることに注意してください。https://demos.explosion.ai/displacy/?text=Video%20Games%20that%20Should%20Be%20Animated%20TV%20Shows&model=en&cpu=1&cph=1 "that"が問題であると思われます。

これを解析するにはどうすればよいでしょうか?最初に固有名詞を探すべきですか?

+0

このtry/exceptブロックは非常にPythonicに見えません。何も問題なく、Noneに初期化して確認しますか? –

+0

あなたは文章の断片で良い結果を見ることはできません。あなたの例文には述語さえありません。 –

+0

Re:try/exceptブロックこれは、私がSpaCyの使い方のために見つけたコード例を基にしています。述語が悪くないでしょうか? SpaCyを使用するよりも文章断片のトピックを見つける良い方法はありますか? – SpaceMouse

答えて

1

あなたの質問に直接答えることはできませんが、条件は明示的であり、条件が有効なときに何が起こるかは遠くのelse欄には埋もれていないので、このコードは、複数のオブジェクトを持つケースも処理します。

あなたの問題:どの自然言語処理ツールでも、文章断片の主題(または多分話題かもしれません)を見つけるのが難しく、完全な文章で訓練されます。私はそのような断片に技術的に主題があるかどうかもわかりません(私は専門家ではありません)。あなた自身のモデルを訓練しようとすることもできますが、ラベル付きの文章を提供する必要があります。文章の断片にすでに存在するかどうかわかりません。

一般的な名詞と代名詞を見て、あなたが置きたい単語が含まれている可能性があり、最初に現れるものが最も重要である可能性が高いと思います。

import spacy 
import random 
import re 
from collections import defaultdict 

def replace_subj(sentence, nlp): 
    doc = nlp(sentence) 
    tokens = defaultdict(list) 

    for text in doc: 
     tokens[text.dep_].append(text.orth_) 

    if not sentence: 
     return "cat" 

    if "nsubj" in tokens: 
     subject = tokens["nsubj"][0] 
    elif "dobj" in tokens: 
     subject = tokens["dobj"][0] 
    elif "iobj" in tokens: 
     subject = tokens["iobj"][0] 
    else: 
     subject = random.choice(sentence.split()) 

    return re.sub(r"\b{}\b".format(subject), "cat", sentence) 

if __name__ == "__main__": 
    sentence = """Video Games that Should Be Animated TV Shows - Screen Rant""" 

    nlp = spacy.load("en") 
    print(replace_subj(sentence, nlp)) 
関連する問題