查找在多个句子中重复出现的三个最常见单词数组的算法
Algorithm for finding three most common word arrays being repeated in multiple sentences
我正在想出一些想法来制作一种算法,该算法可以在多个句子中找到 3 个最常用的词。那是什么意思?让我们看看下面的例子,假设我有 3 个句子,如下所示:
1. New Samsung Galaxy S7 Edge SM-G935FD Duos 12MP 4G (FACTORY UNLOCKED) 32GB Phone
2. Samsung Galaxy S7 32GB G930P (GSM Unlocked) 4G LTE 12MP Smartphone Black A
3. New Samsung Galaxy S7 SM-G930FD Duos 5.1'' 12MP (FACTORY UNLOCKED) 32GB Phone
算法确定最常见的 3 个词(彼此相邻)是:"Samsung galaxy S7"。
我的想法(我相信这是可以实现的最简单的想法)是从第一句话中取出前三个词,然后这样开始。例如:
第一个循环我得到这 3 个单词组合:New Samsung Galaxy
第二个循环我得到这 3 个单词组合(不包括句子中的第一个单词):Samsung galaxy S7...
以此类推,直到第一个句子(字符串)结束。
现在我要问你们的问题是:
- 这是像我上面提到的那样做的好方法吗?
- 是否有算法可以做同样的事情,但在时间因素出现问题时效率更高(即它们工作得更快)?
有人可以帮我解决这个问题吗?谢谢 ! :)
不,没有最快的方法,因为要在字符串数组中找到三个最常见的单词,您必须扫描行以检查可能的匹配项。
但有一个改进:如果这三个词在字符串中是唯一的(每个句子只有一个 Samsung Galaxy S7
)并且你想在找到第一个最常见单词的字符串后立即退出,你可以进行以下操作控制:
if(counter == array.length)
return mostCommonWords
这是因为如果这三个词出现在数组的所有字符串中,您就知道其他词组最多将具有相同的计数器。但此控件仅在每个句子的三个词都是唯一的并且您希望获得第一个最常见的出现时才有效
将 hashmap 与 arraylist 一起使用是合适的:
HashMap<String,ArrayList<Integer>> map = new HashMap<String,ArrayList<Integer>(NumOfSentences)>();
其中 String 存储 三词短语 ,Arraylist 存储每个 句子索引 .
对应的频率
注意:仅存储 count of occurrence
无济于事,因为最后您可能无法确定哪些句子中包含该短语。
在你的例子中,地图看起来像这样:
//...other Entries
{"Samsung Galaxy S7", {1, 1, 1}}
//...other Entries
你可以看到它有对应所有句子索引的频率。您需要找到数组列表的 最小值 并将其视为该短语的 总频率 。
如何决定最常见的 - 假设你在每个句子中添加了两次短语,那么地图将如下所示:
//...other Entries
{"Some-3-word-phrase-present-only-ONCE-in-each-sentence", {1, 1, 1}}
{"Some-3-word-phrase-present-TWICE-in-each-sentence", {2, 2, 2}}
//...other Entries
很明显,后一个会被认为是答案。
我正在想出一些想法来制作一种算法,该算法可以在多个句子中找到 3 个最常用的词。那是什么意思?让我们看看下面的例子,假设我有 3 个句子,如下所示:
1. New Samsung Galaxy S7 Edge SM-G935FD Duos 12MP 4G (FACTORY UNLOCKED) 32GB Phone
2. Samsung Galaxy S7 32GB G930P (GSM Unlocked) 4G LTE 12MP Smartphone Black A
3. New Samsung Galaxy S7 SM-G930FD Duos 5.1'' 12MP (FACTORY UNLOCKED) 32GB Phone
算法确定最常见的 3 个词(彼此相邻)是:"Samsung galaxy S7"。
我的想法(我相信这是可以实现的最简单的想法)是从第一句话中取出前三个词,然后这样开始。例如:
第一个循环我得到这 3 个单词组合:New Samsung Galaxy 第二个循环我得到这 3 个单词组合(不包括句子中的第一个单词):Samsung galaxy S7...
以此类推,直到第一个句子(字符串)结束。
现在我要问你们的问题是:
- 这是像我上面提到的那样做的好方法吗?
- 是否有算法可以做同样的事情,但在时间因素出现问题时效率更高(即它们工作得更快)?
有人可以帮我解决这个问题吗?谢谢 ! :)
不,没有最快的方法,因为要在字符串数组中找到三个最常见的单词,您必须扫描行以检查可能的匹配项。
但有一个改进:如果这三个词在字符串中是唯一的(每个句子只有一个 Samsung Galaxy S7
)并且你想在找到第一个最常见单词的字符串后立即退出,你可以进行以下操作控制:
if(counter == array.length)
return mostCommonWords
这是因为如果这三个词出现在数组的所有字符串中,您就知道其他词组最多将具有相同的计数器。但此控件仅在每个句子的三个词都是唯一的并且您希望获得第一个最常见的出现时才有效
将 hashmap 与 arraylist 一起使用是合适的:
HashMap<String,ArrayList<Integer>> map = new HashMap<String,ArrayList<Integer>(NumOfSentences)>();
其中 String 存储 三词短语 ,Arraylist 存储每个 句子索引 .
对应的频率注意:仅存储 count of occurrence
无济于事,因为最后您可能无法确定哪些句子中包含该短语。
在你的例子中,地图看起来像这样:
//...other Entries
{"Samsung Galaxy S7", {1, 1, 1}}
//...other Entries
你可以看到它有对应所有句子索引的频率。您需要找到数组列表的 最小值 并将其视为该短语的 总频率 。
如何决定最常见的 - 假设你在每个句子中添加了两次短语,那么地图将如下所示:
//...other Entries
{"Some-3-word-phrase-present-only-ONCE-in-each-sentence", {1, 1, 1}}
{"Some-3-word-phrase-present-TWICE-in-each-sentence", {2, 2, 2}}
//...other Entries
很明显,后一个会被认为是答案。