Python 如何去掉名词前的形容词或定语?

Python 如何去掉名词前的形容词或定语?,python,nlp,nltk,spacy,Python,Nlp,Nltk,Spacy,目前我正在使用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,po

目前我正在使用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)
但我需要的和这个不同。以下是一些例子:

输入:“谁的收入最高”输出:“谁的收入最高”

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

输入:“利润的平均值是多少”输出:“利润是多少”


谁能给我一些建议吗?提前谢谢大家。

我想我理解你们想要实现的目标,但你们有什么问题?我已经运行了您的代码,它在删除形容词方面似乎非常有效

不过有几件事让我很反感。对于下面的输入/输出,您可以期望删除单词“more”,因为它是一个带有标记“JJR”的形容词。你的帖子表明你并不期望它被删除

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

另外,我不知道你为什么希望在下面的输入/输出中删除“mean”这个词,因为它不是一个形容词

输入:“利润的平均值是多少”输出:“利润是多少”

检查句子的好地方是

下面是您的实际输出,正确地删除了形容词,它似乎正在这样做

输入:“谁的收入最高”输出:“谁的收入最高” 输入:“谁的收入高于平均收入”输出:“谁的收入高于平均收入” 输入:“利润的平均值是多少”输出:“利润的平均值是多少”

如果你只是想删除与这个名词有关的任何描述性元素,我就不得不问更多关于你的问题。你的例子都以一个名词结尾,这似乎就是你所关注的名词。该代码将处理的所有句子都是这种情况吗?如果是这样的话,你可能会考虑向后重复你的句子。你可以很容易地识别这个名词。当你一步一步地看这个名词是否有一个限定词(a,an,the)和标记“DT”,因为你不想从我看到的东西中去掉它。你继续一步一步地删除所有内容,直到找到一个形容词或另一个名词。我不知道你在这一条上删除单词的实际规则是什么,但反向操作可能会有所帮助

编辑:

我对此进行了一些修改,并使下面的代码完全按照您希望的方式在输出上工作。如果有其他语音标记需要停止,则可以在“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)

`

我想我理解你想要实现的目标,但你有什么问题?我已经运行了您的代码,它在删除形容词方面似乎非常有效

不过有几件事让我很反感。对于下面的输入/输出,您可以期望删除单词“more”,因为它是一个带有标记“JJR”的形容词。你的帖子表明你并不期望它被删除

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

另外,我不知道你为什么希望在下面的输入/输出中删除“mean”这个词,因为它不是一个形容词

输入:“利润的平均值是多少”输出:“利润是多少”

检查句子的好地方是

下面是您的实际输出,正确地删除了形容词,它似乎正在这样做

输入:“谁的收入最高”输出:“谁的收入最高” 输入:“谁的收入高于平均收入”输出:“谁的收入高于平均收入” 输入:“利润的平均值是多少”输出:“利润的平均值是多少”

如果你只是想删除与这个名词有关的任何描述性元素,我就不得不问更多关于你的问题。你的例子都以一个名词结尾,这似乎就是你所关注的名词。该代码将处理的所有句子都是这种情况吗?如果是这样的话,你可能会考虑向后重复你的句子。你可以很容易地识别这个名词。当你一步一步地看这个名词是否有一个限定词(a,an,the)和标记“DT”,因为你不想从我看到的东西中去掉它。你继续一步一步地删除所有内容,直到找到一个形容词或另一个名词。我不知道你在这一条上删除单词的实际规则是什么,但反向操作可能会有所帮助

编辑:

我对此进行了一些修改,并使下面的代码完全按照您希望的方式在输出上工作。如果有其他语音标记需要停止,则可以在“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)

`

嗨,这正是我要找的。我真的很感激。再次感谢!嗨,这正是我要找的。我真的很感激。再次感谢!