正则表达式替换需要花费数百万个文档的时间,如何使其更快?

Vik*_*ngh 9 python parallel-processing cpython word2vec

我有这样的文件:

documents = [
    "I work on c programing.",
    "I work on c coding.",
]
Run Code Online (Sandbox Code Playgroud)

我有同义词文件,如:

synonyms = {
    "c programing": "c programing",
    "c coding": "c programing"
}
Run Code Online (Sandbox Code Playgroud)

我想替换我编写此代码的所有同义词:

# added code to pre-compile all regex to save compilation time. credits alec_djinn

compiled_dict = {}
for value in synonyms:
    compiled_dict[value] = re.compile(r'\b' + re.escape(value) + r'\b')

for doc in documents:
    document = doc
    for value in compiled_dict:
        lowercase = compiled_dict[value]
        document = lowercase.sub(synonyms[value], document)
    print(document)
Run Code Online (Sandbox Code Playgroud)

输出:

I work on c programing.
I work on c programing.
Run Code Online (Sandbox Code Playgroud)

但由于文档数量为几百万,同义词术语的数量为几十万,因此该代码完成的预计时间约为10天.

有更快的方法吗?

PS:用输出我想训练word2vec模型.

任何帮助是极大的赞赏.我正在考虑编写一些cpython代码并将其放在并行线程中.

wil*_*elm 17

我以前做过像这样的字符串替换工作,也用于在非常大的文本语料库上训练word2vec模型.当要替换的术语数量(您的"同义词术语")非常大时,使用Aho-Corasick算法进行字符串替换而不是循环遍历许多单个字符串替换是有意义的.您可以查看我的fsed实用程序(用Python编写),它可能对您有用.

  • 嘿,我尝试了Aho-Corasick Algo它创造了奇迹.谢谢.我还必须编写自己的实现https://github.com/vi3k6i5/synonym-extractor/ (16认同)