我尝试制作一些lambda表达式。没有任何错误。但它没有正常工作。以下是我的代码。
from nltk.tokenize import word_tokenize
list1 = 'gain, archive, win, success'.split(',')
list2 = 'miss, loss, gone, give up'.split(',')
def classify(s, rls):
for (f, emotion) in rls:
if f(s):
return emotion
return "another"
rules = [(lambda x: (i for i, j in zip(word_tokenize(x),list2) if i == j) != [], "sad"),
(lambda x: (a for a, b in zip(word_tokenize(x),list1) if a == b) != [], "happy"),]
print classify("I win the game", rules)
print classify("I miss you", rules)
输出
sad
sad
我不知道我的代码有什么问题。有人可以帮助我!
答案 0 :(得分:2)
Zip遍历列表" 并行",因此它返回一个元组列表,其中第i个元组包含来自每个元组的第i个元素参数序列或迭代。返回的列表的长度被截断为最短参数序列的长度。 (source)
所以你试图检查句子的第i个单词是否与第i个情绪单词相匹配,我想这不是你想要的。另外,如@ juanpa.arrivillaga所述,您正在检查生成器是否等于空的列表,它总是True
,原因很简单生成器不是列表,与其内容无关
你想要的是检查句子中的任何单词是否在情绪列表中。
尝试更改:
lambda x: (i for i, j in zip(word_tokenize(x),list2) if i == j) != []
为:
lambda x: any(word in list2 for word in word_tokenize(x))
总的来说,你定义这样的规则:
rules = [(lambda x: any(word in list2 for word in word_tokenize(x)), "sad"),
(lambda x: any(word in list1 for word in word_tokenize(x)), "happy")]
此外,情绪列表中的单词中有空格可能会导致比较失败。 按如下方式重新定义:
list1 = 'gain,archive,win,success'.split(',')
list2 = 'miss,loss,gone,give up'.split(',')
或者甚至更好地使用strip从单词的开头和结尾删除空格,作为处理字符串时的一般好习惯。