ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

返回给定短语的匹配列表

2019-10-09 15:57:22  阅读:247  来源: 互联网

标签:synonym python nlp text-processing


我正在尝试一种方法,可以检查给定短语是否与短语列表中的至少一项匹配并返回它们.输入是短语,短语列表和同义词列表的字典.关键是要使其通用.

这是示例:

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'

第一点是我必须创建通用的函数(取决于结果).第二个是我希望此函数返回匹配短语的列表.

在这种情况下,您能否给我一个建议,使方法返回[‘这是一间小房子’,’这是一间小别墅’]?

输出如下:

>>> getMatches(phrase, dictSyns, listPhrases)
['This is a tiny house','This is a small cottage']

解决方法:

我将按以下方式进行处理:

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

代码的根本是单词的分配,形式为new_phrases,它将短语和syns转换为更可用的形式,其中每个元素都是该单词可接受选择的列表:

>>> [syns.get(word, [word]) for word in phrase.split(' ')]
[['This'], ['is'], ['a'], ['small', 'tiny', 'little'], ['cottage', 'house']]

请注意以下几点:

>使用生成器更有效地处理大量组合(而不是一次构建整个列表);
>使用一组进行有效的(成员为O(1),列表为O(n))成员资格测试;
>使用itertools.product来基于syns生成短语的可能组合(您也可以在实现中使用itertools.ifilter);和
>符合Style guide.

正在使用:

>>> list(get_matches(phrase, syns, phrases))
['This is a small cottage', 'This is a tiny house']

要考虑的事情:

>字符是什么情况(例如,如何处理“下议院”)?
>标点符号呢?

标签:synonym,python,nlp,text-processing
来源: https://codeday.me/bug/20191009/1880205.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有