中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

組織建設(shè)情況怎么寫(xiě)哈爾濱seo優(yōu)化軟件

組織建設(shè)情況怎么寫(xiě),哈爾濱seo優(yōu)化軟件,電子商務(wù)網(wǎng)站建設(shè)的目標(biāo)是,b2c網(wǎng)站開(kāi)發(fā)工程報(bào)告 目錄 1 研究背景 4 2 工程目標(biāo) 7 2.1 工程一 7 2.2 工程二 7 2.3 工程三 7 2.4 工程四 7 3 實(shí)驗(yàn)環(huán)境與工具 7 4 模型方法 8 4.1 n-gram模型 8 4.2 模型的平滑 9 4.2.1 Add-one 9 4.2.2 Add-k 9 4.2.3 Backoff 10 4.2.4 Interpolation 10 4.2.5 Absolute discounting 1…

工程報(bào)告
目錄
1 研究背景 4
2 工程目標(biāo) 7
2.1 工程一 7
2.2 工程二 7
2.3 工程三 7
2.4 工程四 7
3 實(shí)驗(yàn)環(huán)境與工具 7
4 模型方法 8
4.1 n-gram模型 8
4.2 模型的平滑 9
4.2.1 Add-one 9
4.2.2 Add-k 9
4.2.3 Backoff 10
4.2.4 Interpolation 10
4.2.5 Absolute discounting 10
4.2.6 Kneser-Ney 10
4.2.7 Modified Kneser-ney 11
4.3 最大匹配法 11
4.3.1 最大前向匹配 11
4.3.2 最大后向匹配 11
4.3.3 基本原則 12
4.4 隱馬爾科夫模型 12
4.5 維特比算法 12
5 系統(tǒng)設(shè)計(jì) 13
5.1 宋詞詞頻統(tǒng)計(jì) 13
5.2 宋詞自動(dòng)生成 14
5.3 中文詞頻統(tǒng)計(jì) 16
5.4 中文詞法分析系統(tǒng) 18
6 系統(tǒng)演示 23
7 課程學(xué)習(xí)心得 25
參考文獻(xiàn) 25
附錄A:源代碼 25

1 研究背景

