我试图创建一个方法,可以检查给定的短语是否与短语列表中的至少一个项匹配并返回它们。输入是短语,短语列表和同义词列表的字典。关键是要使它具有普遍性。
以下是示例:
phrase = 'This is a little house'
dictSyns = {'little':['small','tiny','little'],
'house':['cottage','house']}
listPhrases = ['This is a tiny house','This is a small cottage','This is a small building','I need advice']
我可以创建一个代码,可以在这个返回bool的示例中执行此操作:
if any('This'+' '+'is'+' '+'a'+x+' '+y == phrase for x in dictSyns['little'] for y in dictSyns['house']):
print 'match'
第一点是我必须创建通用的功能(取决于结果)。第二个是我希望这个函数返回匹配短语的列表。
您能否告诉我如何做到这一点,以便在这种情况下该方法返回['This is a tiny house','This is a small cottage']
?
输出如下:
>>> getMatches(phrase, dictSyns, listPhrases)
['This is a tiny house','This is a small cottage']
答案 0 :(得分:2)
我会按如下方式处理:
import itertools
def new_phrases(phrase, syns):
"""Generate new phrases from a base phrase and synonyms."""
words = [syns.get(word, [word]) for word in phrase.split(' ')]
for t in itertools.product(*words):
yield ' '.join(t)
def get_matches(phrase, syns, phrases):
"""Generate acceptable new phrases based on a whitelist."""
phrases = set(phrases)
for new_phrase in new_phrases(phrase, syns):
if new_phrase in phrases:
yield new_phrase
代码的根目录是words
中new_phrases
的分配,它将phrase
和syns
转换为更有用的形式,每个元素都有一个列表是该词的可接受选择列表:
>>> [syns.get(word, [word]) for word in phrase.split(' ')]
[['This'], ['is'], ['a'], ['small', 'tiny', 'little'], ['cottage', 'house']]
请注意以下事项:
set
提高效率(O(1)
,与O(n)
进行列表)会员资格测试; itertools.product
根据phrase
生成syns
的可能组合(您也可以使用itertools.ifilter
执行此操作);和使用中:
>>> list(get_matches(phrase, syns, phrases))
['This is a small cottage', 'This is a tiny house']
要考虑的事情:
"House of Commons"
应如何对待?)答案 1 :(得分:0)
我这样做了:
for value in dictSyns:
phrase = phrase + dictSyns[value]
for each_phrase in listPhrases:
if any(word not in phrase for word in each_phrase.split()):
pass
else:
print each_phrase
可能效率不高。它创建了一个可接受的单词列表。然后它会将每个字符串中的每个单词与该列表进行比较,如果没有不可接受的单词,则会打印该短语。
编辑:我也意识到这并没有检查语法意义。例如,短语'一点点这个'仍然会返回正确的。它只是检查每个单词。我会把它留在这里显示我的耻辱。