0

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

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

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”(常用医学术语)进行分组来聚类相似的句子,因为我知道这些句子主要讨论这些问题。然后我得到语义分数来对包含这些单词的句子进行分组。错误的方法:/?

谢谢 :)

4

2 回答 2

1

如果只需要检查几个单词,我会坚持使用,String.contains()因为它可读且易于实现。

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

于 2014-05-27T20:43:50.030 回答
0

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

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

于 2014-05-27T21:06:23.957 回答