马尔科夫链通过当前单词预测句子中的下一个单词。举个例子,模型通过下面两个句子进行训练,“I drink coffee in the morning”和“I eat sandwiches with tea”。“drink”后面出现“coffee”的概率是100%,“I”后面出现“eat”和“drink”的概率分别为50%。马尔可夫链在计算下一个单词出现概率的时候,会把每个单词之间的关系考虑进去。该模型最早用于为智能手机输入句子提供下一个单词生成建议。
import nltk
import random
# 读取文件内容
file =open('vocab.txt','r',encoding='utf-8')
walden = file.read()
#对文件内容按照空格进行划分,其实划分之前对于一般的文章可以首先进行分词,然后将分词后的内容进行分割,得到分割后的结果
walden = walden.split()
def makePairs(arr):
pairs =[]for i inrange(len(arr)):if i <len(arr)-1:
temp =(arr[i], arr[ i +1])
pairs.append(temp)return pairs
def generate(cfd, word='三', num=100):for i inrange(num):
arr =[] # make an array with the words shown by proper count
for j in cfd[word]:for k inrange(cfd[word][j]):
arr.append(j)print(word, end=' ')
word = arr[int((len(arr))* random.random())]
pairs =makePairs(walden)
cfd = nltk.ConditionalFreqDist(pairs)generate(cfd)
首先我们引入NLTK,它是Python中最好的NLP库。我想说,虽然我们这里做的自然语言处理很简单,但NLTK的内置函数还是帮我节省了很多代码。然后我们利用split()函数将字符串(从文本文件中获得的)转换成一个数组。上边两个函数是代码的基本函数。我们最终要使用的NLTK中的“条件频率字典(nltk.ConditionalFreqDist()函数)”必须以成对数组作为输入,所以短语“Hi my name is Alex”需要变为[(“Hi”, “my”), (“my, “name”), (“name”, “is”), (“is”, “Alex”)]。函数makePairs以一个数组(以词分割字符串得到)作为输入,输出符合上边格式的数组。
马尔可夫链是最早用于语言生成的算法。马尔科夫链通过当前单词预测句子中的下一个单词。举个例子,模型通过下面两个句子进行训练,“I drink coffee in the morning”和“I eat sandwiches with tea”。“drink”后面出现“coffee”的概率是100%,“I”后面出现“eat”和“drink”的概率分别为50%。马尔可夫链在计算下一个单词出现概率的时候...