gpt4 book ai didi

python - 使用spaCy替换句子的 "topic"

转载 作者:太空狗 更新时间:2023-10-29 21:57:57 25 4
gpt4 key购买 nike

因此,作为一个思想实验,我在 python 中编写了一个函数,该函数使用 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”是一个变量,它保存要替换找到的主题的字符串。

让我们举个例子:

“应该是动画电视节目的视频游戏 - Screen Rant”这是它的显示分割:https://demos.explosion.ai/displacy/?text=Video%20Games%20that%20Should%20Be%20Animated%20TV%20Shows%20-%20Screen%20Rant&model=en&cpu=1&cph=1

代码决定替换的词最终变成了“that”,它在这句话中甚至不是名词,但似乎导致了随机词选择回退,因为它找不到主语,间接的宾语或直接宾语。我希望它能在此示例中找到更类似于“视频游戏”的内容。

如果我在显示中删除最后一点(这似乎是新闻文章的来源),我应该注意:https://demos.explosion.ai/displacy/?text=Video%20Games%20that%20Should%20Be%20Animated%20TV%20Shows&model=en&cpu=1&cph=1它似乎认为“that”是主语,这是不正确的。

什么是更好的解析方法?我应该先寻找专有名词吗?

最佳答案

不直接回答你的问题,我认为下面的代码更具可读性,因为条件是明确的,并且当条件有效时发生的事情没有埋在远处的 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))

关于python - 使用spaCy替换句子的 "topic",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44375142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com