【问题标题】:Finding n-gram frequencies in a large set of sentences在大量句子中查找 n-gram 频率
【发布时间】:2019-01-31 19:29:51
【问题描述】:

我有一组短信。让我们称他们为m1, m2, ....。最大消息数低于1,000,000。每条消息的长度小于1024 个字符,并且全部为小写。让我们也选择一个 n-gram 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 = 2in a = 2a cage = 2in a cage = 2 的子集且频率相同,因此不应列出它们。只取频率最高的最长的;遵循此条件:最长的 sn-gram 最多应包含 8 个单词,总字符数低于 30。如果一个 n-gram 超过此限制,则可以将其拆分为两个或多个 n-gram 并单独列出。

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

我该如何解决这个问题?我需要 javascript 中的解决方案。

PS:我需要帮助,但不知道在哪里问这个。如果问题 不适合这个网站,那我应该在哪里发布呢?请指导这个 新手在这里。

【问题讨论】:

  • 基本上,在 SO 中,您应该就无法正常工作的代码寻求帮助。但出于好奇,让我问一下..您需要执行此任务的目的是什么..?
  • 嗨。我根本没有任何代码。我什至不知道从哪里开始。我需要从消息列表中找到句子中最常用的部分。它适用于我正在开发的文本分析程序。
  • 你可能想先在网上搜索一下:维基百科和其他一些资源在我得到的前 20 个结果中解释了从概念到“这里是实际的工作代码”的“拓扑排序”来自谷歌的术语,您可能还想通过使用稍微不同的术语来搜索其他人是如何实现的:在文本搜索中,您正在寻找“n-gram 频率计数”,因为 n-gram 是文本中的单词,而子字符串是字符串中的字母。这应该可以帮助您找到很多提示和实现。
  • 问题可能与“拓扑排序”无关。我认为这是一种可能性。但后来我认为发布我的猜测会很糟糕,因为我可能大错特错。所以我改变了标题。我不知道什么是“n-gram 频率计数”。谢谢你的任期。我会调查的。
  • 一个问题是“为什么要自己实现这个?”如果这不是家庭作业。如果这是您正在处理的真实事情,请安装像 Elastic Search 这样的全文索引器并使用它来为您完成工作? (或者,设置你的数据库来构建一个 ngram 索引,然后看看你是否可以获得它已经跟踪的频率信息?)

标签: javascript algorithm substring string-matching


【解决方案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
                    }

【讨论】:

  • 这个 sn-p 几乎可以工作。除非它应该将["this", 2], ["this is", 2] 合并为一个:` ["this is", 2]`。不过,感谢您发布它。我自己不知道该怎么做。
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多