自然語(yǔ)言理解,研究用電子計(jì)算機(jī)模擬人的語(yǔ)言交際過(guò)程,使計(jì)算機(jī)能理解和運(yùn)用人類(lèi)社會(huì)的自然語(yǔ)言如漢語(yǔ)、英語(yǔ)等,實(shí)現(xiàn)人機(jī)之間的自然語(yǔ)言通信,以代替人的部分腦力勞動(dòng),包括查詢(xún)資料、解答問(wèn)題、摘錄文獻(xiàn)、匯編資料以及一切有關(guān)自然語(yǔ)言信息的加工處理。這在當(dāng)前新技術(shù)革命的浪潮中占有十分重要的地位。
自然語(yǔ)言處理的發(fā)展歷程是一個(gè)艱辛且充滿機(jī)遇的過(guò)程,從提出至今已有70多年的歷史,但是現(xiàn)在仍處于期望膨脹期,且被評(píng)為了AI未來(lái)十年重點(diǎn)發(fā)展方向。在其發(fā)展過(guò)程中,可分為三個(gè)階段:第一個(gè)階段為符號(hào)主義與經(jīng)驗(yàn)主義占主流的階段;第二個(gè)階段為理性主義與統(tǒng)計(jì)主義占主流的階段;第三個(gè)階段為連接主義占主流的階段。在第三階段連接主義時(shí),可以從最初的神經(jīng)元數(shù)學(xué)模型(MP模型)開(kāi)始,到1960至1970年代的連接主義(如腦模型),再到Rumelhart等在1986年建立的反向傳播算法[1],最終過(guò)渡到近幾年的循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)、長(zhǎng)短期記憶網(wǎng)絡(luò)(Long Short-Term Memory,LSTM)、詞嵌入(word embedding)、注意力模型(Attention Model,AM)等,以時(shí)間為主線,理論與技術(shù)的發(fā)展為脈絡(luò)進(jìn)行介紹與分析。自然語(yǔ)言處理發(fā)展歷程可從以下幾個(gè)維度進(jìn)行研究。
1.1 從不同學(xué)派的理論與技術(shù)看待自然語(yǔ)言處理發(fā)展歷程
自然語(yǔ)言處理高度融合了數(shù)學(xué),計(jì)算機(jī)等學(xué)科,研究方向中也包含了神經(jīng)科學(xué),生物學(xué),心理學(xué)等。在自然語(yǔ)言處理發(fā)展的歷史中,我們會(huì)看到不同學(xué)派之間的碰撞。正如哲學(xué)中的經(jīng)驗(yàn)主義與理性主義一樣,自然語(yǔ)言處理領(lǐng)域中的經(jīng)驗(yàn)主義(統(tǒng)計(jì)主義)更看重的是證據(jù),即所有理論和假設(shè)都必須被實(shí)驗(yàn)來(lái)檢驗(yàn)。所以我們可以發(fā)現(xiàn)經(jīng)驗(yàn)主義的方法都是統(tǒng)計(jì)的整個(gè)語(yǔ)料庫(kù)中的概率,以此作為經(jīng)驗(yàn)來(lái)驗(yàn)證我們的后續(xù)任務(wù)。而自然語(yǔ)言處理領(lǐng)域中的理性主義(符號(hào)主義),也如哲學(xué)中的理性主義,認(rèn)為大部分的知識(shí)是來(lái)自感覺(jué)上的獨(dú)立思考。就像正則表達(dá)式只提取我們需要的內(nèi)容,而不會(huì)關(guān)心這個(gè)詞在句子中是否是一個(gè)獨(dú)立的個(gè)體。
在多個(gè)學(xué)派各自探索與研究的過(guò)程中,在初期時(shí)代是孤立的??墒请S著學(xué)者們的不斷前進(jìn),呈現(xiàn)出了高度綜合化的趨勢(shì)。自然語(yǔ)言處理在21世紀(jì)迎來(lái)發(fā)展的高潮,正是從圖像與語(yǔ)音領(lǐng)域得到了啟發(fā),結(jié)合了深度學(xué)習(xí)才得到的成果。而這個(gè)高潮時(shí)代也離不開(kāi)其他領(lǐng)域發(fā)展所帶來(lái)的貢獻(xiàn),如果沒(méi)有計(jì)算機(jī)科學(xué)、腦神經(jīng)科學(xué)與認(rèn)知科學(xué)不斷發(fā)展而帶來(lái)神經(jīng)網(wǎng)絡(luò)的高潮[2],也不會(huì)有連接主義的出現(xiàn)。隨著學(xué)者們對(duì)自然語(yǔ)言處理研究的深入,不同學(xué)派之間也產(chǎn)生了融合。
1.2 從單一技術(shù)的發(fā)展看待自然語(yǔ)言處理發(fā)展歷程
恩格斯的否定之否定規(guī)律揭示了事物發(fā)展的方向和道路[3]。在自然語(yǔ)言處理知識(shí)體系中,學(xué)者們對(duì)詞嵌入技術(shù)的研究過(guò)程是一個(gè)不斷螺旋上升的過(guò)程。學(xué)者們提出了一個(gè)新的詞向量構(gòu)建技術(shù),后人在研究的過(guò)程中會(huì)發(fā)現(xiàn)其的不足,并加之完善。這樣的過(guò)程伴隨著詞嵌入這項(xiàng)技術(shù)的發(fā)展。雖然在研究的過(guò)程中出現(xiàn)了許多問(wèn)題,甚至謬誤,但技術(shù)發(fā)展并未停滯,在學(xué)者們一次又一次地發(fā)現(xiàn)了不足后,加之完善,達(dá)到了更好的境地。可見(jiàn)詞嵌入技術(shù)的發(fā)展歷程是螺旋式、曲折式前進(jìn)的過(guò)程。以否定之否定規(guī)律來(lái)看,詞嵌入技術(shù)的發(fā)展歷程可看成是技術(shù)內(nèi)部矛盾引起的自我否定,內(nèi)部矛盾轉(zhuǎn)化,最終解決矛盾的過(guò)程[4]。而從整個(gè)詞嵌入技術(shù)的發(fā)展過(guò)程來(lái)看,我們也可以推測(cè)出整個(gè)自然語(yǔ)言處理領(lǐng)域的發(fā)展是類(lèi)似的情況,都是在前人工作中發(fā)現(xiàn)不足,并進(jìn)行改正,不斷完善理論的一個(gè)過(guò)程。在研究該領(lǐng)域的過(guò)程中,我們要從其歷史進(jìn)行科學(xué)的解讀,針對(duì)出現(xiàn)的新問(wèn)題,發(fā)現(xiàn)過(guò)去理論的不足,改正這些錯(cuò)誤,并不斷完善這個(gè)領(lǐng)域的理論。
1.3 從系統(tǒng)思維看待自然語(yǔ)言處理發(fā)展歷程
系統(tǒng)思維是指將事物看成系統(tǒng)進(jìn)行分析與處理[5]。在整個(gè)自然語(yǔ)言處理的過(guò)程中,自然語(yǔ)言處理可看作為一個(gè)系統(tǒng),它是人工智能系統(tǒng)的一個(gè)子系統(tǒng)。系統(tǒng)理論與方法對(duì)自然語(yǔ)言處理技術(shù)的發(fā)展起重要的指導(dǎo)和促進(jìn)作用。
系統(tǒng)理論著重從全局和整體兩方面分析問(wèn)題,注重事物之間的復(fù)雜聯(lián)系,而不單方面地分析問(wèn)題[6]。就像在自然語(yǔ)言處理的研究中,現(xiàn)階段的工作都是基于文檔、基于句子甚至是基于詞語(yǔ)的,雖然我們能夠?qū)⑵淇醋鳛橐粋€(gè)系統(tǒng),但是人類(lèi)在表達(dá)一句話的時(shí)候有可能會(huì)暗含許多信息(比如輸入“520快樂(lè)”給計(jì)算機(jī),計(jì)算機(jī)只能識(shí)別出一串?dāng)?shù)字“520”和一個(gè)詞“快樂(lè)”,卻不能夠理解“520”暗指網(wǎng)絡(luò)情人節(jié))。這就表明了盡管現(xiàn)在自然語(yǔ)言處理正在蓬勃發(fā)展,但是卻有一定的缺陷。近年來(lái)知識(shí)工程學(xué)科的研究就正在致力于解決計(jì)算機(jī)沒(méi)有外部知識(shí)這一問(wèn)題[7]。從這個(gè)方面來(lái)說(shuō),盡管現(xiàn)在對(duì)自然語(yǔ)言處理系統(tǒng)化的研究已經(jīng)有了顯著成果,但是依舊需要學(xué)者們站在一個(gè)更為宏觀的角度來(lái)系統(tǒng)化看待這個(gè)問(wèn)題。
1.4 從數(shù)學(xué)方法看待自然語(yǔ)言處理發(fā)展歷程
數(shù)學(xué)是辯證的輔助手段和表達(dá)方式[8]。在學(xué)者研究自然語(yǔ)言處理的過(guò)程中,特別是統(tǒng)計(jì)主義學(xué)派與連接主義學(xué)派及其融合學(xué)派,通過(guò)發(fā)現(xiàn)自然語(yǔ)言的內(nèi)在規(guī)律,對(duì)其進(jìn)行數(shù)學(xué)建模,將其用數(shù)學(xué)公式形式化表達(dá)出來(lái)。正是由于數(shù)學(xué)作為基石,自然語(yǔ)言處理才能夠穩(wěn)步發(fā)展。計(jì)算機(jī)處理文字是一件復(fù)雜的事,正是由于詞嵌入技術(shù)將文字映射到向量空間,才能夠降低計(jì)算機(jī)運(yùn)行的成本。在隱含馬爾科夫模型中,通過(guò)雙隨機(jī)過(guò)程,能夠?qū)崿F(xiàn)為詞語(yǔ)打標(biāo)簽的工作。數(shù)學(xué)無(wú)處不在,在發(fā)展過(guò)程中扮演舉足輕重的作用,正是由學(xué)者將發(fā)現(xiàn)的規(guī)律進(jìn)行簡(jiǎn)化并形式化表達(dá)為數(shù)學(xué)公式,才能夠有層出不窮的新技術(shù)誕生。
1.5 從聯(lián)系與發(fā)展看待自然語(yǔ)言處理發(fā)展歷程
自然語(yǔ)言處理的發(fā)展歷史上,離不開(kāi)辯證法中聯(lián)系與發(fā)展的兩大特征。如語(yǔ)言模型[9],正是學(xué)者們發(fā)現(xiàn)了相鄰的詞語(yǔ)之間存在關(guān)聯(lián)關(guān)系,并對(duì)這種內(nèi)在規(guī)律建模,才有了相應(yīng)的研究。同時(shí),正因?yàn)槠渌麑W(xué)科的學(xué)者們?cè)谧匀唤绲劝l(fā)現(xiàn)了相應(yīng)的規(guī)律,才有學(xué)者能夠?qū)⑵湟氲阶匀徽Z(yǔ)言處理中。注意力機(jī)制,也正是學(xué)者們研究了人類(lèi)的注意力機(jī)制,發(fā)現(xiàn)了其中的客觀性與普遍性,才能夠通過(guò)數(shù)學(xué)對(duì)其建模,而引入到計(jì)算機(jī)科學(xué)中,接著才能夠應(yīng)用到自然語(yǔ)言處理領(lǐng)域。從以上兩個(gè)例子我們可以看出,學(xué)者們不僅對(duì)一句話中的詞語(yǔ)之間的關(guān)聯(lián)關(guān)系進(jìn)行了研究,還將自然界中的客觀現(xiàn)象引入到了自然語(yǔ)言處理中,這也反映了辯證法聯(lián)系的思想。
從自然語(yǔ)言處理技術(shù)的發(fā)展路線我們可以發(fā)現(xiàn),這種發(fā)展是具有普遍性的,并沒(méi)有因?yàn)檫^(guò)程的曲折而致使技術(shù)停滯不前。且學(xué)者們通過(guò)分析總結(jié)前人的不足,并加之完善,這體現(xiàn)出了發(fā)展的實(shí)質(zhì):事物的前進(jìn)與上升。盡管事物的前進(jìn)方向是光明的,但是學(xué)者們用了幾年甚至幾十年才慢慢完善該學(xué)科,也就體現(xiàn)出了事物發(fā)展道路的曲折性。最后我們可以發(fā)現(xiàn),如果不是之前學(xué)者們從one-hot編碼到語(yǔ)言模型的提出,也不會(huì)有Word2Vec這種模型的創(chuàng)建。Word2Vec正是吸收了前面詞嵌入技術(shù)的精華,而提煉出的一個(gè)全新技術(shù),這正印證了辯證法發(fā)展性中量變引起質(zhì)變的特性。
1.6 從學(xué)術(shù)前沿看待自然語(yǔ)言處理發(fā)展歷程
自然語(yǔ)言處理中多學(xué)科交叉融合的優(yōu)勢(shì)越來(lái)越明顯,在研究過(guò)程中會(huì)有更多的新思想、新技術(shù)融合到自然語(yǔ)言處理,自然語(yǔ)言處理的應(yīng)用領(lǐng)域越來(lái)越廣泛。自然語(yǔ)言處理的學(xué)術(shù)前沿代表當(dāng)前學(xué)術(shù)界或工業(yè)界需解決的理論或技術(shù)問(wèn)題,教學(xué)過(guò)程中適當(dāng)?shù)貙W(xué)術(shù)前沿理論融入自然語(yǔ)言處理發(fā)展歷程中進(jìn)行教學(xué),增強(qiáng)學(xué)生自主學(xué)習(xí)動(dòng)力,激發(fā)學(xué)生的科研興趣。比如,計(jì)算機(jī)在處理文本數(shù)據(jù)時(shí),它并不能很好地識(shí)別出一個(gè)句子中包含的外部知識(shí)和真實(shí)情感,我們需要研究在知識(shí)指導(dǎo)下的自然語(yǔ)言處理技術(shù),建立知識(shí)獲取、知識(shí)產(chǎn)生、知識(shí)表達(dá)等與自然語(yǔ)言處理的方法與技術(shù),使計(jì)算機(jī)能夠智能認(rèn)知和理解自然語(yǔ)言。同時(shí),其他學(xué)科所產(chǎn)生的新理論、新技術(shù)為自然語(yǔ)言處理提供了良好的基石,可以引導(dǎo)學(xué)生嘗試借鑒這些新理論與新技術(shù)構(gòu)建出新模型、新技術(shù),推動(dòng)自然語(yǔ)言處理的新發(fā)展。

2 工程目標(biāo)

2.1 工程一

宋詞詞頻統(tǒng)計(jì)
語(yǔ)料庫(kù): ci.txt
要求: 編程序, 輸入ci, 自動(dòng)分析統(tǒng)計(jì)ci.txt, 統(tǒng)計(jì)宋詞的單字詞, 雙字詞等。統(tǒng)計(jì)后,輸出的是單字詞和雙字詞的詞典文件。文件中包括相應(yīng)的詞和頻度(次數(shù))。

2.2 工程二

宋詞自動(dòng)生成
語(yǔ)料庫(kù):ci.txt
要求: 輸入詞牌,基于宋詞的詞典和宋詞的詞牌,可以隨機(jī)或者按照語(yǔ)言模型,自動(dòng)生成宋詞。設(shè)計(jì)相應(yīng)的Ui或者Web界面。

2.3 工程三

中文詞頻統(tǒng)計(jì)
語(yǔ)料庫(kù):1998-01-2003版-帶音.txt
要求:輸入txt文件,統(tǒng)計(jì)1元模型和2元模型,輸出單詞和詞頻文件,雙詞和詞頻文件。設(shè)計(jì)相應(yīng)的接口,能夠快速載入文件,并檢索單詞和雙詞。

2.4 工程四

