问题描述
目前,我正在使用nltk删除所有形容词,这是我的尝试:
def remove_adj(sentence):
adjective_tags = ["JJ","JJR","JJS"]
tokens = nltk.word_tokenize(sentence)
tags = nltk.pos_tag(tokens)
for i in range(len(tags)):
word = [word for word,pos in tags if (pos not in adjective_tags)]
return ' '.join(word)
但是我需要的与此不同。以下是一些示例:
输入:“收入最高的人”输出:“收入最高的人”
输入:“收入高于平均收入的人”输出:“收入高于平均收入的人”
输入:“什么是利润”输出:“什么是利润”
有人可以给我一些建议吗?谢谢大家。
解决方法
我想我了解您要实现的目标,但是您遇到什么问题?我已经运行了您的代码,它似乎在删除形容词时非常有效。
有几件事使我失望。对于下面的输入/输出,可以预期将删除“更多”一词,因为它是带有标记“ JJR”的形容词。您的帖子表明您不希望将其删除。
输入:“收入高于平均收入的人”输出:“收入高于平均收入的人”
此外,我不确定您为什么期望在下面的输入/输出中删除“均值”一词,因为它不是形容词。
输入:“什么是利润”输出:“什么是利润”
是检查句子的好地方下面将是您的实际输出,正确删除了形容词,而且似乎只是在这样做。
输入:“收入最高的人”输出:“收入最高的人” 输入:“收入高于平均收入的人”输出:“收入高于平均收入的人” 输入:“利润的平均值是什么”输出:“利润的平均值是什么”
如果您只是想删除与该名词有关的任何描述性元素,那么我将不得不问更多有关您的问题的信息。您的示例都以名词结尾,并且这似乎是您关注的名词。此代码将处理的所有句子都会是这种情况吗?如果是这样,您可以考虑向后遍历句子。您可以轻松识别名词。在逐步浏览时,您将查看该名词是否具有带标记'DT'的限定词(a,an,the),因为您不想从我看到的内容中删除该名词。您将继续逐步删除所有内容,直到找到一个形容词或另一个名词。我不知道您删除该单词的实际规则是什么,但是向后工作可能会有所帮助。
编辑:
我对此进行了一些修改,使下面的代码可以完全按照您希望的方式工作。如果还有其他语音标签要停止,您可以在“ stop_tags”变量中填充标签。
def remove_adj(sentence):
stop_tags = ["JJ","JJR","JJS","NN"]
tokens = nltk.word_tokenize(sentence)
tags = list(reversed(nltk.pos_tag(tokens)))
noun_located = False
stop_reached = False
final_sent = ''
for word,pos in tags:
if noun_located == False and pos == 'NN':
noun_located = True
final_sent+=f' {word}'
elif stop_reached == False and pos in stop_tags:
stop_reached = True
elif stop_reached == True:
final_sent+=f' {word}'
final_sent = ' '.join(reversed(final_sent.split(' ')))
return final_sent
x = remove_adj('what is the mean of profit')
print(x)
`