Python 什么是ngram计数以及如何使用nltk实现?

Python 什么是ngram计数以及如何使用nltk实现?,python,nlp,nltk,Python,Nlp,Nltk,我读过一篇文章,其中使用ngram计数作为分类器的特征,我想知道这到底意味着什么 示例文本:“Lorem ipsum dolor sit amet,consetetur sadipscing eliter,sed diam” 我可以在本文中创建单图、双图、三元图等,其中我必须定义创建这些单图的“级别”。“级别”可以是字符、音节、单词 那么,从上面的句子中创建单字就可以创建一个所有单词的列表 创建双字母表会导致单词对将紧跟其后的单词组合在一起 因此,如果论文讨论的是ngram计数,它只是从文本中创

我读过一篇文章,其中使用ngram计数作为分类器的特征,我想知道这到底意味着什么

示例文本:“Lorem ipsum dolor sit amet,consetetur sadipscing eliter,sed diam”

我可以在本文中创建单图、双图、三元图等,其中我必须定义创建这些单图的“级别”。“级别”可以是字符、音节、单词

那么,从上面的句子中创建单字就可以创建一个所有单词的列表

创建双字母表会导致单词对将紧跟其后的单词组合在一起

因此,如果论文讨论的是ngram计数,它只是从文本中创建单字、双字、三叉等,并计算哪个ngram出现的频率


python的nltk包中是否有现有方法?或者我必须实现自己的版本吗?

我认为nltk中没有具体的方法来帮助实现这一点。但这并不难。如果你有一个由n个单词组成的句子(假设你使用的是单词级别),那么获取所有长度为1-n的Ngram,迭代这些Ngram,并将它们设置为关联数组中的键,值为计数。不应该超过30行代码,您可以为此构建自己的包,并在需要时导入。

我找到了我的旧代码,也许它很有用

import nltk
from nltk import bigrams
from nltk import trigrams

text="""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare
tempor lacus, quis pellentesque diam tempus vitae. Morbi justo mauris,
congue sit amet imperdiet ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare
tempor lacus, quis pellentesque diam"""
# split the texts into tokens
tokens = nltk.word_tokenize(text)
tokens = [token.lower() for token in tokens if len(token) > 1] #same as unigrams
bi_tokens = bigrams(tokens)
tri_tokens = trigrams(tokens)

# print trigrams count

print [(item, tri_tokens.count(item)) for item in sorted(set(tri_tokens))]
>>> 
[(('adipiscing', 'elit.', 'nullam'), 2), (('amet', 'consectetur', 'adipiscing'), 2),(('amet', 'imperdiet', 'ipsum'), 1), (('congue', 'sit', 'amet'), 1), (('consectetur', 'adipiscing', 'elit.'), 2), (('diam', 'tempus', 'vitae.'), 1), (('dolor', 'sit', 'amet'), 2), (('elit.', 'nullam', 'ornare'), 2), (('imperdiet', 'ipsum', 'dolor'), 1), (('ipsum', 'dolor', 'sit'), 2), (('justo', 'mauris', 'congue'), 1), (('lacus', 'quis', 'pellentesque'), 2), (('lorem', 'ipsum', 'dolor'), 1), (('mauris', 'congue', 'sit'), 1), (('morbi', 'justo', 'mauris'), 1), (('nullam', 'ornare', 'tempor'), 2), (('ornare', 'tempor', 'lacus'), 2), (('pellentesque', 'diam', 'tempus'), 1), (('quis', 'pellentesque', 'diam'), 2), (('sit', 'amet', 'consectetur'), 2), (('sit', 'amet', 'imperdiet'), 1), (('tempor', 'lacus', 'quis'), 2), (('tempus', 'vitae.', 'morbi'), 1), (('vitae.', 'morbi', 'justo'), 1)]
有一个概念叫做


您可能会发现它很有用。

当您计算n-gram时,最好使用哈希表(字典)而不是计数。对于上述示例:

unigrams = {}
for token in tokens:
  if token not in unigrams:
    unigrams[token] = 1
  else:
    unigrams[token] += 1

这给了你时间复杂度O(n)

好的,那么我似乎正确地理解了ngram的内容:)你的解释很常见,但“gram”单位也可以是字节或字符。因此,如果使用滑动窗口,字符3克的“lorem”可以是“lor”和“em”,甚至可以是“lor”、“ore”、“rem”。有用:如果它们不在同一个句子中,它将[‘tempus’、‘vitae’、‘morbi’]算作三元图是否正确?这是答案吗?如果是这样的话,请发布详细信息。这在Python3.4+中是不正确的。