NLP-統(tǒng)計語言模型

\color{green}{ 語言模型是自然語言處理的基礎(chǔ),在自然語言的很多任務(wù)中都有較好的應(yīng)用,}
\color{green}{ 如機器翻譯妹孙、輸入提示、文本生成获枝、分詞中判斷最優(yōu)分詞情況等蠢正。目前的語}
\color{green}{ 言模型主要是統(tǒng)計語言模型和神經(jīng)語言模型,本文主要討論統(tǒng)計語言模型: }
\color{green}{ 從由來到原理省店,再到具體使用以及代碼案例嚣崭。 }

一、數(shù)學(xué)模型

1懦傍、由來

語言模型起初是為了計算句子的合理性有鹿。在我們看來一句話是否合理主要還是判斷其是否合乎語法,表達(dá)清晰谎脯,通俗的來講就是:說的是不是人話。人為地判斷雖然具有可行性持寄,但是對于計算機來說源梭,這無疑是對牛彈琴!于是自然語言處理界殿堂級締造者賈里尼克提出使用概率來判斷句子合理性稍味,即:一個句子是否合理废麻,看該句子的可能性大小如何,那么問題就轉(zhuǎn)變?yōu)榱艘粋€數(shù)學(xué)問題模庐。
比如判斷句子"\color{green}{我喜歡自然語言處理}"是否合理烛愧,即是計算

P(\color{green}{我喜歡自然語言處理})的大小

進(jìn)行詞粒度的拆分:

P(\color{green}{我,喜歡 ,自然語言 ,處理})

根據(jù)聯(lián)合概率鏈規(guī)則

P(w_1,w_2,w_3...w_n)=P(w_1)*P(w_2|w_1)*P(w_3|w_1,w_2)...P(w_n|w_1,w_2...w_{n-1})

那么

P(\color{green}{我,喜歡 ,自然語言 ,處理})=P(\color{green}{我})*P(\color{green}{喜歡|我})*P(\color{green}{自然語言|我,喜歡})*P(\color{green}{處理|我,喜歡,自然語言})

以上計算過程的核心就是假設(shè)一個詞出現(xiàn)的概率和前面n個詞出現(xiàn)的概率相關(guān),通過該假設(shè),可以通過計算句子中詞的聯(lián)合概率來得出句子的可能性怜姿,但是同時也帶來一個問題:當(dāng)一句話比較長時慎冤,P(w_n|w_1,w_2...w_{n-1})的計算量無法估量,天國的大門好像在最后一秒被封上了沧卢,不過古人云車到山前必有路蚁堤,地球人從無畏懼困難,只恐無法找到問題但狭,這就是常說的提出問題有時候比解決問題更重要披诗。問題有了,就出現(xiàn)如下解決方案:N-Gram(假設(shè)第n個詞的出現(xiàn)只與前面n-1個詞相關(guān)立磁,而與其它任何詞都不相關(guān))呈队,下面說其中主要的三種情況。

2唱歧、unigram

unigram在計算P(w_1,w_2,w_3...w_n)的過程中直接做了一種假設(shè):組成句子的詞之間相互獨立宪摧,即第n個詞的出現(xiàn)只與前面0個詞相關(guān),而與其它任何詞都不相關(guān)迈喉,那么P(w_1,w_2,w_3...w_n)的聯(lián)合概率為:

P(w_1,w_2,w_3...w_n)=P(w_1)*P(w_2)*P(w_3)...P(w_n)

那么

P(\color{green}{我,喜歡 ,自然語言 ,處理})=P(\color{green}{我})*P(\color{green}{喜歡})*P(\color{green}{自然語言})*P(\color{green}{處理})

這樣計算量直接降到了最低绍刮,不過簡單粗暴的方式效果不一定很好,僅僅考慮詞之間的獨立性挨摸,就無法顧及到整句話的上下文孩革,勢必造成句子的合理性較差。

3得运、bigram

