这是语料库
abcdef
abcd
xabcd
b
bcef
ef
aef
我要提取的是abcd, ef,然后我尝试计算所有 n-gram:
abcdef 1
abcd 3
abc 3
...
我的问题是如何区分and abcd,因为只出现一次,并且是 'abcd' 的子字符串。当然,我可以用这两个条件进行过滤,但只是想知道解决这个问题的任何现有算法目标。abcdefabcabcdefabc
这是语料库
abcdef
abcd
xabcd
b
bcef
ef
aef
我要提取的是abcd, ef,然后我尝试计算所有 n-gram:
abcdef 1
abcd 3
abc 3
...
我的问题是如何区分and abcd,因为只出现一次,并且是 'abcd' 的子字符串。当然,我可以用这两个条件进行过滤,但只是想知道解决这个问题的任何现有算法目标。abcdefabcabcdefabc
这使用 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。