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