我有一个列表,其中包含单词' Good' (此列表在此缩短)
good_synonym = ['Good','good','Well','well']
该程序询问用户的感受
print = 'Hello, ' + name + ', How are you?'
status = raw_input('')
但有时候,用户可能会回答问题"我很好" (或类似的)
如果答案中包含好同义词列表中的单词,我希望程序回复
if status contains a word in good_synonym:
print ('That is good')
else:
print ('That is not so good')
但我不知道用哪个词来做行动。
答案 0 :(得分:7)
使用set objects代替带有大小写混合的单词的列表;集合使会员测试和交叉点测试更容易。仅存储小写文本,并简单地小写输入字符串:
good_synonym = {'good', 'well'}
# good_synonym = set(['good', 'well']) # Python 2.6
现在测试输入字符串(小写并在空格上拆分)是否为disjoint set set.isdisjoint()
。如果它不是一个不相交的集合,则两个集合之间存在重叠,这意味着至少存在'good'
或'well'
:
if not good_synonym.isdisjoint(status.lower().split()):
print ('That is good')
else:
print ('That is not so good')
测试集合是否不相交是有效的;它只需要测试单词,直到good_synonym
集中的第一个单词快速返回False
。您可以改为计算交叉点,但是这将始终测试状态中的所有字以构建新的集合对象。
您可能已经看过的其他解决方案,请使用any()
function;给定一个generator expression它也可以有效,因为如果任何输出为真,它会提前返回True
:
if any(word in good_synonym for word in status.lower().split()):
然而,这在Python代码中进行了所有循环和测试,而set.isdisjoint()
完全用C代码实现。
答案 1 :(得分:1)
有很多方法可以尝试这样做。既然你是一个初学者,那就让我们去做一些有用的事情 - 效率不应该是你的首要考虑因素。
status = status.split() # breaks response into words
if any(s in good_synonyms for s in status):
print('That is good')
当然,它不会阻止你的程序表现得好像“不好”是一个值得快乐回答的回复,但这是一个编程网站。
答案 2 :(得分:0)
简单!
我们可以遍历good_synonyms列表并检查输入字符串中是否存在它们的任何。
if any(synonym in status for synonym in good_synonyms):
print('That is good')
else:
print('That is not so good')
PS:为了节省内存,您可以将同义词仅以小写形式存储为['good','well'],当您检查这些是否在'status'变量中时,您可以只应用它上面的.lower()只是将整个字符串转换为小写字母,如下所示:
good_synonyms = ['good', 'well']
if any(synonym in status.lower() for synonym in good_synonyms):
print('That is good')
希望这有帮助!
注意:holdenweb的答案也有效,但实际上并不需要对状态应用拆分功能,因为您可以检查字符串中是否存在单词(前提是字符串中的单词是分开的通过空格)或不使用上述'in'关键字。
答案 3 :(得分:-1)
这是一个NLP问题,以下代码是检测同义词的简单版本:
def is_contains_synonym(sentence, synonym):
token = sentence.split(' ')
return len(filter(lambda x: x in synonym, token)) > 0
if is_contains_synonym(status, good_synonym):
print ('That is good')
else:
print ('That is not so good')
答案 4 :(得分:-1)
一个简单而简单的解决方案是使用正则表达式进行模式匹配,如下所示:
import re
line = "it is good"
good_synonyms = ["good","well"]
line = line.lower()
if any(re.search(synonym,line) for synonym in good_synonyms):
print "That is good"
else:
print "nope"
search
的{{1}}函数在字符串中的任何位置查找模式的匹配,并返回一个布尔值,然后可以在带有re
的if语句中使用