1
15
迭代替换单词将是实现中的最大瓶颈。 在每次迭代中,您必须扫描整个字符串以查找停止字,然后replace操作必须分配一个新字符串并用替换后的文本填充它。不会很快的。
将输入内容分成单独的单词,用适当的空格或分隔符分隔。您可以增量地执行此操作,这样就不需要分配任何额外的内存来执行此操作。对于每个单词(标记),现在可以在stopwords的hashset中执行查找-如果找到匹配项,则在将最终文本流式输出到单独的
下面是一个我希望表现更好的方法。而不是完全流式传输(它使用
下面的代码返回一个单词列表,其中不包括结果中的所有停止词和两个字母或更短的单词。它还对停止词使用不区分大小写的比较。
|
2
3
最后,多亏了你们,我的文本预处理得到了更好的优化。首先,我从我的问题(按照乔希·凯利的回答)中简化了这个冗长的表达: [0-9]|[^\w]|(\b\w{1,2}\b) 它和第一个一样,但是非常简单。然后再次遵循Josh Kelley的建议,我将这个正则表达式放入汇编。我发现了一个将表达式编译成汇编的好例子 here . 我这么做了,因为这个正则表达式被使用了很多次。在讲了几篇关于编译正则表达式的文章之后,这是我的决定。我删除了结束语后的最后一个表达式(没有真正的意义)。 因此,在12KiB文本文件上的执行时间是~15ms。这仅适用于上述表达式。
一个大正则表达式
String.Replace()
林克LBushkin提出的方法。没什么好说的了。 我只能说哇。只需比较第一个和最后一个的执行时间!非常感谢伊布什金! |
3
2
与其在循环中替换regex,为什么不动态构造一个匹配regex的怪物来匹配任何一个stopword,然后运行一个replace,将其替换为空?像这样的
|
4
1
加速你的正则表达式 你的正则表达式需要一些工作。 例如,该行:
使用括号捕获停止字以供以后使用,然后它就不会使用它。在这种情况下,也许.NET正则表达式引擎足够聪明,可以跳过捕获,也许不是。 这个正则表达式太复杂了:
最后,测试 compiling your regexes 减少正则表达式和字符串操作 构造一堆字符串,组成一堆Regex对象,然后丢弃它们,就像您在这个循环中所做的那样,可能不是很快:
尝试将stopwords预处理到Regex对象数组中,或者创建一个monster预编译Regex(正如其他人所建议的那样)。 重新构造算法 看起来您只对处理词干、非停止词、文本感兴趣,而不是标点符号、数字等。 为此,您的算法采用以下方法:
我开始在这里写另一种方法,但LBushkin打败了我。照他说的做。请记住,作为一般规则,更改算法通常比微优化(如提高regex使用率)带来更大的改进。 |
5
0
你呢 可以 会遇到 Schlemiel the Painter problem . 在C#(和其他语言)中,当附加或连接字符串时,实际上是在创建一个全新的字符串。在循环中这样做通常会导致大量的内存分配,而这是可以避免的。 |
6
0
我同意mquander的观点,这里有更多的信息。 每次使用正则表达式时,C#都会创建一个与文本匹配的表。如果只调用几次regex函数,这是很好的,但是您在这里要做的是创建大约270个新表,并为每个html文档销毁它们。
http://en.csharp-online.net/CSharp_Regular_Expression_Recipes%E2%80%94Compiling_Regular_Expressions 你应该看到一个戏剧性的加速就这样 |
lonix · 使用sed从JSON中提取非贪婪正则表达式 1 年前 |
Dima Malko · 如何在指定符号前添加符号? 2 年前 |
shekharsabale · 从列表元素捕获子字符串 2 年前 |
Katia · 根据特定规则进行多行匹配 2 年前 |
MHA · Pandas str.extract()以字母结尾的数字 2 年前 |
Slava Vir · 如何查找后面“/”之间的最后一组 2 年前 |