优化搜索两个字符串中的关键字

时间:2014-05-27 20:36:45

标签: java regex algorithm semantics semantic-analysis

我有两个字符串,我正在检查两个字符串中的特定常用字。我已经有了语义分数;在这种情况下无关紧要,因为这些词是技术缩写并且特别强调。他们拥有的常用词汇越多,得分越高,越接近。

有很多方法可以解决这个问题。到目前为止,我已经想到了两个。

1)我用字符串的单词创建两个ArrayList。如果它们存在于ArrayList中,我需要搜索另一组单词。如果他们这样做,我给他们+1分。

然后我可以有多个条件,比如

 if((firstString.contains(keyWord)) && (secondString.contains(keyWord)))
  then +1
 if((firstString.contains(anotherKeyWord)) && (secondString.contains(anotherKeyWord)))
  then +1

2 - ;取两个字符串并使用

进行正则表达式搜索
if firstString.("(.*)someExpression(.*)")) && secondString.("(.*)someExpression(.*)"))
then +1
if firstString.("(.*)someOtherExpression(.*)")) && secondString.("(.*)someOtherExpression(.*)"))
then +1

还有其他更好的方法吗?我现在更倾向于使用正则表达式。这看起来非常有效。

基本上我正在做的是我试图通过将句子与“ACLS”,“ASHD”,“CXR”(普通医学术语)等缩写分组来聚类相似的句子,因为我知道这些句子主要讨论这些问题。然后我得到语义分数,将那些包含这些单词的句子分组。错误的方法:/?

谢谢:)

2 个答案:

答案 0 :(得分:1)

如果只有几个字要检查,我会坚持使用String.contains(),因为它易于实现。

如果要检查的单词很多,则Aho-CorasickRabin-Karp等字符串搜索算法会很方便。

答案 1 :(得分:0)

这实际上取决于您希望算法的效率。如果我要从您目前建议的两种不同方法中进行选择,我会选择简单的contains()检查。正则表达式适用于模式与变体的匹配。对于你在这里的精确匹配场景,它们有点过分。在最好的情况下,编译所有不同正则表达式所需的时间将使它们比简单的contains()方法慢。

然而,有更快的方法。例如,您可以将每个字符串拆分为包含的单词,并将它们添加到哈希集(基本上是一个实现为哈希表的集合)。然后你将使用hashset的交叉操作(最坏情况为O(n))来获得常用词。这也是一个哈希集。然后检查是否可以在已知单词列表中找到这些常用单词(也可以是哈希表)并增加分数。使用这种方法,您可以跳过所提议方法的所有字符串匹配。