bigram在計算P(w_1,w_2,w_3...w_n)的過程中做了一種假設(shè):第n個詞的出現(xiàn)只與前面1個詞相關(guān)膝蜈,而與其它任何詞都不相關(guān),那么P(w_1,w_2,w_3...w_n)的聯(lián)合概率為:

P(w_1,w_2,w_3...w_n)=P(w_1)*P(w_2|w_1)*P(w_3|w_2)...P(w_n|w_{n-1})

那么

P(\color{green}{我,喜歡 ,自然語言 ,處理})=P(\color{green}{我})*P(\color{green}{喜歡|我})*P(\color{green}{自然語言|喜歡})*P(\color{green}{處理|自然語言})

該種計算方式計算量不是很復(fù)雜熔掺,且考慮到了上文的相關(guān)性饱搏,屬于目前比較常用的方式之一。

4置逻、trigram

trigram在計算P(w_1,w_2,w_3...w_n)的過程中做了一種假設(shè):第n個詞的出現(xiàn)只與前面2個詞相關(guān)推沸,而與其它任何詞都不相關(guān),具體處理方式和上面類似券坞。
到此可以發(fā)現(xiàn)鬓催,n-gram其實就是單純考慮了句子的上文信息,使用上文的多少個詞恨锚,看具體情況而定宇驾。

5、概率計算

上面說了那么多的P(我)猴伶、P(自然語言)的之類的概率课舍,那么如何計算這些概率呢塌西,下面舉一個小例子:
假設(shè)有語料庫:

  • 我 喜歡 大自然
  • 自然語言 是 如何 形成 的 呢
  • 如何 處理 數(shù)據(jù) 是 很 重要 的
  • 越來越多 的 人 喜歡 自然語言 處理

語料庫中共有16個單詞,分別是

[我,喜歡,大自然,自然語言,是,如何,形成,的,呢,處理,數(shù)據(jù),是,很,重要,越來越多,人]

這些詞在語料庫中一共出現(xiàn)過22次筝尾,那么
P(我)=\frac{1}{22},P(自然語言)=\frac{1}{22}
單個詞的很容易計算捡需,那么bigram的呢,以P(自然語言|喜歡)為例忿等,喜歡在語料庫中一共出現(xiàn)了兩次栖忠,其中有一次在喜歡的后面出現(xiàn)自然語言,那么P(自然語言|喜歡)=\frac{1}{2}贸街,其他的以此類推...
總結(jié)一下就是:

P(w_n)=\frac{w_n出現(xiàn)的次數(shù)}{語料庫中詞出現(xiàn)的總數(shù)}
P(w_n|w_{n-1})=\frac{w_n庵寞、w_{n-1}同時出現(xiàn)的次數(shù)}{語料庫中w_{n-1}出現(xiàn)的次數(shù)}

二、文本生成案例

本案例中使用bigram的假設(shè)薛匪,需要生成的第n個詞只與前面一個詞有關(guān)捐川,那么每次生成的詞只需要通過前面一個的詞的先驗來確定。

  • 導(dǎo)入需要的包
from collections import Counter
from jieba import lcut
from random import choice
  • 定義語料
    借用一下方文山寫的歌詞
corpus = '''
這一生原本一個人逸尖,你堅持廝守成我們古沥,卻小小聲牽著手在默認(rèn)。
感動的眼神說愿意娇跟,走進(jìn)我的人生岩齿。
進(jìn)了門開了燈一家人,盼來生依然是一家人苞俘。
確認(rèn)過眼神盹沈,我遇上對的人。
我揮劍轉(zhuǎn)身吃谣,而鮮血如紅唇乞封。
前朝記憶渡紅塵,傷人的不是刀刃岗憋,是你轉(zhuǎn)世而來的魂肃晚。
青石板上的月光照進(jìn)這山城,我一路的跟你輪回聲仔戈,我對你用情極深关串。
誰在用琵琶彈奏一曲東風(fēng)破,楓葉將故事染色监徘,結(jié)局我看透晋修。
籬笆外的古道我牽著你走過,荒煙漫草的年頭耐量,就連分手都很沉默。
'''

  • bigram模型訓(xùn)練
