如何找到两个常用词数最多的句子?

时间:2014-02-10 18:13:54

标签: algorithm

给定一个句子列表,找到两个具有最多常用词的句子。 常用词不需要位于句子中的相同位置(顺序无关紧要)。

谢谢!

更新

是否存在针对此问题的非成对算法?因为成对非常简单。

我的想法是使用倒排索引来存储这个单词出现的位置。这需要遍历每个句子中的每个单词。然后创建一个n * n 2D数组,用于计算两个句子在倒排索引中出现在同一个桶中的次数。

2 个答案:

答案 0 :(得分:1)

假设你有一系列句子:

String[] sentences

创建一些包含默认值的变量,以跟踪最常用单词的两个句子

sentence1Index = -1
sentence2Index = -1
maxCount = -1

对句子数组执行嵌套循环

for i : 0 -> sentences.length
    for j : 0 -> sentences.length

确保您没有查看相同的句子

  if i != j

用空格分割字符串(假设你将一些符号作为单词计算,通常会给你每个单词)

  String[] words1 = sentences[i].splitAt(" ")
  String[] words2 = sentences[j].splitAt(" ")

为此次运行创建临时计数值

  tempCount = 0

在两个单词数组之间循环(从你正在比较的两个句子中得到)

  for a : 0 -> words1 .length
      for b : 0 -> words2.length

如果单词相同,则增加临时计数

          if words[a] equal-to-ignore-case words[b]
              tempCount++

完成比较单词后,如果tempCount大于当前的maxCount,请更新跟踪您正在寻找的所有值

  if tempCount > maxCount
      sentence1Index = i
      sentence2Index = j
      maxCount = tempCount

返回新创建的两个句子

的数组
if sentence1Index != -1 and sentence2Index  != -1
    String[] retArray =   sentences[sentence1Index], sentences[sentence2Index ]
    return retArray

return null

所有伪代码:

String[] sentences
sentence1Index = -1
sentence2Index = -1
maxCount = -1

for i : 0 -> sentences.length
    for j : 0 -> sentences.length
      if i != j
          String[] words1 = sentences[i].splitAt(" ")
          String[] words2 = sentences[j].splitAt(" ")
          tempCount = 0
          for a : 0 -> words1 .length
              for b : 0 -> words2.length
                  if words[a] equal-to-ignore-case words[b]
                      tempCount++
          if tempCount > maxCount
              sentence1Index = i
              sentence2Index = j
              maxCount = tempCount

if sentence1Index != -1 and sentence2Index  != -1
    String[] retArray =   sentences[sentence1Index], sentences[sentence2Index ]
    return retArray

return null

答案 1 :(得分:0)

首先,您需要一种方法,该方法将采用两个句子并确定它们共有多少个单词。这可以通过将两个句子作为输入给出,并从中创建两个包含按字母顺序排列的单词的数组。然后你可以检查两个数组,向前推进前面按字母顺序排列的任何数组(所以如果当前的匹配是“算盘”和“书”,你会将“算盘”移到下一个单词)。如果您有匹配(“book”和“book”),则增加匹配单词的数量,并将两个数组移动到下一个单词。你继续这样做,直到你到达其中一个数组的末尾(因为另一个数组中的其余单词不会有任何匹配)。

实现此算法后,您将需要一个如下所示的循环:

for (i = 0; i < sentenceCount - 1; i++) {
    for (j = i+1; j < sentenceCount; j++) {
    }
}

在循环内部,您将调用您的函数,该函数使用索引ij处的句子计算共同的单词数。您将跟踪到目前为止看到的最常见的单词数,以及发现它的两个单词。如果一个新句子具有更多共同的单词,您将存储该计数和产生该计数的两个句子。最后,你将拥有你想要的两个句子。