中文詞法分析系統(tǒng)
語(yǔ)料庫(kù):1998-01-2003版-帶音.txt
要求:根據(jù)構(gòu)建的單詞詞典和雙詞詞典,用n-gram模型,或者前向最長(zhǎng)匹配,或者后向最長(zhǎng)匹配等算法,鼓勵(lì)用更復(fù)雜一些的方法來(lái)進(jìn)行,包括隱馬爾科夫模型和條件隨機(jī)場(chǎng)模型。

3 實(shí)驗(yàn)環(huán)境與工具

編輯工具:Visual Studio Code
編譯工具:python 3.9.7
界面工具:PyQt5 designer
用到的庫(kù):re; collections; random; PyQt5 5.15.4;
版本工具:Git
操作系統(tǒng):Windows10

4 模型方法

4.1 n-gram模型

N-gram模型屬于概率語(yǔ)言模型,其要解決的問(wèn)題其實(shí)很簡(jiǎn)單,那就是從是否符合自然語(yǔ)言的角度評(píng)估一個(gè)句子的質(zhì)量。在這個(gè)問(wèn)題中,句子W被建模成詞的排列 W = w1, w2,…wn,所謂質(zhì)量就就是句子出現(xiàn)的概率,也即該排列出現(xiàn)的聯(lián)合概率:

但是要計(jì)算概率要么通過(guò)概率密度函數(shù),要么用統(tǒng)計(jì)概率近似。自然語(yǔ)言的概率密度函數(shù)我們肯定是無(wú)法知道了,那么就要用統(tǒng)計(jì)概率,所以必須要有一個(gè)自然語(yǔ)言的樣本庫(kù),里面包含了大量的自然語(yǔ)言的句子實(shí)例,在N-gram模型中用到的便是語(yǔ)料庫(kù)。
那么怎么通過(guò)語(yǔ)料庫(kù)來(lái)計(jì)算句子出現(xiàn)的概率呢?這就涉及到馬爾科夫鏈的假設(shè),即當(dāng)前詞出現(xiàn)的概率 P (wi)僅與前N-1個(gè)詞有關(guān),這里的N就對(duì)應(yīng)N-gram里面的N。所以N-gram模型的構(gòu)建只需要計(jì)算出所有的N以?xún)?nèi)的條件概率即可:

例如常用的當(dāng)N=3時(shí),句子W出現(xiàn)概率就簡(jiǎn)化為:

可以看到當(dāng)N增大時(shí),需要計(jì)算的概率將會(huì)大大增多,其計(jì)算量幾乎是與N成指數(shù)關(guān)系的增長(zhǎng)(因?yàn)槊慷嗫紤]一階,每個(gè)詞都大約需要多考慮M個(gè)“新的概率”)。谷歌當(dāng)初使用的N=4的語(yǔ)言模型需要500臺(tái)以上的服務(wù)器進(jìn)行存儲(chǔ),這是不可想象的。
而且即使N取的再大,也無(wú)法完全覆蓋后文對(duì)前文的依賴(lài)關(guān)系,語(yǔ)言的上下文聯(lián)系可以跨度很大,而N的增長(zhǎng)對(duì)計(jì)算量增大帶來(lái)的壓力完全無(wú)法滿足這種大跨度的上下文聯(lián)系。
N-gram模型是基于對(duì)語(yǔ)料庫(kù)的統(tǒng)計(jì)來(lái)進(jìn)行訓(xùn)練的,舉例來(lái)說(shuō),對(duì)于Bigram模型,我們要計(jì)算 p (like∣you),那么公式為:

其中 C(wi)表示語(yǔ)料庫(kù)中單詞wi出現(xiàn)的次數(shù)。
仍然以Bigram模型為例,我們的目標(biāo)函數(shù)是:

由于又涉及到多個(gè)概率連乘問(wèn)題,所以我們映射到對(duì)數(shù)空間,即

我們的任務(wù)是最大化這個(gè)對(duì)數(shù)似然,因此這種參數(shù)估計(jì)的方式就叫做MLE(Maximum Log Likelihood)

4.2 模型的平滑

4.2.1 Add-one

Add-one 是最簡(jiǎn)單、最直觀的一種平滑算法,既然希望沒(méi)有出現(xiàn)過(guò)的N-gram的概率不再是0,那就直接規(guī)定在訓(xùn)練時(shí)任何一個(gè)N-gram在訓(xùn)練預(yù)料至少出現(xiàn)一次(即規(guī)定沒(méi)有出現(xiàn)的,在語(yǔ)料中也出現(xiàn)一次),因此:Countnew(n-gram) = countold(n-gram)+1; 于是對(duì)于n-gram的模型而言,假設(shè)V是所有可能的不同的N-gram的類(lèi)型個(gè)數(shù),那么根據(jù)貝葉斯公式有:

然這里的n-gram的可以相應(yīng)的改成uingram和bigram表達(dá)式,并不影響。其中C(x)為x在訓(xùn)練中出現(xiàn)的次數(shù),wi為給定的訓(xùn)練數(shù)據(jù)中第i個(gè)單詞。
這樣一來(lái),訓(xùn)練語(yǔ)料庫(kù)中出現(xiàn)的n-gram的概率不再為0,而是一個(gè)大于0的較小的概率值,Add-one平滑算法確實(shí)解決了我們的問(wèn)題,但是顯然它也并不完美,由于訓(xùn)練語(yǔ)料中未出現(xiàn)的n-gram數(shù)量太多,平滑后,所有未出現(xiàn)的占據(jù)了整個(gè)概率分布的一個(gè)很大的比例,因此,在自然語(yǔ)言處理中,Add-one給語(yǔ)料庫(kù)中沒(méi)有出現(xiàn)的n-gram分配了太多的概率空間。此外所有沒(méi)有出現(xiàn)的概率相等是不是合理,這也是需要考慮的。

4.2.2 Add-k

由Add-one衍生出來(lái)的另一種算法就是Add-k,既然我們認(rèn)為加1有點(diǎn)過(guò)了,那么我們可以選擇一個(gè)小于1的正數(shù)k,概率計(jì)算公式就可以變成如下表達(dá)式:

它的效果通常會(huì)比Add-one好,但是依舊沒(méi)有辦法解決問(wèn)題,至少在實(shí)踐中,k必須認(rèn)為的給定,而這個(gè)值到底多少該取多少都沒(méi)有辦法確定。

4.2.3 Backoff

回退模型,思路實(shí)際上是:當(dāng)使用Trigram的時(shí)候,如果Count(trigram)滿足條件就使用,否則使用Bigram,再不然就使用Unigram.公式如下,其中d,a和k分別為參數(shù)。k一般選擇為0,但是也可以選其它的值。

4.2.4 Interpolation

Interpolation插值法和回退法的思想非常相似,設(shè)想對(duì)于一個(gè)trigram的模型,我們要統(tǒng)計(jì)語(yǔ)料庫(kù)中“”“I like you”出現(xiàn)的次數(shù),結(jié)果發(fā)現(xiàn)它沒(méi)有出現(xiàn),則計(jì)數(shù)為0,在回退策略中們將會(huì)試著用低階的gram來(lái)進(jìn)行替代,也就是用“l(fā)ike you”出現(xiàn)的次數(shù)來(lái)替代。在使用插值的時(shí)候,我們把不同階層的n-gram的模型線性疊加組合起來(lái)之后再使用,簡(jiǎn)單的如trigram的模型,按照如下的方式進(jìn)行疊加:

4.2.5 Absolute discounting

插值法使用的參數(shù)實(shí)際上沒(méi)有特定的選擇,如果將lamda參數(shù)根據(jù)上下文進(jìn)行選擇的話就會(huì)演變成Absolute discounting。對(duì)于這個(gè)算法的基本想法是,有錢(qián)的,每個(gè)人交固定的稅D,建立一個(gè)基金,沒(méi)有錢(qián)的根據(jù)自己的父輩有多少錢(qián)分這個(gè)基金。比如對(duì)于bigram的模型來(lái)說(shuō),有如下公式。

4.2.6 Kneser-Ney

這種算法是目前一種標(biāo)準(zhǔn)的而且是非常先進(jìn)的平滑算法,它其實(shí)相當(dāng)于前面講過(guò)的幾種算法的綜合。它的思想實(shí)際上是:有錢(qián)的人,每個(gè)人交一個(gè)固定的稅D,大家一起建立一個(gè)基金,沒(méi)有錢(qián)的呢,根據(jù)自己的的父輩的“交際的廣泛”的程度來(lái)分了這個(gè)基金。這里交際的廣泛實(shí)際上是指它父輩會(huì)有多少種不同的類(lèi)型,類(lèi)型越多,這說(shuō)明越好。其定義式為:

其中max(c(X)-D,0)的意思是要保證最后的計(jì)數(shù)在減去一個(gè)D后不會(huì)變成一個(gè)負(fù)數(shù),D一般大于0小于1。這個(gè)公式遞歸的進(jìn)行,直到對(duì)于Unigram的時(shí)候停止。而lamda是一個(gè)正則化的常量,用于分配之前的概率值(也就是從高頻詞匯中減去的準(zhǔn)備分配給哪些未出現(xiàn)的低頻詞的概率值(分基金池里面的基金))。

