如何在Python中制作高效的字符串过滤器?

时间:2018-09-07 05:50:43

标签: python string python-3.x search

我有两个列表对象:wiki_text和语料库。 wiki_text由小短语组成,而语料库由长句子组成。

wiki_text = ['never ending song of love - ns.jpg',
 'ecclesiological society',
 "1955-56 michigan wolverines men's basketball team",
 'sphinx strix',
 'petlas',
 '1966 mlb draft',
 ...]

corpus = ['Substantial progress has been made in the last twenty years',
          'Patients are at risk for prostate cancer.',...]

我的目标是创建一个过滤器,该过滤器可以过滤出wiki_text中的元素,该元素是语料库中元素的子字符串。例如,如果“教会社会”作为语料库中句子的一部分存在,则应保留在最终结果中。 最终结果应该是原始Wiki_text的子集。以下代码是我之前使用的代码:

def wiki_filter(wiki_text, corpus):
    result = []
    for i in wiki_text:
        for e in corpus:
            if i in e:
                result.append(i)
                break
    return result

但是,考虑到wiki_text和语料库的长度(每个> 1000万)。此功能耗时极长。有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:2)

让我们看看flashtext是否可以在这里提供帮助。

首先,pip install flashtext,然后构建一个KeywordProcessor对象并调用extract_keywords以过滤出您的字符串。

from flashtext import KeywordProcessor
keyword_processor = KeywordProcessor()
for w in wiki_text:
    keyword_processor.add_keyword(w)

filtered_corpus = [c for c in corpus if keyword_processor.extract_keywords(c)]

不幸的是,flashtext API尚没有“ has_keyword”方法,因此您需要测试extract_keywords返回的临时列表的真实性,然后将其丢弃它。如果您愿意的话,可以在GitHub上为该项目做贡献。

答案 1 :(得分:0)

要使其变得非常快,我建议您使用一种非传统的方法,即使用Lucene(如果被迫仅使用python,则使用PyLucene)。

  

Apache LuceneTM是一种高性能的全功能文本搜索   引擎库完全用Java编写。    PyLucene是用于访问Java LuceneTM的Python扩展。其目标   是允许您使用Lucene的文本索引和搜索   Python的功能。

这是我的处理方式: 索引语料库句子,每个句子在单独的记录中。然后使用Lucene的搜索功能,使用字符串查询在wiki_text中搜索每个短语。

现在,这种方法不是最简单,最直接的方法,但在我看来,它将是最快的方法之一。您可能会在几分钟内完成数百万个记录(语料库)中的数百万个搜索(wiki_text短语)。 因此,如果@coldspeed的FlashText解决方案满足您的需求,请继续尝试,否则,请尝试给Lucene!

答案 2 :(得分:0)

正则表达式引擎在这里如何工作?你可以尝试

import re
re.findall('|'.join(wiki_text),'\n'.join(corpus))