如何删除名词前的形容词或定语?

问题描述

目前,我正在使用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”的形容词。您的帖子表明您不希望将其删除。

输入:“收入高于平均收入的人”输出:“收入高于平均收入的人”

此外,我不确定您为什么期望在下面的输入/输出中删除“均值”一词,因为它不是形容词。

输入:“什么是利润”输出:“什么是利润”

Parts of Speech

是检查句子的好地方

下面将是您的实际输出,正确删除了形容词,而且似乎只是在这样做。

输入:“收入最高的人”输出:“收入最高的人” 输入:“收入高于平均收入的人”输出:“收入高于平均收入的人” 输入:“利润的平均值是什么”输出:“利润的平均值是什么”

如果您只是想删除与该名词有关的任何描述性元素,那么我将不得不问更多有关您的问题的信息。您的示例都以名词结尾,并且这似乎是您关注的名词。此代码将处理的所有句子都会是这种情况吗?如果是这样,您可以考虑向后遍历句子。您可以轻松识别名词。在逐步浏览时,您将查看该名词是否具有带标记'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)

`