我有一套预定义的词语,如谋杀,犯罪,军官,抢劫,罪犯,事故,事故,撞车,遇难......(约5000字)
我想在新闻文章(大约1kb-5kb文本)中匹配这些单词,如果找到,则相应地对这些单词进行分类。最初我只是在单词之前和之后使用空格,即
if(article.contains(" "+word+" ")) { \*do something*\ }
但是,当单词后跟全句,逗号或其他符号时,这不起作用,同样适用于单词的开头
所以我切换到带有字边界的正则表达式,但现在代码运行速度慢了20倍,CPU使用率在5个线程中达到100%。
有没有人在java中有更好的解决方案?所有的帮助表示赞赏:)
答案 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
无论如何,我认为你的第一步应该是研究现有的全文搜索库,这可能会更加高效地解决你的问题。