我的数据库中有一个很大的表,其中有很多来自不同文本的单词,按文本顺序排列。我想找出某些词组一起出现的次数/频率。
示例:假设我在许多文本中都有这 4 个词:United | States | of | America
.我会得到结果:
美国:50
美国:45
美利坚合众国:40
(这只是4个单词的例子,但是可以有少于4个和多于4个的吗)
有一些算法可以做到这一点或类似吗?
编辑:欢迎使用一些显示操作方法的 R 或 SQL 代码。我需要一个实际的例子来说明我需要做什么。
表结构
我有两个表:Token
其中有 id
和 text
.正文是 UNIQUE
此表中的每个入口代表一个不同的词。
TextBlockHasToken
是保持文本顺序的表。每行代表文本中的一个词。
它有textblockid
那是 token 所属的文本 block 。 sentence
那就是 token 的句子,position
那是句子中的标记位置,tokenid
那是 token 表引用。
最佳答案
它被称为N-gram;在你的情况下是 4 克。它确实可以作为马尔可夫链的副产品获得,但您也可以使用滑动窗口(大小 4)遍历(线性)文本,同时更新 4 维“直方图”。
2011 年 11 月 22 日更新: 马尔可夫链是一种在给定当前状态的情况下对切换到新状态的概率进行建模的方法。这是“状态机”的随机等价物。在自然语言情况下,“状态”由“前 N 个词”组成,这意味着您将先验概率(前 N 个词之前)视为 equal_to_one。在 NLP 案例中,计算机人员很可能会使用树来实现马尔可夫链。 “状态”只是从根到当前节点的路径,words_to_follow 的概率是当前节点的后代的概率。但是每次我们选择一个新的子节点时,我们实际上会向下移动树,并“忘记”根节点,窗外只有 N 个字宽,这转化为树的 N 层深度。
你很容易看出,如果你像这样走马尔可夫链/树,任何时候第一个词之前的概率是1,第一个词之后的概率是P(w1),第二个词之后的概率= P (w2) || w1 等。因此,在处理语料库时,您构建了一个马尔可夫树( := 更新节点中的频率),在骑行结束时,您可以通过 freq(word)/SUM 估计给定单词选择的概率(频率( sibling ))。对于树中 5 层的单词,这是给定前 4 个单词的该单词的概率。如果您想要 N-gram 概率,您需要从词根到最后一个词的路径中所有概率的乘积。
关于sql - 我可以使用哪种算法来查找常见的相邻词/模式识别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8069531/