我的数据库中有一个大表,其中包含来自各种文本的单词,并按文本顺序排列。我想找到某些词语集合一起出现的次数/频率。
示例:假设我在许多文本中有这 4 个词:United | States | of | America
。我将得到如下结果:
United States:50
United States of:45
United States of America:40
(这只是一个包含 4 个词的示例,但词语的数量可以少于或多于 4 个)。
有没有什么算法可以做到这一点或者与此类似?
编辑: 欢迎提供一些 R 或 SQL 代码来展示如何操作。我需要一个我需要做什么的实际例子。
表结构
我有两个表:Token
,其中有 id
和 text
。text
是 UNIQUE
的,并且此表中的每个条目代表一个不同的单词。
TextBlockHasToken
是保存文本顺序的表。每一行代表文本中的一个单词。
它有 textblockid
,它是 token 所属的文本块。sentence
是 token 所属的句子,position
是 token 在句子中的位置,tokenid
是 token 表的引用。
回答:
这被称为 N-gram;在您的情况下是 4-gram。它确实可以作为马尔可夫链的副产品获得,但您也可以使用滑动窗口(大小为 4)来遍历(线性)文本,同时更新 4 维“直方图”。
2011-11-22 更新:马尔可夫链是一种对转换到新状态的概率进行建模的方法,给定当前状态。这是“状态机”的随机等价物。在自然语言的情况下,“状态”由“前 N 个词”形成,这意味着您将先前的概率(在前 N 个词之前)视为等于 1。计算机人员最有可能使用树来实现 NLP 案例中的马尔可夫链。“状态”只是从根到当前节点所采用的路径,而后续单词的概率是当前节点的后代的概率。但是,每次我们选择一个新的子节点时,我们实际上都会向下移动树,并“忘记”根节点,我们的窗口只有 N 个词宽,这转化为树中 N 层深。
您可以很容易地看到,如果您像这样遍历马尔可夫链/树,则在任何时候,第一个词之前的概率为 1,第一个词之后的概率为 P(w1),第二个词之后 = P(w2) || w1,等等。因此,在处理语料库时,您构建了一个马尔可夫树(:= 更新节点中的频率),在旅程结束时,您可以通过 freq(word) / SUM(freq(siblings)) 来估计给定单词选择的概率。对于树中深度为 5 的单词,这是给定前 4 个词的单词的概率。如果您想要 N-gram 概率,您需要从根到最后一个单词的路径中所有概率的乘积。