如何提取高频词组

数据挖掘 数据挖掘 数据集 统计数据 文本挖掘
2022-02-28 21:00:59

这是语料库

abcdef
abcd
xabcd
b
bcef
ef
aef

我要提取的是abcd, ef,然后我尝试计算所有 n-gram:

abcdef 1
abcd 3
abc 3
...

我的问题是如何区分and abcd因为只出现一次,并且是 'abcd' 的子字符串。当然,我可以用这两个条件进行过滤,但只是想知道解决这个问题的任何现有算法目标。abcdefabcabcdefabc

3个回答

这使用 python 和 NLTK

import nltk

text = """abcdef
abcd
xabcd
b
bcef
ef
aef
"""

def tokens(lines):
    for line in lines:
        for n in range(1, len(line)):
            ts = nltk.ngrams(line, n)
            for t in ts: yield str.join('', t) 
        yield line

ts = tokens(text.splitlines())
freq = nltk.FreqDist(ts)
print(freq.most_common())
# [('b', 5), ('c', 4), ('ef', 4), ('bc', 4), ('e', 4)...

当然,还有其他解决方案,但我认为这符合您的标准。如果您的行很大,您可能需要优化,因为这将创建所有可能的 n-gram。

我不确定您所询问的程序的目标是什么。

您可能对霍夫曼编码感兴趣

霍夫曼码用于文本压缩。他们识别高频序列并为其分配短代码,从而减少整体文本大小。

为代码构建的树可能会帮助您找到所需的内容。

作为额外的奖励,它是一种经典算法,因此您将能够找到它的许多实现。

如果您有大量数据,您可以将单词拆分为单个字母的句子,并将每个句子视为单独的文档。然后将其从 sklearn 输入 CountVectorizer 以创建一个稀疏矩阵,其中包含长度从 2 到最大长度的 ngram 向量。使用 binary=True 避免重复计算单词内的重复模式。最后一步是计算矩阵的哪些列具有最高数量的“一”,并查找来自矢量化字典的哪些 ngram。