我需要为包含如下文本的文本文件计算Unigram、BiGrams和Trigram:
“仅在美国,就有3万名儿童和年轻人受到囊性纤维化的影响。吸入盐水的薄雾可以减少囊性纤维化患者气道中的脓液和感染,尽管副作用包括严重的咳嗽和刺鼻的味道。这是本周发表在”新英格兰医学杂志“上的两项研究的结论。”
我从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
但它适用于一个单词中的所有n-gram,当我想在单词之间使用它时,例如囊性和纤维化或囊性纤维化。有人能帮我解决这个问题吗?
发布于 2012-11-17 04:33:16
假设输入是包含空格分隔的单词的字符串,如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'
,则需要将它们加到一个字典中:
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}
发布于 2015-06-03 08:53:49
此blog中的简短Pythonesque式解决方案
def find_ngrams(input_list, n):
return zip(*[input_list[i:] for i in range(n)])
用法:
>>> input_list = ['all', 'this', 'happened', 'more', 'or', 'less']
>>> find_ngrams(input_list, 1)
[('all',), ('this',), ('happened',), ('more',), ('or',), ('less',)]
>>> find_ngrams(input_list, 2)
[('all', 'this'), ('this', 'happened'), ('happened', 'more'), ('more', 'or'), ('or', 'less')]
>>> find_ngrams(input_list, 3))
[('all', 'this', 'happened'), ('this', 'happened', 'more'), ('happened', 'more', 'or'), ('more', 'or', 'less')]
发布于 2012-11-17 23:26:00
使用NLTK (自然语言工具包),并使用这些函数将文本标记化(拆分)为列表,然后查找二元语法和三元语法。
import nltk
words = nltk.word_tokenize(my_text)
my_bigrams = nltk.bigrams(words)
my_trigrams = nltk.trigrams(words)
https://stackoverflow.com/questions/13423919
复制相似问题