4.2.7 Modified Kneser-ney

這一種方法是上一種方法的改進(jìn)版,而且也是現(xiàn)在最優(yōu)的方法。上一個(gè)方法,每一個(gè)有錢(qián)的人都交一個(gè)固定的銳,這個(gè)必然會(huì)出現(xiàn)問(wèn)題,就像國(guó)家收稅一樣,你有100萬(wàn)和你有1個(gè)億交稅的量肯定不一樣這樣才是比較合理的,因此將上一種方法改進(jìn)就是:有錢(qián)的每個(gè)人根據(jù)自己的收入不同交不同的稅D,建立一個(gè)基金,沒(méi)有錢(qián)的,根據(jù)自己的父輩交際的廣泛程度來(lái)分配基金。

4.3 最大匹配法

4.3.1 最大前向匹配

設(shè)MaxLen表示最大詞長(zhǎng),D為分詞詞典
(1) 從待切分語(yǔ)料中按正向取長(zhǎng)度為MaxLen的字串str,令Len=MaxLen;
(2) 把str與D中的詞從左往右相匹配;
(3) 若匹配成功,則認(rèn)為該字串為詞,指向待切分語(yǔ)料的指針向前移Len個(gè)漢字,返回到(1);
(4) 若不成功:如果Len>1,則將Len減1,從待切分語(yǔ)料中
取長(zhǎng)度為L(zhǎng)en的字串str,返回到(2)。否則,得到長(zhǎng)度為2的單字詞,指向待切分語(yǔ)料的指針向前移1個(gè)漢字,返回(1)。

4.3.2 最大后向匹配

設(shè)MaxLen表示最大詞長(zhǎng),D為分詞詞典
(1) 從待切分語(yǔ)料中按正向取長(zhǎng)度為MaxLen的字串str,令Len=MaxLen;
(2) 把str與D中的詞從右往左相匹配;

(3) 若匹配成功,則認(rèn)為該字串為詞,指向待切分語(yǔ)料的指針向后移Len個(gè)漢字,返回到(1);
(4) 若不成功:如果Len>1,則將Len減1,從待切分語(yǔ)料中取長(zhǎng)度為L(zhǎng)en的字串str,返回到(2)。否則,得到長(zhǎng)度為2的單字詞,指向待切分語(yǔ)料的指針向后移1個(gè)漢字,返回(1)。

4.3.3 基本原則

顆粒度越大越好:用于進(jìn)行語(yǔ)義分析的文本分詞,要求分詞結(jié)果的顆粒度越大,即單詞的字?jǐn)?shù)越多,所能表示的含義越確切。
切分結(jié)果中非詞典詞越少越好,單字字典詞數(shù)越少越好,這里的“非詞典詞”就是不包含在詞典中的單字,而“單字字典詞”指的是可以獨(dú)立運(yùn)用的單字。

4.4 隱馬爾科夫模型

存在一類(lèi)重要的隨機(jī)過(guò)程:如果一個(gè)系統(tǒng)有N個(gè)狀態(tài)S1,S2,…,SN,隨著時(shí)間的推移,該系統(tǒng)從某一狀態(tài)轉(zhuǎn)移到另一狀態(tài)。如果用q 表示系統(tǒng)在時(shí)間t的狀態(tài)變量,那么,t時(shí)刻的狀態(tài)取值為S(1<=j<=N) 的概率取決于前t-1 個(gè)時(shí)刻(1,2,…,t-1)的狀態(tài),該概率為:
假設(shè)一:如果在特定情況下,系統(tǒng)在時(shí)間t 的狀態(tài)只與其在時(shí)間t-1 的狀態(tài)相關(guān),則該系統(tǒng)構(gòu)成一個(gè)離散的一階馬爾可夫鏈:

假設(shè)二:假設(shè)二:如果只考慮公式(14)獨(dú)立于時(shí)間t的隨機(jī)過(guò)程,即所謂的不動(dòng)性假設(shè),狀態(tài)與時(shí)間無(wú)關(guān),那么:

該隨機(jī)過(guò)程稱(chēng)為馬爾可夫模型。

4.5 維特比算法

(1) 從點(diǎn)S出發(fā),對(duì)于第一個(gè)狀態(tài)X的各個(gè)節(jié)點(diǎn),不妨假定有n個(gè),計(jì)算出S到它們的距離d(S,X),其中X代表任意狀態(tài)1的節(jié)點(diǎn)。因?yàn)橹挥幸徊?#xff0c;所以這些距離都是S到它們各自的最短距離。
(2) 對(duì)于第二個(gè)狀態(tài)X的所有節(jié)點(diǎn),要計(jì)算出從S到它們的最短距離。對(duì)于特點(diǎn)的節(jié)點(diǎn)X,從S到它的路徑可以經(jīng)過(guò)狀態(tài)1的n中任何一個(gè)節(jié)點(diǎn)X,對(duì)應(yīng)的路徑長(zhǎng)度就是d(S,X) = d(S,X) + d(X,X)。由于j有n種可能性,我們要一一計(jì)算,找出最小值。
這樣對(duì)于第二個(gè)狀態(tài)的每個(gè)節(jié)點(diǎn),需要n次乘法計(jì)算。假定這個(gè)狀態(tài)有n個(gè)節(jié)點(diǎn),把S這些節(jié)點(diǎn)的距離都算一遍,就有O(n·n)次計(jì)算。
(3) 接下來(lái),類(lèi)似地按照上述方法從第二個(gè)狀態(tài)走到第三個(gè)狀態(tài),一直走到最后一個(gè)狀態(tài),就得到了整個(gè)網(wǎng)格從頭到尾的最短路徑。每一步計(jì)算的復(fù)雜度都和相鄰兩個(gè)狀態(tài)S和S各自的節(jié)點(diǎn)數(shù)目n,n的乘積成正比,即O(n·n)
(4) 假設(shè)這個(gè)隱含馬爾可夫鏈中節(jié)點(diǎn)最多的狀態(tài)有D個(gè)節(jié)點(diǎn),也就是說(shuō)整個(gè)網(wǎng)格的寬度為D,那么任何一步的復(fù)雜度不超過(guò)O(D),由于網(wǎng)格長(zhǎng)度是N,所以整個(gè)維特比算法的復(fù)雜度是O(N·D)。

5 系統(tǒng)設(shè)計(jì)

5.1 宋詞詞頻統(tǒng)計(jì)

本工程模塊劃分:

函數(shù)名稱(chēng)函數(shù)輸入函數(shù)輸出
get_one_word()宋詞語(yǔ)料庫(kù)單字詞詞典文件
get_two_word()宋詞語(yǔ)料庫(kù)雙字詞詞典文件
Main()程序開(kāi)始程序結(jié)束

表 1 工程一模塊劃分
對(duì)于宋詞詞頻的統(tǒng)計(jì),主要是對(duì)單字詞的統(tǒng)計(jì)和雙字詞的統(tǒng)計(jì)。在宋詞詞頻統(tǒng)計(jì)的系統(tǒng)當(dāng)中,利用兩個(gè)詞典word_dict,word_dict2,分別用于存儲(chǔ)單字詞的詞頻和雙字詞的詞頻信息。

圖 1 統(tǒng)計(jì)單字詞代碼
單字詞基本思想:對(duì)Ci.txt逐行讀取每一個(gè)字,判斷讀取的每一個(gè)字的utf-8編碼是不是在漢字編碼值范圍內(nèi),若在,則為單字詞,將其放入列表。讀取完畢后,用字典對(duì)列表中的所有字進(jìn)行字?jǐn)?shù)統(tǒng)計(jì),若字典中已經(jīng)存在該字,則直接將字典中該字對(duì)應(yīng)的鍵值加一,否則,在字典中新増一個(gè)鍵,鍵為該字,鍵值為1。統(tǒng)計(jì)完畢后,將其排序?qū)懭雴巫衷~.txt中。其中,可設(shè)置一個(gè)特殊符號(hào)字典來(lái)去掉特殊符號(hào),字典如下:
exclude_str = ",。!?、( )【 】 < > 《 》 = : + - * — “ ” … "+ ‘\n’

圖 2 統(tǒng)計(jì)雙字詞代碼
雙字詞基本思想:雙字詞的統(tǒng)計(jì)過(guò)程和單字詞類(lèi)似,因?yàn)榻y(tǒng)計(jì)的是雙字詞,所以判斷條件變成了當(dāng)前讀取的字及其下一個(gè)字是否均為漢字。對(duì)Ci.txt逐行讀取每一個(gè)字,判斷讀取的每一個(gè)字的utf-8編碼及其下一個(gè)字的utf-8編碼是不是都在漢字編碼值范圍內(nèi),若都在,則為雙字詞,將其放入列表。讀取完畢后,用字典對(duì)列表中的所有詞進(jìn)行詞數(shù)統(tǒng)計(jì),若字典中已經(jīng)存在該詞,則直接將字典中該詞對(duì)應(yīng)的鍵值加一,否則,在字典中新増一個(gè)鍵,鍵為該詞,鍵值為1。統(tǒng)計(jì)完畢后,將字典按字頻排序后寫(xiě)入雙字詞.txt中。其中漢字的utf-8編碼范圍是’\u4e00’到’\u9fa5’。此處也可以用正則表達(dá)式去掉。
最后將統(tǒng)計(jì)好的字典按照鍵值對(duì)的大小排列,由大到小寫(xiě)入到文件中去。

