我有一组短信。让我们称它们为m1, m2, ....
。邮件的最大数量低于1,000,000
。每封邮件的长度均小于1024
个字符,且均小写。我们还选择一个n元语法s1
。
我需要从所有这些消息中找到所有可能的子字符串的频率。例如,假设我们只有两条消息:
m1 = a cat in a cage
m2 = a bird in a cage
这两条消息中某些n-gram的频率:
'a' = 4
'in a cage' = 2
'a bird' = 1
'a cat' = 1
...
请注意,由于in = 2
,in a = 2
和a cage = 2
是in a cage = 2
的子集,并且具有相同的频率,因此不应列出它们。只选择频率最高的最长的一个;请遵循以下条件:最长的sn-gram最多包含8个单词,总字符数少于30。如果一个n-gram超过此限制,则可以将其分解为两个或更多的n-gram并单独列出。 / p>
我需要为所有这些文本消息找到这样的n-gram,并按它们出现的次数降序对其进行排序。
我该如何解决这个问题?我需要使用javascript的解决方案。
PS:我需要帮助,但不知道该向哪里询问。如果有问题 不适用于此站点,那么我应该在哪里发布它?请指导 新手。
答案 0 :(得分:1)
也许您可以采用以下方法。一有时间,我将编辑添加解释。
var subSentences = (w,...ws) => ws.length ? ws.reduce((r,s) => (r.push(r[r.length-1] + ` ${s}`), r),[w])
.concat(subSentences(...ws))
: [w],
frequencyMap = sss => sss.reduce((map,ss) => subSentences(...ss.split(/\s+/)).reduce((m,s) => m.set(s, m.get(s) + 1 || 1), map), new Map());
frequencies = frequencyMap(["this is a test string",
"this is another one",
"yet another one is here"]);
console.log(...frequencies.entries()); // logging map object seems not possible hence entries
.as-console-wrapper { max-height : 100% !important
}