def get_model(corpus):
    '''
    :param corpus: 
    :return: { '我': Counter({'的': 2, '看透': 1}), '人生': Counter({'滤港。': 1})}
    #           我 后面 的 出現(xiàn)2次 看透 出現(xiàn)1次
    '''
    # 將語料按照\n切分為句子
    corpus = corpus.strip().split('\n')
    # 將句子切分為詞序列
    corpus = [lcut(line) for line in corpus]
    # 提取所有單詞
    words = [word for words in corpus for word in words]
    # 構(gòu)造一個存儲每個詞統(tǒng)計的字典{'你',count(),'我':count()}
    bigram = {w: Counter() for w in words}
    # 根據(jù)語料庫進(jìn)行統(tǒng)計信息填充
    for sentence in corpus:
        for i in range(len(sentence) - 1):
            bigram[sentence[i]][sentence[i + 1]] += 1
    return bigram
  • 生成函數(shù)
ef generate_text(bigram,first_word, free=4):
    '''
    按照語言模型生成文本
    :param first_word: 提示詞
    :param free: 控制范圍  如果強制按照每個詞后面最有可能出現(xiàn)的詞進(jìn)行生成廊蜒,設(shè)置為1趴拧,需要一些靈活性,可以放寬一些
    :return:
    '''
    # 如果第一個詞不在詞典中 隨機選一個
    if first_word not in bigram.keys():
        first_word = choice(bigram.keys())
    text = first_word
    # 將候選詞按照出現(xiàn)概率進(jìn)行降序排列
    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 = ['你','我們','確認(rèn)']
for word in first_words:
    generate_text(bigram,word,free=4)

測試效果如下

生成文本: 你用琵琶彈奏一曲東風(fēng)破著榴,盼來生依然是一家人。
生成文本: 我們屁倔,卻小小聲牽著手在用琵琶彈奏一曲東風(fēng)破脑又,走進(jìn)我一路的不是刀刃,你輪回聲锐借,走進(jìn)我一路的人问麸。
生成文本: 確認(rèn)過眼神,你輪回聲钞翔,盼來生依然是你用情極深严卖。

看到最后一句:盼來生依然是你用情極深。我懷疑我電腦是不是戀愛了(⊙o⊙)…

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末布轿,一起剝皮案震驚了整個濱河市哮笆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汰扭,老刑警劉巖稠肘,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萝毛,居然都是意外死亡项阴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門珊泳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲁冯,“玉大人,你說我怎么就攤上這事色查∈硌荩” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵秧了,是天一觀的道長跨扮。 經(jīng)常有香客問我,道長验毡,這世上最難降的妖魔是什么衡创? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮晶通,結(jié)果婚禮上璃氢,老公的妹妹穿的比我還像新娘。我一直安慰自己狮辽,他們只是感情好一也,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布巢寡。 她就那樣靜靜地躺著,像睡著了一般椰苟。 火紅的嫁衣襯著肌膚如雪抑月。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天舆蝴,我揣著相機與錄音谦絮,去河邊找鬼。 笑死洁仗,一個胖子當(dāng)著我的面吹牛层皱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播京痢,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼奶甘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祭椰?” 一聲冷哼從身側(cè)響起臭家,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎方淤,沒想到半個月后钉赁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡携茂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年你踩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讳苦。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡带膜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸳谜,到底是詐尸還是另有隱情膝藕,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布咐扭,位于F島的核電站芭挽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蝗肪。R本人自食惡果不足惜袜爪,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薛闪。 院中可真熱鬧辛馆,春花似錦、人聲如沸豁延。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓢对,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胰苏,已是汗流浹背硕蛹。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硕并,地道東北人法焰。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像倔毙,于是被迫代替她去往敵國和親埃仪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355