当前位置: 首页 > 知识库问答 >
问题:

从长文本中删除/替换子字符串的最快方法[重复]

秦宏盛
2023-03-14

我有一个大型语料库,我想从中删除某些单词。类似于从文本中删除停顿词,但我现在想从语料库中删除bigram。我有我的bigram列表,但显然删除停顿词的简单列表理解方法不会削减它。我在考虑使用正则表达式并从单词列表中编译一个模式,然后替换单词。这是一些示例代码:

txt = 'He was the type of guy who liked Christmas lights on his house in the middle of July. He picked up trash in his spare time to dump in his neighbors yard. If eating three-egg omelets causes weight-gain, budgie eggs are a good substitute. We should play with legos at camp. She cried diamonds. She had some amazing news to share but nobody to share it with. He decided water-skiing on a frozen lake wasn’t a good idea. His eyes met mine on the street. When he asked her favorite number, she answered without hesitation that it was diamonds. She is never happy until she finds something to be unhappy about; then, she is overjoyed.'

--

import re
words_to_remove = ['this is', 'We should', 'Christmas lights']
pattrn = re.compile(r' | '.join(words_to_remove))
pattrn.sub(' ',txt)

%timeit pattrn.sub(' ',txt)

--

timeit 1: 9.18 µs ± 11.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

有没有更快的方法让我删除这些二元模型?实际语料库的len是556,694,135个字符,二元模型的数量是3,205,182,这在实际数据集上执行时非常慢。

共有1个答案

郑胡媚
2023-03-14

您可以重写您的正则表达式,使其具有trie结构(使用< code>w(or(d|se)|ild)代替< code>word|worse|wild),或者更好的是,放弃正则表达式,使用Aho–Cora sick算法。当然,你可以为此使用一个库,比如FlashText(它是Aho-Corasick的精简版本,专门用于搜索和替换整个单词,就像你的情况一样)。

FlashText的作者声称»Regex需要5天才能运行。因此,我构建了一个工具,它在15分钟内完成。«

 类似资料:
  • 问题内容: 如何使用Python从字符串中删除重复的字符?例如,假设我有一个字符串: 如何制作字符串: 我是python的新手,我已经很累了,它正在工作。我知道有一种最佳的聪明方法。只有经验可以证明这一点。 注意:顺序很重要,这个问题是不是类似于此一个。 问题答案: 使用:

  • 字符串userKeyword来自用户键盘输入-我已经尝试编写一个方法来返回这个删除重复字符的字符串。 通过在while循环中移动新字符赋值,我现在得到的输出与PLAIN_ALPHA相同,而不是userKeyword,并省略了重复项。我做错了什么?

  • 我有一个字符串我想删除字符串中子字符串的所有实例,返回字符串并完成删除。 最终结果是: 在Swift 3.0+中,我将如何做到这一点?

  • 本文向大家介绍C#删除字符串中重复字符的方法,包括了C#删除字符串中重复字符的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#删除字符串中重复字符的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 用JavaScript替换字符串中所有字符串/字符实例的最快方法是什么?A ,- 循环,正则表达式? 问题答案: 最简单的方法是使用带有flag 的正则表达式替换所有实例: 这将替换所有出现的与字符串中。如果只有一个字符串,则可以将其转换为RegExp对象,如下所示:

  • 我用的是c#,我有一个字符串 我只是想删除任何领先的特殊字符,直到字母表来,注意:字符串中间的特殊字符将保持不变。最快的方法是什么?