按给定的短语返回匹配列表

时间:2014-11-25 10:15:58

标签: python nlp text-processing synonym

我试图创建一个方法,可以检查给定的短语是否与短语列表中的至少一个项匹配并返回它们。输入是短语,短语列表和同义词列表的字典。关键是要使它具有普遍性。

以下是示例:

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']

2 个答案:

答案 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

代码的根目录是wordsnew_phrases的分配,它将phrasesyns转换为更有用的形式,每个元素都有一个列表是该词的可接受选择列表:

>>> [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执行此操作);和
  • Style guide合规。

使用中:

>>> 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

可能效率不高。它创建了一个可接受的单词列表。然后它会将每个字符串中的每个单词与该列表进行比较,如果没有不可接受的单词,则会打印该短语。

编辑:我也意识到这并没有检查语法意义。例如,短语'一点点这个'仍然会返回正确的。它只是检查每个单词。我会把它留在这里显示我的耻辱。