关于python:从字符串列表中提取列匹配中所有匹配项的更快方法

Faster way to extract all matches in column matches from list of strings

本问题已经有最佳答案,请猛点这里访问。

脚本

我有一个大约225K个短语的列表,比如

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

我还有一个pd.dataframe列,其中每个条目最多包含几千个字符串字符,比如

1
2
3
4
5
"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"

号目标

我正试图写一个新的专栏,展示每一个段落条目中所有精确的短语匹配。

我试过了

1
2
3
4
5
6
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,所以效率不是很高

注意,我已经完成了几个交互。所有这些都很慢,而且大多数都不匹配短语,而是只匹配"短语"是单个单词的示例。

我也试过了

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

这似乎更具亲和力,但我可以追溯到:

1
 ValueError: pattern contains no capture groups

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

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

不是复制品

这不是另一个问题的副本。我不想把句子中的词搭配起来。我正试图在一个225K的短语列表中匹配一个20K页的文本列表,而不是单词。在理论上,这个问题的最高投票答案是"如果你的句子不是冗长的字符串,那么每秒处理50多个句子可能是可行的。"

嗯,我的句子很冗长。我的问题不一样。


您可以尝试:

1
2
3
4
5
6
7
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])

我举了一个例子说明它是如何工作的。将列表转换为集合将有助于查找时间,然后查看集合中是否有任何项出现在列字符串中。结果将是与名称集匹配的项目列表。