如何去掉名词前的形容词或定语?
How to remove adjectives or attributive before noun?
目前我正在使用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)
但是我需要的和这个不一样。以下是一些示例:
输入:“谁的收入最高” 输出:“谁的收入高”
输入:“谁的收入高于平均水平”输出:“谁的收入高于平均水平”
输入:“利润的均值是多少”输出:“利润是多少”
谁能给我一些建议?提前谢谢大家。
我想我理解你想要达到的目标,但你遇到了什么问题?我已经 运行 你的代码,它似乎可以完美地删除形容词。
虽然有几件事让我失望了。对于下面的 input/output,您可以预期 'more' 这个词会被删除,因为它是一个带有标记 'JJR' 的形容词。您的 post 表明您没有预料到它会被删除。
输入:“谁的收入高于平均水平”输出:“谁的收入高于平均水平”
此外,我不确定为什么您希望在下面 input/output 中删除 'mean' 这个词,因为它不是形容词。
输入:“利润的均值是多少”输出:“利润是多少”
检查句子的好地方是 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)
`
目前我正在使用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)
但是我需要的和这个不一样。以下是一些示例:
输入:“谁的收入最高” 输出:“谁的收入高”
输入:“谁的收入高于平均水平”输出:“谁的收入高于平均水平”
输入:“利润的均值是多少”输出:“利润是多少”
谁能给我一些建议?提前谢谢大家。
我想我理解你想要达到的目标,但你遇到了什么问题?我已经 运行 你的代码,它似乎可以完美地删除形容词。
虽然有几件事让我失望了。对于下面的 input/output,您可以预期 'more' 这个词会被删除,因为它是一个带有标记 'JJR' 的形容词。您的 post 表明您没有预料到它会被删除。
输入:“谁的收入高于平均水平”输出:“谁的收入高于平均水平”
此外,我不确定为什么您希望在下面 input/output 中删除 'mean' 这个词,因为它不是形容词。
输入:“利润的均值是多少”输出:“利润是多少”
检查句子的好地方是 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)
`