在大量句子中查找 n 元语法频率

Jas*_*son 5 javascript algorithm substring string-matching

我有一组短信。让我们打电话给他们吧m1, m2, ....。消息的最大数量如下1,000,000。每条消息1024的长度都低于字符,并且全部为小写。我们还可以选择一个 n-gram s1

我需要从所有这些消息中找到所有可能的子字符串的频率。例如,假设我们只有两条消息:

m1 = a cat in a cage
m2 = a bird in a cage
Run Code Online (Sandbox Code Playgroud)

这两条消息中某些 n 元语法的频率:

'a' = 4
'in a cage' = 2
'a bird' = 1
'a cat' = 1
...
Run Code Online (Sandbox Code Playgroud)

请注意,由于in = 2、 、in a = 2a cage = 2是 和 的子集in a cage = 2,并且具有相同的频率,因此不应列出它们。只取最长的、频率最高的;遵循以下条件:最长的 sn-gram 最多由 8 个单词组成,总字符数低于 30。如果 n-gram 超过此限制,则可以将其分解为两个或多个 n-gram 并单独列出。

我需要为所有这些文本消息找到这样的 n 元语法,并按出现次数降序对它们进行排序。

我该如何解决这个问题?我需要一个 JavaScript 解决方案。

PS:我需要帮助,但不知道去哪里问这个。如果问题不是针对此网站的,那么我应该将其发布到哪里?请在这里指导这个新手。

Red*_*edu 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
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height : 100% !important
                    }
Run Code Online (Sandbox Code Playgroud)