因此,作爲思考實驗的一部分,我在python中編寫了一個函數,它使用spaCy來查找新聞文章的主題,然後將其替換爲選擇的名詞。問題是,它不能很好地工作,我希望可以改進。我不完全理解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
代碼決定的字代替結束了「那「在這個句子中甚至不是一個名詞,但似乎導致了隨機詞選擇回退,因爲它找不到主語,間接賓語或直接賓語。我希望在這個例子中能找到更像「視頻遊戲」的東西。
我應該注意,如果我在displaCy中最後一點出現(它似乎是新聞文章的來源):https://demos.explosion.ai/displacy/?text=Video%20Games%20that%20Should%20Be%20Animated%20TV%20Shows&model=en&cpu=1&cph=1它似乎認爲「that」是主題,這是不正確的。
什麼是更好的解析方法?我應該首先尋找專有名詞嗎?
此嘗試/除了塊看起來不是很pythonic,初始化爲None,然後檢查是什麼錯? –
在句子片段中你不會看到好的結果,你的例句甚至沒有謂詞。 –
Re:try/except塊我基於這個代碼示例找到了如何使用SpaCy的代碼示例。不會有謂詞不好?有沒有比使用SpaCy更好地找到一個句子片段的主題? – SpaceMouse