我有一个简单的python程序。
from nltk.tokenize import word_tokenize
negation ='no','not','never'.split(',')
list2 = 'miss,loss,gone,give up,lost'.split(',')
sentence = 'loss money'
if any(word in list2 for word in word_tokenize(sentence)) and (any(word in
list2 for word in word_tokenize(sentence))[-1:])not in negation :
print 'sad'
else:
print 'not sad'
这个错误是
TypeError: 'bool' object has no attribute '__getitem__'
我需要的是,我想检查句子中的任何单词是否在list2中。如果是,那么想要检查它之前的索引值是否在否定列表中。如果是,它应该是"不悲伤"。
举个例子"我想念他"应该伤心,"我不会想念他"应该不会伤心。
任何人都可以帮助我!
答案 0 :(得分:3)
对于初学者来说,你有很多问题:
'give up'
any()
永远不会被发现为句子中的标记。 listobj[-1:]
返回一个布尔值(参见this question)了解其工作原理。any()
返回列表的切片,只包含最后一个元素for index, value in enumerate(var):
last_word=var[index-1] if index > 0 else None
返回一个布尔值,您试图将布尔值视为容器。这就是造成您可以看到错误的原因。我建议你将问题分解为更合乎逻辑的步骤,而不是直接跳到列表推导/生成器中 如果你想根据其他人的位置访问列表中的项目,我建议从索引for循环开始:
def sad_sentence(sentence):
wordlist=sentence.split()
negations={'no','not','never'}
negphrases={'miss','loss','gone','give up','lost'}
for index, word in enumerate(wordlist):
last_word=wordlist[index-1] if index > 0 else None
if word in negphrases:
if last_word in negations:
print 'not sad'
else:
print 'sad'
break;
print 'not sad'
只进行一次单词标记化操作,无需一遍又一遍地进行。
示例解决方案:
>>> sad_sentence("I am not gone")
not sad
>>> sad_sentence("I am not here I am gone")
sad
>>>
这导致:
{{1}}
答案 1 :(得分:2)
你没有写好if
的第二部分。
首先看一下返回布尔值的any(word in list2 for word in word_tokenize(sentence))
。然后你尝试提取这个返回错误的布尔值([-1]
)的最后一个元素。
此处无需使用nltk
库,只需使用.split()
即可:
negation ='no,not,never'.split(',')
list2 = 'miss,loss,gone,give up,lost'.split(',')
def f(sentence):
if any(word in list2 for word in sentence.split()) and not any(word in negation for word in sentence.split()):
print 'sad'
else:
print 'not sad'
l = ['loss money', 'I miss him', 'I not miss him']
for e in l:
f(e)
# Outputs: sad / sad / not sad
编辑新版本要考虑@Baldrickk的好评。
我考虑了另外两个案例。它打印“快乐”#39;如果没有单词属于list2
。如果多个单词属于list2
,则会检查前一个单词,而不仅仅是第一个单词。
negation = {'no', 'not', 'never'}
list2 = {'miss', 'loss', 'gone', 'give up', 'lost'}
def f(sentence):
s = sentence.split()
l = [s.index(word) for word in s if word in list2]
# Will returns list of indices (of sentence) where word is in list2
if len(l) > 0:
for e in l:
# Check previous word
if s[e-1] not in negation:
print 'sad'
else:
print 'not sad'
else:
print 'happy'
l = ['loss money', 'I miss him', 'I not miss him', 'happy new year', 'I am not here I am gone']
for e in l:
f(e)
# sad / sad / not sad / happy / sad