如何获取一段文本中双连词的概率?

6

我有一段包含多个句子的文本。如何使用nltk.ngrams来处理它?

这是我的代码:

   sequence = nltk.tokenize.word_tokenize(raw) 
   bigram = ngrams(sequence,2)
   freq_dist = nltk.FreqDist(bigram)
   prob_dist = nltk.MLEProbDist(freq_dist)
   number_of_bigrams = freq_dist.N()

然而,上述代码假设所有句子都是一个序列。但是,句子被分开,并且我猜想一个句子的最后一个词与另一个句子的第一个词无关。如何为这样的文本创建bigram?我还需要基于freq_distprob_distnumber_of_bigrams
有类似的问题,比如什么是ngram计数以及如何使用nltk实现?,但它们大多数是关于单词序列的。
1个回答

10
您可以使用新的nltk.lm模块。这里是一个例子,首先获取一些数据并进行分词:
import os
import requests
import io #codecs

from nltk import word_tokenize, sent_tokenize 

# Text version of https://kilgarriff.co.uk/Publications/2005-K-lineer.pdf
if os.path.isfile('language-never-random.txt'):
    with io.open('language-never-random.txt', encoding='utf8') as fin:
        text = fin.read()
else:
    url = "https://gist.githubusercontent.com/alvations/53b01e4076573fea47c6057120bb017a/raw/b01ff96a5f76848450e648f35da6497ca9454e4a/language-never-random.txt"
    text = requests.get(url).content.decode('utf8')
    with io.open('language-never-random.txt', 'w', encoding='utf8') as fout:
        fout.write(text)

# Tokenize the text.
tokenized_text = [list(map(str.lower, word_tokenize(sent))) 
              for sent in sent_tokenize(text)]

接下来是语言建模:

# Preprocess the tokenized text for 3-grams language modelling
from nltk.lm.preprocessing import padded_everygram_pipeline
from nltk.lm import MLE

n = 3
train_data, padded_sents = padded_everygram_pipeline(n, tokenized_text)

model = MLE(n) # Lets train a 3-grams maximum likelihood estimation model.
model.fit(train_data, padded_sents)
获取计数:

要获取计数:

model.counts['language'] # i.e. Count('language')
model.counts[['language']]['is'] # i.e. Count('is'|'language')
model.counts[['language', 'is']]['never'] # i.e. Count('never'|'language is')

获取概率:

model.score('is', 'language'.split())  # P('is'|'language')
model.score('never', 'language is'.split())  # P('never'|'language is')
在Kaggle平台加载笔记本时会有一些问题,但是该笔记本应该会很好地概述nltk.lm模块。https://www.kaggle.com/alvations/n-gram-language-model-with-nltk

谢谢,我该如何通过pip安装nltk.lm。当我安装nltk时似乎没有这个模块。 - Ahmad
pip install -U nltk>=3.4 - alvas
请您看一下这个相关问题:https://dev59.com/urLma4cB1Zd3GeqPYkoI - Ahmad
1
为什么NLTK没有提供model.score(sentence)函数?例如,如果我们使用回退,计算句子的分数并不是非常简单。 - Simone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接