5.2 宋詞自動(dòng)生成

本工程模塊劃分:

函數(shù)名稱(chēng)函數(shù)輸入函數(shù)輸出
main()程序開(kāi)始程序結(jié)束
Ui_MainWindow()無(wú)初始化一個(gè)界面對(duì)象
Mywindow()在界面上輸入詞牌名將生成的詞顯示在界面
create_Songci()詞牌名生成詞

表 2 工程二模塊劃分
用PyQt5簡(jiǎn)單的設(shè)計(jì)了一個(gè)界面。

圖 3 PyQt5設(shè)計(jì)的界面
程序第一次運(yùn)行先將工程一中的保存好的“單字詞.txt”和“雙字詞.txt”加載到內(nèi)存中。然后再將宋詞語(yǔ)料庫(kù)加載到內(nèi)存中。因?yàn)樗卧~的固定格式是根據(jù)詞牌名來(lái)的,所以當(dāng)用戶輸入詞牌名時(shí)需要在語(yǔ)料庫(kù)中尋找是否有對(duì)應(yīng)的詞牌名,沒(méi)有則隨機(jī)生成一個(gè)格式的詞。若有相應(yīng)的詞牌名,程序會(huì)根據(jù)系統(tǒng)已有的詞的格式加載到一個(gè)列表中,(格式如下:
[3, ‘,’, 5, ‘?!? 3, ‘,’, 5, ‘?!痌,意識(shí)是先隨機(jī)三個(gè)字或詞,然后逗號(hào),五個(gè)詞,句號(hào)等等)。尋找的詞過(guò)程就是在工程一保存的文件接口中隨機(jī)選擇詞。
起初我設(shè)計(jì)的代碼是這樣的:

圖 4 第一次設(shè)計(jì)的代碼
其中為了滿足格式的要求,用了大量的if-else語(yǔ)句來(lái)符合題意,不適合讀也不適合寫(xiě),后來(lái)優(yōu)化成了以下的方法:

圖 5 第二次設(shè)計(jì)的代碼
這樣設(shè)計(jì)代碼清晰明了,沒(méi)事隨機(jī)選擇一個(gè)數(shù),數(shù)的范圍是1和2,若當(dāng)前的值減去選擇的隨機(jī)數(shù)大于等于零,說(shuō)明可以填一個(gè)詞,那就填詞,否則再次選擇隨機(jī)數(shù)。

5.3 中文詞頻統(tǒng)計(jì)

本工程模塊劃分:

函數(shù)名稱(chēng)函數(shù)輸入函數(shù)輸出
Main()程序開(kāi)始程序結(jié)束
get_one_word()1998-01-2003版-帶音單詞和詞頻文件
get_two_word()1998-01-2003版-帶音雙詞和詞頻文件

表 3 工程三模塊劃分
首先讀取語(yǔ)料庫(kù):1998-01-2003版-帶音.txt,用正則表達(dá)式將語(yǔ)料庫(kù)中的詞性和括號(hào)去掉:

圖 6 用正則表達(dá)式去掉詞性和括號(hào)
單詞并不是一個(gè)字的意思,而是一個(gè)詞或者一個(gè)字,分割之后不能表達(dá)原意的詞,即分割失意的詞。對(duì)得到的text列表逐行讀取,把不是和的詞元素加入到單詞表,把相鄰的兩個(gè)詞組成雙詞放入雙詞表中。

圖 7 統(tǒng)計(jì)單詞和雙詞
對(duì)單雙字詞統(tǒng)計(jì)詞頻完后,進(jìn)行對(duì)一元\二元模型.txt.文件進(jìn)行輸出,填充文件。下一步則是實(shí)驗(yàn)四的內(nèi)容,利用最大向前算法對(duì)句子進(jìn)行切分,在此步驟前要對(duì)后續(xù)輸入的句子進(jìn)行分句處理,目的是以免效率過(guò)低帶來(lái)麻煩。
設(shè)計(jì)思路是:首先在句首和句尾都添加一個(gè)索引,然后尾部的索引逐步往前移,同時(shí)判斷索引間是否為文件中的單字詞,直到索引相遇,如果詞出現(xiàn)在了詞典里,即索引間內(nèi)容是一個(gè)詞,則將其當(dāng)成一個(gè)單字詞,若這個(gè)詞沒(méi)有出現(xiàn)在詞典里,則把這個(gè)字單獨(dú)分開(kāi)。隨后首部索引將定位在我們已經(jīng)劃分過(guò)的詞后面,尾部索引位置依舊是句尾,按上述操作循環(huán)進(jìn)行,直到所有的字都被我們劃入了字詞塊中。
最后程序輸入要查詢(xún)的詞,在創(chuàng)建的接口中查詢(xún),若返回的個(gè)數(shù)不為0,則語(yǔ)料庫(kù)中存在該詞,輸出該詞的詞性(單詞或雙詞)。

5.4 中文詞法分析系統(tǒng)

本工程模塊劃分:

函數(shù)名稱(chēng)函數(shù)輸入函數(shù)輸出
Main()一個(gè)待分析的句子兩種分析結(jié)果
Get_max_forword_split_sentence()一個(gè)待分析的句子最大前向概率劃分的句子
Get_max_backword_split_sentence()一個(gè)待分析的句子最大后向概率劃分的句子

表 4 工程四模塊劃分
程序首先輸入待分析的句子,然后將句子傳遞參數(shù)給分析的兩個(gè)函數(shù)進(jìn)行句子的劃分:
最大前向匹配:
設(shè)MaxLen表示最大詞長(zhǎng),D為分詞詞典
(1) 從待切分語(yǔ)料中按正向取長(zhǎng)度為MaxLen的字串str,令Len=MaxLen;
(2) 把str與D中的詞從左往右相匹配;
(3) 若匹配成功,則認(rèn)為該字串為詞,指向待切分語(yǔ)料的指針向前移Len個(gè)漢字,返回到(1);
(4) 若不成功:如果Len>1,則將Len減1,從待切分語(yǔ)料中
取長(zhǎng)度為L(zhǎng)en的字串str,返回到(2)。否則,得到長(zhǎng)度為2的單字詞,指向待切分語(yǔ)料的指針向前移1個(gè)漢字,返回(1)。

圖 8 最大前向匹配流程圖

圖 9 最大前向匹配代碼實(shí)現(xiàn)
最大后向匹配:
設(shè)MaxLen表示最大詞長(zhǎng),D為分詞詞典
(1) 從待切分語(yǔ)料中按正向取長(zhǎng)度為MaxLen的字串str,令Len=MaxLen;
(2) 把str與D中的詞從右往左相匹配;
(3) 若匹配成功,則認(rèn)為該字串為詞,指向待切分語(yǔ)料的指針向后移Len個(gè)漢字,返回到(1);
(4) 若不成功:如果Len>1,則將Len減1,從待切分語(yǔ)料中取長(zhǎng)度為L(zhǎng)en的字串str,返回到(2)。否則,得到長(zhǎng)度為2的單字詞,指向待切分語(yǔ)料的指針向后移1個(gè)漢字,返回(1)。
逆向最大匹配法從被處理文檔的末端開(kāi)始匹配掃描,每次取最末端的m個(gè)字符(m為詞典中最長(zhǎng)詞數(shù)作為匹配字段,若匹配失敗,則去掉匹配字段最前面的一個(gè)字,繼續(xù)匹配。相應(yīng)地,它使用的分詞詞典是逆序詞典,其中的每個(gè)詞條都將按逆序方式存放。在實(shí)際處理時(shí),先將文檔進(jìn)行倒排處理,生成逆序文檔。然后,根據(jù)逆序詞典,對(duì)逆序文檔用正向最大匹配法處理即可。由于漢語(yǔ)中偏正結(jié)構(gòu)較多,若從后向前匹配,可以適當(dāng)提高精確度。所以,逆向最大匹配法比正向最大匹配法的誤差要小

圖 10 最大后向匹配流程圖

圖 11 最大后向匹配代碼實(shí)現(xiàn)
雙向最大匹配:
將正向最大匹配法得到的分詞結(jié)果和逆向最大匹配法得到的結(jié)果進(jìn)行比較,然后按照最大匹配原則,選取詞數(shù)切分最少的作為結(jié)果。據(jù)研究表明,對(duì)于中文中90.0%左右的句子,正向最大匹配和逆向最大匹配的切分結(jié)果完全重合且正確,只有大概9.0%的句子采用兩種切分方法得到的結(jié)果不一樣,但其中必有一個(gè)是正確的(歧義檢測(cè)成功),只有不到1.0%的句子,或者正向最大匹配和逆向最大匹配的切分結(jié)果雖重合卻都是錯(cuò)的,或者正向最大匹配和逆向最大匹配的切分結(jié)果不同但兩個(gè)都不對(duì)(歧義檢測(cè)失敗)。這正是雙向最大匹配法在實(shí)用中文信息處理系統(tǒng)中得以廣泛使用的原因所在。雙向最大匹配的規(guī)則如下所示:
如果正反向分詞結(jié)果詞數(shù)不同,則取分詞數(shù)量較少的那個(gè)結(jié)果如果分詞結(jié)果詞數(shù)相同,則:
分詞結(jié)果相同,就說(shuō)明沒(méi)有歧義,可返回任意一個(gè)結(jié)果。分詞結(jié)果不同,返回其中單字較少的那個(gè)。實(shí)現(xiàn)代碼如下:

圖 12 雙向匹配代碼實(shí)現(xiàn)

6 系統(tǒng)演示

運(yùn)行工程一中的main.py,輸出結(jié)果在同路徑下的“單字詞.txt”和“雙字詞.txt”

圖 13 工程一結(jié)果截圖

運(yùn)行工程二中的main.py,在文本框中輸入詞牌名,系統(tǒng)自動(dòng)在界面輸出詞的內(nèi)容:如下圖所示

圖 14 工程二結(jié)果截圖
運(yùn)行工程三中的main.py, 系統(tǒng)單詞語(yǔ)料庫(kù).txt文件,自動(dòng)統(tǒng)計(jì)1元模型和2元模型,輸出單詞和詞頻文件,雙詞和詞頻文件。并設(shè)計(jì)相應(yīng)的接口文件,能夠快速載入文件,并檢索單詞和雙詞。輸入詞語(yǔ)返回它是單字詞還是雙字詞并返回詞頻。

圖 15 工程三結(jié)果截圖
運(yùn)行工程四中的main.py, 根據(jù)工程三中構(gòu)建的單詞詞典和雙詞詞典文件接口, 程序輸入待劃分的句子,系統(tǒng)自動(dòng)利用用前向最長(zhǎng)匹配,后向最長(zhǎng)匹配和雙向最長(zhǎng)匹配,來(lái)劃分語(yǔ)句。如下所示:

圖 16工程四結(jié)果截圖

7 課程學(xué)習(xí)心得

谷雨老師是我們自然語(yǔ)言處理課的老師,他上課非常生動(dòng)有趣,我記憶最深刻的是有一堂課講古詩(shī)如何翻譯成英語(yǔ),舉了很多有名的句子,很有趣。我清楚的記得有 “浮世三千,吾愛(ài)有三。日,月與卿。日為朝,月為暮,卿為朝朝暮暮?!?br /> 課程的這四個(gè)實(shí)驗(yàn)都很有意思,自動(dòng)生成宋詞,自動(dòng)斷句,這些都讓第一次接觸自然語(yǔ)言理解的我倍感驚奇。通過(guò)這幾個(gè)實(shí)驗(yàn),使我更加深入的了解了自然語(yǔ)言這門(mén)課程。這幾個(gè)實(shí)驗(yàn)的內(nèi)容都很吸引人,并且這幾個(gè)實(shí)驗(yàn)當(dāng)中都用到了很多上課講過(guò)的算法和思想,在做實(shí)驗(yàn)的過(guò)程當(dāng)中,更加深刻地體會(huì)了這些算法的思想,和如何將他們轉(zhuǎn)換成代碼的形式呈現(xiàn)出來(lái)。通過(guò)實(shí)本次實(shí)驗(yàn),我學(xué)習(xí)到了很多的東西。
通過(guò)對(duì)本門(mén)課的學(xué)習(xí),我對(duì)NLP相關(guān)內(nèi)容有了了解和認(rèn)知。感受到了各類(lèi)日常行為帶來(lái)的信息量,同時(shí)也通過(guò)實(shí)驗(yàn)自己進(jìn)行了操作,對(duì)統(tǒng)計(jì)規(guī)劃方面打下基礎(chǔ)。知道了這一領(lǐng)域的研究涉及自然語(yǔ)言,即人們?nèi)粘J褂玫恼Z(yǔ)言,所以它與語(yǔ)言學(xué)的研究有著密切的聯(lián)系。希望在以后的學(xué)習(xí)路程中,借助學(xué)習(xí)本門(mén)課打下的基礎(chǔ),可以更熟練地探尋各類(lèi)與語(yǔ)言學(xué)相關(guān)的聯(lián)系,可以更好地發(fā)揮所學(xué)的知識(shí),同時(shí)也希望在以后的教學(xué)里,可以更多地提供讓我們親自動(dòng)手進(jìn)行實(shí)驗(yàn)地步驟,增加書(shū)本知識(shí)與實(shí)際操作地結(jié)合時(shí)間,以達(dá)到更好的教學(xué)成果。

參考文獻(xiàn)

  1. 中國(guó)互聯(lián)網(wǎng)信息中心.第48次中國(guó)互聯(lián)網(wǎng)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告[R].中國(guó):CNNIC,2021.
  2. 陳艷平."自然語(yǔ)言處理"課程教學(xué)探索和實(shí)踐[J].科教文匯(上旬刊) ,2020(12):135-136.
  3. 計(jì)算語(yǔ)言學(xué)中的語(yǔ)言模型[J]. 馮志偉,丁曉梅. 外語(yǔ)電化教學(xué). 2021(06)
  4. 生成詞向量的三種方法[J].馮志偉.外語(yǔ)電化教學(xué).2021(01)
  5. Efficient Estimation of Word Representations in Vector Space[J].Tomas Mikolov,Kai Chen 0010,Greg Corrado,Jeffrey Dean.CoRR .2013
  6. 自然語(yǔ)言處理中的預(yù)訓(xùn)練范式[J]. 馮志偉,李穎. 外語(yǔ)研究. 2021(01)
  7. 神經(jīng)網(wǎng)絡(luò)、深度學(xué)習(xí)與自然語(yǔ)言處理[J].馮志偉.上海師范大學(xué)學(xué)報(bào)(哲學(xué)社會(huì)科學(xué)版).2021(02)
  8. 深度學(xué)習(xí)在自然語(yǔ)言處理領(lǐng)域的研究進(jìn)展[J]. 江洋洋,金伯,張寶昌. 計(jì)算機(jī)工程與應(yīng)用. 2021(22)
  9. A broad-coverage challenge corpus for sentence understanding through inference. Williams A,Nangia N,Bowman S R. . 2017

附錄A:源代碼

實(shí)驗(yàn)一

'''
Main.py
Author: Martin
Date: 2022-10-13 19:05:43宋詞詞頻統(tǒng)計(jì)
語(yǔ)料庫(kù): ci.txt
要求: 編程序, 輸入ci, 自動(dòng)分析統(tǒng)計(jì)ci.txt, 統(tǒng)計(jì)宋詞的單字詞, 雙字詞等。
統(tǒng)計(jì)后,輸出的是單字詞和雙字詞的詞典文件。文件中包括相應(yīng)的詞和頻度(次數(shù))。
'''
file_path_in = r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\Ci.txt'
file_path_out_1 = r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\實(shí)驗(yàn)一\單字詞.txt'
file_path_out_2 = r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\實(shí)驗(yàn)一\雙字詞.txt'
exclude_str = ",。!?、( )【 】 < > 《 》 = : + - * — “ ” … " + '\n'def get_one_word():'''寫(xiě)入文件 file_path_out_1'''word_dict = {} #{word:num}ret_word_dict = [] #[(word,num),(word,num)]# 讀文件with open(file_path_in,'r',encoding='utf-8') as fp:# 字典統(tǒng)計(jì)賦值for line in fp:line = line.strip()if len(line) < 10:continuefor char in line:if char not in exclude_str:# 用字典統(tǒng)計(jì)每個(gè)字出現(xiàn)的個(gè)數(shù)和頻率:word_dict[char] = word_dict.get(char,0)+1# 對(duì)字典排序:變成[(word,num),(word,num)]ret_word_dict = sorted(word_dict.items(),key=lambda x : x[1],reverse=True)# print(ret_word_dict)with open(file_path_out_1,'w',encoding='utf-8') as fp:for item in ret_word_dict:fp.write(item[0])fp.write('\t')fp.write(str(item[1]))fp.write('\n')def get_two_word():'''寫(xiě)入文件 file_path_out_2'''word_dict = {} #{words:num}ret_word_dict = [] #[(words,num),(words,num)]# 讀文件with open(file_path_in,'r',encoding='utf-8') as fp:# 字典統(tǒng)計(jì)賦值for line in fp:line = line.strip()if len(line) < 10:continuefor i in range(len(line)-1):# 確保是漢字編碼if '\u4e00'<=line[i]<='\u9fa5' and '\u4e00'<=line[i+1]<='\u9fa5':# 用字典統(tǒng)計(jì)每個(gè)字出現(xiàn)的個(gè)數(shù)和頻率:word_dict[line[i]+line[i+1]] = word_dict.get(line[i]+line[i+1],0)+1# 對(duì)字典排序:變成[(word,num),(word,num)]ret_word_dict = sorted(word_dict.items(),key=lambda x : x[1],reverse=True)# print(ret_word_dict)with open(file_path_out_2,'w',encoding='utf-8') as fp:for item in ret_word_dict:fp.write(item[0])fp.write('\t')fp.write(str(item[1]))fp.write('\n')def main():get_one_word()get_two_word()
if __name__ == '__main__':main()

實(shí)驗(yàn)二:
Ui_test2.py

'''
Author: Martin
Date: 2022-10-17 20:58:36
'''
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'd:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\實(shí)驗(yàn)二\test2.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("2020210593李海躍")MainWindow.resize(683, 383)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(580, 40, 75, 23))self.pushButton.setObjectName("pushButton")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(240, 35, 171, 21))self.label.setObjectName("label")self.textEdit_1 = QtWidgets.QTextEdit(self.centralwidget)self.textEdit_1.setGeometry(QtCore.QRect(270, 70, 161, 31))self.textEdit_1.setObjectName("textEdit_1")self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)self.textEdit_2.setGeometry(QtCore.QRect(110, 130, 481, 141))self.textEdit_2.setObjectName("textEdit_2")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 683, 26))self.menubar.setObjectName("menubar")self.menu2020210593 = QtWidgets.QMenu(self.menubar)self.menu2020210593.setObjectName("menu2020210593")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.menubar.addAction(self.menu2020210593.menuAction())self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.pushButton.setText(_translate("MainWindow", "Create!"))self.label.setText(_translate("MainWindow", "        請(qǐng)輸入詞牌名"))self.menu2020210593.setTitle(_translate("MainWindow", "2020210593"))

main.py

'''
Author: Martin
Date: 2022-10-17 20:09:59宋詞自動(dòng)生成
語(yǔ)料庫(kù):ci.txt
要求: 輸入詞牌,基于宋詞的詞典和宋詞的詞牌,可以隨機(jī)或者按照語(yǔ)言模型,自動(dòng)生成宋詞。設(shè)計(jì)相應(yīng)的Ui或者Web界面。'''
import random
from Ui_test2 import Ui_MainWindow
import sys
from PyQt5 import QtWidgets
import re# 主界面
class Mywindow(QtWidgets.QMainWindow):def __init__(self):QtWidgets.QMainWindow.__init__(self)self.ui = Ui_MainWindow()self.ui.setupUi(self)self.ui.pushButton.clicked.connect(self.btn_action)def btn_action(self):Ci_pai_name = self.ui.textEdit_1.toPlainText()ret = create_Songci(Ci_pai_name)self.ui.textEdit_2.setText('') #寫(xiě)入空,清除作用self.ui.textEdit_2.setText(ret) #寫(xiě)入def create_Songci(Ci_pai_name):file1 = open(r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\實(shí)驗(yàn)一\單字詞.txt', 'r', encoding='utf-8')file2 = open(r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\實(shí)驗(yàn)一\雙字詞.txt', 'r', encoding='utf-8')file1 = file1.read().replace('\n','\t').split('\t') #['人', '13449', '風(fēng)', '12875', '花', '11627', '一', '11502']file2 = file2.read().replace('\n','\t').split('\t')# 返回的字符串  \t\n控制輸出格式ret_str = '\t'+'\t'+'    '+Ci_pai_name + '\n' +'\n'# 根據(jù)詞牌名,查找輸出格式。file3 = open(r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\Ci.txt', 'r', encoding='utf-8')file3 = file3.read().split('\n')file3 = [x for x in file3 if x != '']# print(file3) #['酒泉子', '長(zhǎng)憶錢(qián)塘,不是人寰是。']# 尋找詞牌的位置try:id = file3.index(Ci_pai_name)except:#沒(méi)找到return '詞庫(kù)未找到該詞牌名'# 詞牌格式是id+1的位置item = file3[id+1]count_tmp = 0 #記錄每個(gè)短句的個(gè)數(shù)Ci_form = [] # 詞的格式[4, ',', 7, '。', 7, '。', 5, '。', 7, '。', 7, '。', 7, '。', 5, '。']for i in range(len(item)):if item[i] in ',。、( )':Ci_form.append(count_tmp)Ci_form.append(item[i])count_tmp = 0else:count_tmp += 1print('Ci_form',Ci_form)#[4, ',', 7, '。', 7, '。', 5, '。', 7, '。', 7, '。', 7, '。', 5, '。']# 按照格式隨機(jī)選擇生成詞for item in Ci_form:print(item)if str(item) in ',。、()(){}::“” ':ret_str += item# 第一次寫(xiě)的廢物代碼,n個(gè)if# else:#     if item == 2:#         tmp = random.randint(0,2*len(file2))#         ret_str += file2[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]#     # 三個(gè)字#     elif item == 3:#         tmp = random.randint(0,2*len(file1))#         ret_str += file1[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]#         # 因?yàn)樽值涫?['人', '13449', '風(fēng)', '12875', '花', '11627', '一', '11502']#         # 保證是漢字而不是數(shù)字,下面同理#         tmp = random.randint(0,2*len(file2))#         ret_str += file2[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]#     # 四個(gè)字#     elif item == 4:#         for i in range(2):#             tmp = random.randint(0,2*len(file2))#             ret_str += file2[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]#     # 五個(gè)字#     elif item == 5:#         for i in range(3):#             if i==1:#                 tmp = random.randint(0,2*len(file1))#                 ret_str += file1[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]#             else:#                 tmp = random.randint(0,2*len(file2))#                 ret_str += file2[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]#     # 六個(gè)字#     elif item == 6:#         for i in range(3):#             tmp = random.randint(0,2*len(file2))#             ret_str += file2[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]#     # 七個(gè)字#     elif item == 7:#         for i in range(4):#             if i==2:#                 tmp = random.randint(0,2*len(file1))#                 ret_str += file1[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]#             else:#                 tmp = random.randint(0,2*len(file2))#                 ret_str += file2[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]else:while item > 0:R_int = random.randint(1,3)if item - R_int >= 0: #可以填詞if R_int == 1: #加一個(gè)詞tmp = random.randint(0,2*len(file1))ret_str += file1[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]item -= 1else:# 加兩個(gè)詞tmp = random.randint(0,2*len(file2))ret_str += file2[tmp//2 if (tmp//2)%2==0 else (tmp//2)-1]item -= 2print('ret_str')print(ret_str)return ret_strdef main():create_Songci('酒泉子')if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)mywindow = Mywindow()mywindow.show()sys.exit(app.exec_())
main()

實(shí)驗(yàn)三
Main.py

'''
Author: Martin
Date: 2022-10-17 21:18:40中文詞頻統(tǒng)計(jì)
語(yǔ)料庫(kù):1998-01-2003版-帶音.txt 
要求:輸入txt文件,統(tǒng)計(jì)1元模型和2元模型,輸出單詞和詞頻文件,雙詞和詞頻文件。設(shè)計(jì)相應(yīng)的接口,能夠快速載入文件,并檢索單詞和雙詞。
'''
import re
import collectionsfile_path_in = r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\199801.txt'
file_path_out_1 = r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\實(shí)驗(yàn)三\單詞.txt'
file_path_out_2 = r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\實(shí)驗(yàn)三\雙詞.txt'text = []
oneWords = []
twoWords = []
one_counter_list = []
two_counter_list = []def get_one_and_two_word():'''讀入文件寫(xiě)入文件'''global one_counter_listglobal two_counter_listglobal oneWordsglobal twoWords# 讀文件with open(file_path_in,'r',encoding='utf-8') as fp:line = fp.read().split('\n')# 去掉詞性,存入列表for one in line:fil = re.compile("(/[a-z]*\\s{0,})")one = fil.split(one)one = one[1:] #去掉 時(shí)間one = one[1::2] #去掉 /mtest = []test.append('<b>')# 去掉括號(hào)for i in range(len(one)):word = one[i]fil = re.compile(r"\{.*?\}|\[.*?\]|\(.*?\)")word = fil.sub('', word)word = ''.join(word)if len(word) < 1:continuetest.append(word)test.append('<e>')# 除了<b><e>,還有字if len(test) > 2:text.append(test)#print(text) #[[['<b>', '邁向', '充滿', '希望', '的', '新', '世紀(jì)', '——', '一九九八年', # '新年', '講話', '(', '附', '圖片', '1', '張', ')', '<e>'], ['<b>', '中共中央']# 把單詞和雙詞存入列表for line in text:for i in range(len(line)):if not line[i] == '<b>' and not line[i] == '<e>':oneWords.append(line[i])if i + 1 < len(line):twoWords.append(line[i] + line[i+1])global one_counter_listglobal two_counter_listone_counter_list = collections.Counter(oneWords)two_counter_list = collections.Counter(twoWords)one_counter_dict = dict(one_counter_list)two_counter_dict = dict(two_counter_list)# 對(duì)字典排序:變成[(word,num),(word,num)]tmp_dict = sorted(one_counter_dict.items(),key=lambda x : x[1],reverse=True)with open(file_path_out_1,'w',encoding='utf-8') as fp:for item in tmp_dict:fp.write(item[0])fp.write('\t')fp.write(str(item[1]))fp.write('\n')tmp_dict = sorted(two_counter_dict.items(),key=lambda x : x[1],reverse=True)with open(file_path_out_2,'w',encoding='utf-8') as fp:for item in tmp_dict:# print(item)fp.write(item[0])fp.write('\t')fp.write(str(item[1]))fp.write('\n')
def main():get_one_and_two_word()while True:name = input("請(qǐng)輸入你要查找的詞:")if (one_counter_list[name] == 0) and (two_counter_list[name] == 0):print("未找到該詞,請(qǐng)重新輸入")elif two_counter_list[name] != 0:print("該單詞是雙詞")print("該詞數(shù)量為:", two_counter_list[name])elif one_counter_list[name] != 0:print("該單詞是單詞")print("該詞數(shù)量為:", one_counter_list[name])if __name__ == '__main__':main()

實(shí)驗(yàn)四
main.py

'''
Author: Martin
Date: 2022-10-17 22:36:19
中文詞法分析系統(tǒng)
語(yǔ)料庫(kù):1998-01-2003版-帶音.txt
要求:根據(jù)構(gòu)建的單詞詞典和雙詞詞典,用n-gram模型,或者前向最長(zhǎng)匹配,或者后向最長(zhǎng)匹配等算法,
鼓勵(lì)用更復(fù)雜一些的方法來(lái)進(jìn)行,包括隱馬爾科夫模型和條件隨機(jī)場(chǎng)模型。
'''file_path_in = r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\199801.txt'
file_path_out_1 = r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\實(shí)驗(yàn)三\單詞.txt'
file_path_out_2 = r'D:\a表格\課件\大三上\自然語(yǔ)言處理\實(shí)驗(yàn)\實(shí)驗(yàn)三\雙詞.txt'file1 = open(file_path_out_1, 'r', encoding='utf-8')
file2 = open(file_path_out_2, 'r', encoding='utf-8')
file1 = file1.read().replace('\n','\t').split('\t') #['人', '13449', '風(fēng)', '12875', '花', '11627', '一', '11502']
file2 = file2.read().replace('\n','\t').split('\t')file1_dict = dict(zip(file1[0::2],file1[1::2])) #{',': '73350', '的': '53572'}
file2_dict = dict(zip(file2[0::2],file2[1::2]))
# 合并兩個(gè)詞典
mix_file1_and_file2_dict = {**file1_dict,**file2_dict}
# print(mix_file1_and_file2_dict.keys())#實(shí)驗(yàn)四,利用最大向前對(duì)句子進(jìn)行切分
def Get_max_forword_split_sentence(texts):import re# 分句result_text = []texts = re.split('"(:|。|,| |?|!)"',texts)for text in texts:# 初始化索引text_begin = 0  #句子的開(kāi)始text_end = len(text) #句子的結(jié)束while text_begin < len(text):if text_begin <= text_end:# 如果存在最長(zhǎng)的匹配if text[text_begin:text_end] in mix_file1_and_file2_dict.keys():#print(text[text_begin:text_end])tmp_string = text[text_begin:text_end]result_text.append(tmp_string)text_begin += len(tmp_string)text_end = len(text)# 如果不存在else:text_end -= 1# 匹配完成else:# 就剩一個(gè)字了,語(yǔ)料庫(kù)也沒(méi)找到,直接入#result_text.append(text[text_end])text_begin += 1res = ''for word in result_text:res += word + '/'return res
#實(shí)驗(yàn)四,利用最大后向?qū)渥舆M(jìn)行切分
def Get_max_backword_split_sentence(texts):import re# 分句result_text = []texts = re.split('"(:|。|,| |?|!)"',texts)for text in texts:text_begin = 0text_end = len(text)while text_end > 0:if text_begin<=text_end:# 如果存在最長(zhǎng)的匹配if text[text_begin:text_end] in mix_file1_and_file2_dict.keys():# print(text[text_begin:text_end])tmp_string = text[text_begin:text_end]result_text.append(tmp_string)text_end -= len(tmp_string)text_begin = 0# 如果不存在else:text_begin += 1# 匹配完成else:# 就剩一個(gè)字了,語(yǔ)料庫(kù)也沒(méi)找到,直接入#result_text.append(text[text_begin])text_end -= 1 res = ''for word in result_text[::-1]:res += word + '/'return res
def main():textsssssssss = ['中國(guó)的合作交流不斷擴(kuò)大,經(jīng)濟(jì)實(shí)力不斷增強(qiáng),要堅(jiān)強(qiáng)']textsssssssss = ['我是一名計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生']textsssssssss = ['雙向最大匹配法是將正向最大匹配法得到的分詞結(jié)果和逆向最大匹配法得到的結(jié)果進(jìn)行比較,']for texts in textsssssssss:forword = Get_max_forword_split_sentence(texts)backword = Get_max_backword_split_sentence(texts)# backword = 'w /ni/我'·print('利用最大向前對(duì)句子進(jìn)行切分: ',forword)print('利用最大后向?qū)渥舆M(jìn)行切分: ',backword)one_word_in_forword = len([x for x in forword.split('/') if len(x)==1])one_word_in_backword = len([x for x in backword.split('/') if len(x)==1])print(one_word_in_forword,one_word_in_backword)if one_word_in_forword<=one_word_in_backword:print('系統(tǒng)認(rèn)為最大后向匹配較好')return forwordprint('系統(tǒng)認(rèn)為最大前向匹配較好')return backword#Max_forword_split_sentence
if __name__ == '__main__':main()
http://m.risenshineclean.com/news/57939.html

相關(guān)文章:

  • 網(wǎng)站建設(shè)保教長(zhǎng)沙seo優(yōu)化哪家好
  • 網(wǎng)站怎樣制作seo網(wǎng)站優(yōu)化方案摘要
  • 制作網(wǎng)站首頁(yè)的步驟永久開(kāi)源的免費(fèi)建站系統(tǒng)
  • 臺(tái)州做網(wǎng)站的公司有哪些公司電子商務(wù)平臺(tái)建設(shè)
  • 幫朋友做網(wǎng)站 知乎seo概念的理解
  • 怎樣查網(wǎng)站用什么程序做的今天頭條新聞100條
  • 自己的網(wǎng)站在哪里找線上推廣渠道
  • 怎么看網(wǎng)站源碼用什么做的營(yíng)銷(xiāo)廣告文案
  • 怎么做視頻網(wǎng)站賺錢(qián)嗎長(zhǎng)春網(wǎng)站提升排名
  • 怎樣做私人網(wǎng)站重慶今天剛剛發(fā)生的重大新聞
  • 自己做的網(wǎng)站怎么連接計(jì)算機(jī)網(wǎng)絡(luò)推廣策劃案
  • 替人做賭彩網(wǎng)站被判刑外鏈推廣軟件
  • php網(wǎng)站用到的知識(shí)紹興百度seo
  • 百度首頁(yè)網(wǎng)站的設(shè)計(jì)詞語(yǔ)搜索排行
  • 網(wǎng)站建設(shè)說(shuō)課獲獎(jiǎng)視頻seo優(yōu)化排名百度教程
  • 鹽城市濱海縣建設(shè)局網(wǎng)站seo搜索引擎優(yōu)化名詞解釋
  • 如何做外貿(mào)網(wǎng)站自動(dòng)seo優(yōu)化
  • 外貿(mào)網(wǎng)站開(kāi)發(fā)定制廣東廣州網(wǎng)點(diǎn)快速網(wǎng)站建設(shè)
  • 怎么做網(wǎng)站美工宣傳推廣渠道有哪些
  • 山西企業(yè)網(wǎng)站建設(shè)網(wǎng)站注冊(cè)地址
  • 設(shè)計(jì)門(mén)戶網(wǎng)站seo網(wǎng)站診斷流程
  • 柯橋建設(shè)局網(wǎng)站制作一個(gè)簡(jiǎn)單的網(wǎng)站
  • 網(wǎng)站開(kāi)發(fā)的報(bào)告自己怎么做網(wǎng)站網(wǎng)頁(yè)
  • 做banner的在線網(wǎng)站最常見(jiàn)企業(yè)網(wǎng)站公司有哪些
  • 做淘寶客網(wǎng)站能接廣告嗎關(guān)鍵詞seo是什么
  • wordpress 宕機(jī)原因南山網(wǎng)站seo
  • 深圳龍崗區(qū)寶龍街道正規(guī)seo多少錢(qián)
  • 長(zhǎng)沙網(wǎng)站開(kāi)發(fā)培訓(xùn)學(xué)校百度客戶端下載安裝
  • 做網(wǎng)站用html網(wǎng)絡(luò)營(yíng)銷(xiāo)師有前途嗎
  • 做企業(yè)網(wǎng)站備案都需要什么資料廈門(mén)seo優(yōu)化外包公司