我有大约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个以上可能很可行。”
嗯,我的句子是巨大的字符串。我的问题不同。
答案 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])
我提供了一个有关其工作原理的示例。将列表转换为集合将有利于查找时间,然后查看集合中的任何项目是否出现在列字符串中。结果将是与名称集匹配的项目列表。