深入浅出不可思议的中文分词技术
親愛的喵喵們,明天小夕就正式開學啦。開學后每周有幾天的課比較多,小夕為了保證每篇文章的質量,可能做不到每天一更啦。但是小夕也會盡量擠出時間來寫文章,盡量保證兩三天更一篇。希望不要責怪小夕哦...
分詞,也叫切詞,即通過某種方式將句子中的每個詞語識別并切分開來。分詞技術不僅僅適用于中文哦,對于日文、韓文等語言也同樣適用。在某些特殊場景如手寫識別,自帶分詞屬性的英語會因連字而變得分詞界限模糊,此時也是需要靠分詞技術解決的。
?
其實呢,分詞技術,想一下的話會覺得很難,再想一下又會覺得簡單,再思考細節又覺得很難。真正研究起來又會發現很簡單QAQ。
難
一開始覺得難是因為沒有想到“詞典”這個好東西。沒有詞典的話,好像從那么多計算機看起來長得一樣的文字中切成一個個的詞是不可思議的(在計算機看來,每個字都是一串01)。
?
簡單
?
然而想到了詞典,就覺得容易啦。直接從一個句子的開頭第一個開始,然后查詞典不就好啦~比如“我是機智的小夕”,查詞典時發現沒有“我是”這個詞,于是在“我”和“是”之間畫一道線。
?
然后再查“是機”,發現也沒有。于是在“是”和“機”之間也劃一道。
?
再查“機智”,誒?有了!于是再查“機智的”,發現沒有這個詞。那就在“機智”和“的”之間劃一道!
?
假如詞典很智能,也能收錄人名。于是“我|是|機智|的|小夕”就完成啦~
?
難
?
然而問題來了。如果采用查字典的辦法,“發展中國家”會怎樣分呢?顯然從左到右查字典后會變成這樣“發展|中國|家”。這顯然是不對的呀。(敢說不知道“發展|中|國家”,小夕打你哦)
?
再仔細一想,好像這種情況非常多。
?
怎么解決呢?有人說那就從右往左,有人說那就從中間往兩頭,也有語言學家開始試圖編寫文法規則。
?
但是問題難度爆炸了,各種天馬行空的改良效果都很一般。
?
簡單
直到某個大師將統計語言模型用在了分詞技術上!
?
那么什么是統計語言模型呢?
?
統計語言模型其實就是通過計算一個條件概率鏈來計算出一個句子出現的概率,并將概率的大小抽象為這個句子的得分。出現概率越大的句子,得分越高,句子越正常。反之得分低的句子越不正常,或者說人類一般不會表達這樣的句子。
?
比如“的那問樹你發可非受的”這個亂打的句子,利用統計語言模型,可以計算出這個句子的得分非常低,說明這是個不正常的句子。而“今天天氣怎么樣”這個句子的得分就會非常高。
高能部分
怎么做到計算句子得分/概率的呢?
?
假設一個句子有n個基元(基元即句子的組成單位,有時可以認為是字,有時認為是詞,有時是短語等),該句子就可以表示為w1w2w3…wn?,則該句子的概率就等于
?
P=p(w1)p(w2|w1)p(w3|w1w2)…p(wn|w1w2…wn-1)
?
這個公式的意思就是:(第一個詞w1出現的概率)*(當第一個詞w1出現時,出現第二個詞w2的概率)*(前兩個出現的詞分別是w1,w2時,出現w3的概率)*…
?
然而這個概率的計算代價實在太大了,計算最后一個詞的出現概率時要考慮之前所有的詞已經出現的歷史。除了計算代價外,還會帶來一些其他問題,因此我們可以限定參考的歷史詞的數量,來近似句子的概率。比如我們限定為1,此時句子的概率等于
?
P=p(w1)p(w2|w1)p(w3|w2)…p(wn|wn-1)
?
這條概率鏈就是隨機過程中講的一階馬爾可夫鏈。看,這樣是不是計算量少多啦?此時的語言模型被稱為2-gram模型。
?
同理,若將歷史詞的數量限定為2,則句子的概率就是二階馬爾可夫鏈,此時的語言模型被稱為3-gram模型。
?
若完全不考慮歷史詞,則此時句子概率計算的考慮就成了基元相互獨立的情況了,此時稱為1-gram模型。此時的概率
?
P=p(w1)p(w2)p(w3)…p(wn)
?
經過小夕的精彩講解依然沒有理解統計語言模型的喵喵可以求助wiki或者查詢“自然語言處理”或“信息檢索”領域的相關書籍哦。
?
基于統計語言模型的分詞方法有很多種,小夕在這里只講一種最容易理解的思路。
?
首先,每個詞(基元)出現的概率不是憑空就知道的,往往是通過大量樣本從統計方法(別看成統計學習!這里跟機器學習沒有半毛錢關系!)近似得到的。
?
比如,我們手頭有人民日報的最近十年的報紙,然后我們把其中所有的句子存在電腦里作為我們的語料庫。
?
然后我們通過某種比較low的不需要語言模型的方法,比如前面提到的查字典的方法,來對人民日報大語料庫進行分詞(一種效果比較好的方法是后向匹配,即從每個句子的末尾開始往前查字典。且更長的詞能匹配到,就放棄已查到的短詞)。
?
可想而知,很多句子都分詞分得不對,但是這不影響我們統計每個詞出現的概率。當語料庫足夠大時,那些被分錯的詞的影響就近乎忽略了。(不理解的喵喵請補概率論的大數定理)
?
于是我們從語料庫中得到了每個詞的出現次數,然后除以語料庫中所有的詞,即得到每個詞的出現概率。因此很容易理解,對于“女生”這個詞的出現概率會非常大,而對于“嘎瑪”這個奇怪的詞的出現概率會非常小。單獨出現一個“貓”的概率非常大,而單獨出現一個“生”的概率會非常小。
?
基于上面得到的每個詞的出現概率,我們計算“北京大學生”的正確分詞結果。
?
我們首先列舉出其所有的分詞可能性,比如
“北|京大|學|生”;
“北|京|大|學|生”;
“北京|大|學生”;
“北京|大學|生”;
“北京大學|生”等~
小夕不一一列舉啦。
?
然后利用統計語言模型計算每個分詞結果的得分。此時小夕為了講解方便,設語言模型為前面高能部分中的1-gram模型,此時每個句子的得分即每個詞出現的概率的乘積(無需考慮條件概率)。而剛才講了,我們已經從語料庫中得到了每個詞出現的概率。
?
于是一經計算,妖怪就原形畢露啦~比如“北|京大|學|生”的概率會非常低,因為單獨出現“北“,單獨出現“京大”、“學”、“生”這些詞的概率都非常小,所以乘起來的結果自然就很小啦~所以這個句子的得分很低。
?
同樣的道理,對于“北京|大學生”這個句子,得分就會很高。因為“北京”的出現概率很大,“大學生”的概率也很大。而“北京大學|生”這種分法的話,雖然“北京大學”的概率比較大,但單獨一個“生”的概率很小,乘起來之后會比“北京|大學生”的值小很多!所以“北京大學|生”被干掉咯。
?
所以,最終得分最高的句子,也就是出現概率最大的句子,自然是“北京|大學生”啦~
?
完!美!收!工!
最后感謝一位喵喵提醒小夕的轉賬二維碼太小導致有的手機掃不出QAQ,小夕將二維碼放大啦。你們的支持是小夕寫出精彩文章的動力哦~
總結
以上是生活随笔為你收集整理的深入浅出不可思议的中文分词技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot中使用Redis数
- 下一篇: 使用Intellij中的Spring I