给定一个句子列表,找到两个具有最多常用词的句子。 常用词不需要位于句子中的相同位置(顺序无关紧要)。
谢谢!
更新
是否存在针对此问题的非成对算法?因为成对非常简单。
我的想法是使用倒排索引来存储这个单词出现的位置。这需要遍历每个句子中的每个单词。然后创建一个n * n 2D数组,用于计算两个句子在倒排索引中出现在同一个桶中的次数。
答案 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++) {
}
}
在循环内部,您将调用您的函数,该函数使用索引i
和j
处的句子计算共同的单词数。您将跟踪到目前为止看到的最常见的单词数,以及发现它的两个单词。如果一个新句子具有更多共同的单词,您将存储该计数和产生该计数的两个句子。最后,你将拥有你想要的两个句子。