from collections import counter
from jieba import lcut
from random import choice
corpus = '''
這一生原本乙個人,你堅持廝守成我們,卻小小聲牽著手在預設。
感動的眼神說願意,走進我的人生。
進了門開了燈一家人,盼來生依然是一家人。
確認過眼神,我遇上對的人。
我揮劍轉身,而鮮血如紅唇。
前朝記憶渡紅塵,傷人的不是刀刃,是你轉世而來的魂。
青石板上的月光照進這山城,我一路的跟你輪迴聲,我對你用情極深。
誰在用琵琶彈奏一曲東風破,楓葉將故事染色,結局我看透。
籬笆外的古道我牽著你走過,荒煙漫草的年頭,就連分手都很沉默。
'''def get_model(corpus):
''':param corpus:
:return: ), '人生': counter()}
# 我 後面 的 出現2次 看透 出現1次
'''# 將語料按照\n切分為句子
corpus = corpus.strip().split('\n')
# 將句子切分為詞序列
corpus = [lcut(line) for line in corpus]
# 提取所有單詞
words = [word for words in corpus for word in words]
# 構造乙個儲存每個詞統計的字典
bigram =
# 根據語料庫進行統計資訊填充
for sentence in corpus:
for i in range(len(sentence) - 1):
bigram[sentence[i]][sentence[i + 1]] += 1
return bigram
def generate_text(bigram,first_word, free=4):
'''按照語言模型生成文字
:param first_word: 提示詞
:param free: 控制範圍 如果強制按照每個詞後面最有可能出現的詞進行生成,設定為1,需要一些靈活性,可以放寬一些
:return:
'''# 如果第乙個詞不在詞典中 隨機選乙個
if first_word not in bigram.keys():
first_word = choice(bigram.keys())
text = first_word
# 將候選詞按照出現概率進行降序排列
next_words = sorted(bigram[first_word], key=lambda w: bigram[first_word][w],reverse=true)
while true:
if not next_words:
break
# 候選詞前free個中隨機選乙個
next_word = choice(next_words[:free])
text += next_word
if text.endswith('。') :
print('生成文字:', text)
break
next_words = sorted(bigram[next_word], key=lambda w: bigram[next_word][w],reverse=true)
bigram = get_model(corpus)
first_words = ['你','我們','確認']
for word in first_words:
generate_text(bigram,word,free=4)
統計語言模型
語言模型就是用來計算乙個句子的概率的模型,即p w1,w2,wk 利用語言模型,可以確定哪個詞序列的可能性更大,或者給定若干個詞,可以 下乙個最可能出現的詞語。舉個音字轉換的例子來說,輸入拼音串為nixianzaiganshenme,對應的輸出可以有多種形式,如你現在幹什麼 你西安再趕什麼 等等,那...
統計語言模型(SLM)
摘自 第12講 slm廣泛使用於語音識別和統計機器翻譯領域,利用概率統計理論研究語言。規則方法 詞 句 篇章的生成比如滿足某些規則,不滿足該規則就不應存在。統計方法 任何語言片斷都有存在的可能,只是可能性大小不同 對於乙個文件片段d w1w2 wn,統計語言模型是指概率p w1w2 wn 求解,根據...
統計語言模型(下)
p wi wi 1 就是這兩個數的比值,再考慮到上面的兩個概率有相同的分母 語料庫大小 可以約掉,所以p wi wi 1 wi 1,wi wi 1 現在你是否感受到數學的美妙?它把一些複雜的問題變得如此簡單。似乎難以相信,這麼簡單的數學模型能解決複雜的語音識別 機器翻譯等問題,而很複雜的文法規則和人...