在字符串中高效匹配单词的方式是什么?

0 投票
4 回答
12391 浏览
提问于 2025-04-17 05:22

举个例子:

names = ['James John', 'Robert David', 'Paul' ... the list has 5K items]

text1 = 'I saw James today'
text2 = 'I saw James John today'
text3 = 'I met Paul'

is_name_in_text(text1,names)   # this returns false 'James' in not in list
is_name_in_text(text2,names)   # this returns 'James John'
is_name_in_text(text3,names)   # this return 'Paul'

is_name_in_text() 这个函数的作用是检查名字列表中的任何一个名字是否出现在文本中。

最简单的方法就是用 in 操作符直接检查名字是否在列表里,但因为这个列表有5000个项目,所以这样做效率不高。我可以把文本拆分成单词,然后检查这些单词是否在列表中,但如果有多个单词匹配,这样的方法就不行了。第7行在这种情况下会出错。

4 个回答

1

你可以使用Python中的集合(set),这样在使用'in'这个操作符时,性能会更好。

2

构建一个包含所有选择的正则表达式。这样你就不需要提前担心如何从短语中提取出名字了。

import re
names_re = re.compile(r'\b' +
                      r'\b|\b'.join(re.escape(name) for name in names) +
                      r'\b')

print names_re.search('I saw James today')
5

names 转换成一个 集合,这样可以用 in 操作符快速查找,速度是 O(1)。

你可以用正则表达式来从一句话中提取出可能的名字:

>>> import re
>>> findnames = re.compile(r'([A-Z]\w*(?:\s[A-Z]\w*)?)')
>>> def is_name_in_text(text, names):
        for possible_name in set(findnames.findall(text)):
            if possible_name in names:
                return possible_name
        return False

>>> names = set(['James John', 'Robert David', 'Paul'])
>>> is_name_in_text('I saw James today', names)
False
>>> is_name_in_text('I saw James John today', names)
'James John'
>>> is_name_in_text('I met Paul', names)
'Paul'

撰写回答