【问题标题】:efficient method to replace multiple words in text替换文本中多个单词的有效方法
【发布时间】:2010-02-03 08:07:28
【问题描述】:

使用 JavaScript,我需要从 ~100000 个单词的文档中有效地删除 ~10000 个关键字,其中 ~1000 个将是关键字。你会建议什么方法?

大量正则表达式实用吗? 或者我应该只遍历文档字符来寻找关键字(无聊)?

编辑:
好点 - 只有整个单词,而不是部分。并且有些关键字包含空格。
我正在尝试在客户端完成所有操作以减轻后端的压力。

【问题讨论】:

  • 有趣的问题。一方面,用编译语言手写的状态机将击败正则表达式,但另一方面,Javascript 本身非常慢,因此您需要尝试基准测试正则表达式引擎是否由于被编译而更快.
  • 必须是 JavaScript 还是可以推送到服务器进行转换?如果没有一些数据进行测试,很难说哪个会更有效。例如,如果您使用的是 Python,则可以在确实需要时对数据进行分段并线程化处理。
  • 您是否也只需要替换整个单词或部分单词——例如单词、关键字、词干中都有单词“单词”,如何处理?

标签: javascript regex text performance


【解决方案1】:

使用正则表达式可能是一个不错的选择:

var words = ['bon', 'mad'];
'joe bon joe mad'.replace(new RegExp('(' + words.join('|') + ')', 'g'), '');
// 'joe  joe  '

正则表达式1 对于前瞻之类的东西并不是很复杂,而且正则表达式引擎是用 C/C++ 编写的,因此您可以期待它相当快。尽管如此 - 进行基准测试并查看性能是否符合您的需求。

我不认为实现自己的解析器会更快,但我可能错了 - 基准测试。

将文档发送到服务器对我来说听起来不太好。对于 100k 字,您正在查看兆字节范围内的有效负载,您仍然需要在服务器上对其进行处理并将其推回。


1您可能需要调整正则表达式来处理空格。

【讨论】:

  • 您可能想要添加字边界检查'\\b(' + words.join('|') + ')\\b'
  • 正则表达式可以使用一些爱,我同意,但它说明了这一点。
【解决方案2】:

我的直觉告诉我,对于这么多的关键字,对关键字进行排序和创建每个字符的状态机会比正则表达式快得多,因为状态机很简单,它可以自动生成。

【讨论】:

    【解决方案3】:

    状态机似乎经常用于类似的任务,例如http://www.codeproject.com/KB/string/civstringset.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      相关资源
      最近更新 更多