Java - 快速正则表达式,用于在文本中查找单词

时间:2017-01-26 16:35:55

标签: java regex optimization text

我有一套预定义的词语,如谋杀,犯罪,军官,抢劫,罪犯,事故,事故,撞车,遇难......(约5000字)

我想在新闻文章(大约1kb-5kb文本)中匹配这些单词,如果找到,则相应地对这些单词进行分类。最初我只是在单词之前和之后使用空格,即

if(article.contains(" "+word+" ")) { \*do something*\ }

但是,当单词后跟全句,逗号或其他符号时,这不起作用,同样适用于单词的开头

所以我切换到带有字边界的正则表达式,但现在代码运行速度慢了20倍,CPU使用率在5个线程中达到100%。

有没有人在java中有更好的解决方案?所有的帮助表示赞赏:)

2 个答案:

答案 0 :(得分:0)

你总是要检查这个单词中是否包含特殊符号,所以我建议使用\ W来调用replaceAll函数,以消除单词中任何额外的绒毛/符号(如果它存在的话)。

id

答案 1 :(得分:0)

我认为正则表达式不是处理搜索的最佳工具,但是如果你找不到更好的工具,你可以通过制作优化的正则表达式来赢得大量时间。如果你检查that test我只做了一些令牌和一个小搜索字符串,那么使用单一模式的搜索速度已经比使用多种模式的搜索快4倍。

现在很明显有5000个令牌,我不希望你手工生成和维护那个正则表达式,但是可以将令牌列表转换为前缀树,然后用它来制作正则表达式:

tokens : con, conman, constitution, correct, exact

tree :     ^
        c     e
        o     x
     n    r   a
  s  $ m  r   c
  t    a  e   t
  i    n  c   $
  t    $  t
[...]     $

regex : \\b(co(n(stitution|man)?|rrect)|exact)\\b

无论如何,我认为你的第一步应该是研究现有的全文搜索库,这可能会更加高效地解决你的问题。