从字符串列表中提取列匹配中所有匹配的更快方法

时间:2018-10-22 18:48:11

标签: python regex string pandas

场景

我有大约225k个短语的列表

nameslist = ['foo corp', 'baz.indus3ies', 'biz-inc 2011 (and 2017)', 
...] 

我还有一个pd.DataFrame列,其中每个条目最多包含数千个字符串ch ,例如

"words some gibberesh, some coptic lettering baz.indus3ies and biz-inc 2011 (and 2017) blah blah blah. CRASD#$%ONSDF some words and some not words
a;lkjfisdij
some new paras without punction

yougettheidea"

目标

我正在尝试编写一个新列,以显示所有与段落的每个条目完全匹配的短语

我尝试了

nameslist = list(supnames['Glb Supp Name'].str.lower())
safenames = [re.escape(name) for name in nameslist]
names_re = re.compile("|".join(safenames))
names_re = re.compile("|".join(safenames), re.MULTILINE | re.I) # tried this too

df['matches'] = df['ocr_text'].apply(lambda x: re.findall(names_re, x))

这可能有效,但是已经运行了几个小时,并且仅使用40%的内存和40%的CPU,因此效率不是很高

注意自此,我已经完成了几次交互。它们都非常慢,并且大多数都无法匹配短语,而只能匹配“词组”是单个单词的示例。

我也尝试过

bigtest = df['ocr_text'].str.extract(names_re)

这似乎更可笑,但我得到以下回溯:

 ValueError: pattern contains no capture groups

但是,我不想将df扩展到225k列。所以我知道这不是我想要的。

是否有更快的方法来做我正在做的事情? 有没有办法确保我的多词短语始终匹配

不是重复的

这不是另一个问题的重复。我不是要匹配句子中的单词。我正在尝试将20,000k的短语列表(而不是单词)与20k页的文本列表进行匹配。 在理论下,对该问题的最高评价是:“如果句子不是笨拙的字符串,每秒处理50个以上可能很可行。”

嗯,我的句子是巨大的字符串。我的问题不同。

1 个答案:

答案 0 :(得分:1)

您可以尝试:

nameslist = ['foo corp', 'baz.indus3ies', 'biz-inc 2011 (and 2017).pdfs']
names = set(nameslist)
s = 'some random word baz.indus3ies foo corp bla'
print([i for i in names if i in s])

#your example
df['matches'] = df['ocr_text'].apply(lambda x: [i for i in names if i in x])

我提供了一个有关其工作原理的示例。将列表转换为集合将有利于查找时间,然后查看集合中的任何项目是否出现在列字符串中。结果将是与名称集匹配的项目列表。