我需要为包含以下文本的文本文件计算Unigram,BiGrams和Trigrams:
“囊性纤维化仅在美国就影响了30,000名儿童和年轻人。吸入盐水雾可以减少填充囊性纤维化患者气道的脓液和感染,尽管副作用包括令人讨厌的咳嗽症状和难闻的味道。这就是结论。发表在本周《新英格兰医学杂志》上的两项研究。
我从Python开始,并使用以下代码:
#!/usr/bin/env python # File: n-gram.py def N_Gram(N,text): NList = [] # start with an empty list if N> 1: space = " " * (N-1) # add N - 1 spaces text = space + text + space # add both in front and back # append the slices [i:i+N] to NList for i in range( len(text) - (N - 1) ): NList.append(text[i:i+N]) return NList # return the list # test code for i in range(5): print N_Gram(i+1,"text") # more test code nList = N_Gram(7,"Here is a lot of text to print") for ngram in iter(nList): print '"' + ngram + '"'
http://www.daniweb.com/software-development/python/threads/39109/generating- n-grams-from-a-word
但是,当我希望从单词之间以CYSTIC和FIBROSIS或CYSTIC FIBROSIS进行操作时,它适用于单词中的所有n- gram。有人可以帮我解决这个问题吗?
假设输入是一个包含空格的单词的字符串,例如x = "a b c d"可以使用以下函数(编辑:请参阅最后一个函数以获取更完整的解决方案):
x = "a b c d"
def ngrams(input, n): input = input.split(' ') output = [] for i in range(len(input)-n+1): output.append(input[i:i+n]) return output ngrams('a b c d', 2) # [['a', 'b'], ['b', 'c'], ['c', 'd']]
如果您希望将它们重新连接成字符串,则可以调用以下内容:
[' '.join(x) for x in ngrams('a b c d', 2)] # ['a b', 'b c', 'c d']
最后,这并不能将总和汇总,因此,如果输入为'a a a a',则需要将它们累加为字典:
'a a a a'
for g in (' '.join(x) for x in ngrams(input, 2)): grams.setdefault(g, 0) grams[g] += 1
将所有这些放到一个最终函数中可以得出:
def ngrams(input, n): input = input.split(' ') output = {} for i in range(len(input)-n+1): g = ' '.join(input[i:i+n]) output.setdefault(g, 0) output[g] += 1 return output ngrams('a a a a', 2) # {'a a': 3}