我有两个列表对象: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万)。此功能耗时极长。有没有更好的方法来解决这个问题?
答案 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))