777
技術社區[雲棲]
【BABY夜談大數據】淺談中英文分詞
前言
《BABY大數據》已經和豆瓣簽約並會在豆瓣上連載哦,歡迎大家都豆瓣上訂閱。本章之後將會在豆瓣上收費,博客上仍然提供免費閱讀,我自己也是在開源社區下成長起來的就當做回饋開源社區吧!如果你喜歡本書或者想要支持我,可以直接在豆瓣購買哦!https://read.douban.com/column/3346397/
因為有朋友反饋說看懂了算法但不知道怎麼用,所以簡單地說下自己的寫作計劃吧,《BABY夜讀大數據》會從基礎的一些概念講解然後逐漸到應用、實際案例。預計30章左右,每一到兩周更新一篇。
前麵兩章都反複提到了分詞,甚至相關算法都很依賴分詞,那麼分詞是什麼呢?這裏的分詞可不是英語中那個“具有動詞及形容詞二者特征的詞”哦,而且是切切實實的將一個句子拆分成詞。
我們在收集數據的時候常常會碰到一個問題,那就是如何處理人話(自然語言),人說的是人話,自然在網上也是使用人話交流,你總不可能讓用戶寫著代碼交流吧?發一句“你好,今天天氣不錯”要寫成“{"你好",",","今天","天氣","不錯"}”,我想這回是個噩夢吧。
我們經常在大數據中講數據挖掘,挖掘出數據中的潛在價值,然而數據挖掘最重要的就是要先讓計算機理解人話,就跟我們小時候學說話寫字一樣,先從詞學起然後將詞根據固定的語法組裝成句子。所謂分詞其實就是反其道而行,將組裝好的一句話拆成不同的詞再進行分詞什麼是主語、賓語、哪些是名詞、哪些又是形容詞。
比如我們看到“小明討厭黑色的杯子”,正常人看到後都能很快知道小明討厭黑色的杯子。對於計算機來說就必須先將這個句子拆開來:
小明/討厭/黑色/的/杯子
比如說百度貼吧在輸入跟廣告有關的詞語時就會在這個帖子回複的下一層顯示出相關的廣告,也被一眾貼吧網友稱為“大召喚術”。
這就是一個典型的利用分詞達到的功能,通過將用戶的帖子標題和內容進行分詞,然後根據分詞結果看看有沒有詞是屬於廣告列表然後進行推薦。
每一種語言基本都有自己的分詞方式,這裏就隻講解中文和英文。中文和英文一定要分開來講解,甚至可以說中文是最難分詞的語言之一。
英文分詞
由於英語的基本組成單位就是詞,所以相對來說簡單很多。
大致分為三步:
根據空格拆分單詞
排除停止詞(Stop Word)
提取詞幹(Stemming)
1、根據空格拆分單詞
這一步是是最簡單的一步,英語的句子基本上就是由標點符號、空格和詞構成,那麼隻要根據空格和標點符號將詞語分割成數組即可。
如“Nobody knows how ancient people started using fire”分割成{"Nobody","knows","how","ancient","people","started","using","fire"}。
2、排除停止詞
停止詞,是由英文單詞:stopword翻譯過來的,原來在英語裏麵會遇到很多a,the,or等使用頻率很多的字或詞,常為冠詞、介詞、副詞或連詞等。如果搜索引擎要將這些詞都索引的話,那麼幾乎每個網站都會被索引,也就是說工作量巨大。可以毫不誇張的說句,隻要是個英文網站都會用到a或者是the。那麼這些英文的詞跟我們中文有什麼關係呢? 在中文網站裏麵其實也存在大量的stopword,我們稱它為停止詞。比如,我們前麵這句話,“在”、“裏麵”、“也”、“的”、“它”、“為”這些詞都是停止詞。這些詞因為使用頻率過高,幾乎每個網頁上都存在,所以搜索引擎開發人員都將這一類詞語全部忽略掉。如果我們的網站上存在大量這樣的詞語,那麼相當於浪費了很多資源。
常見停止詞請看附錄:https://www.cybermkd.com/stop-word-list/
如{"Nobody","knows","how","ancient","people","started","using","fire"}去掉停止詞後得到 {"Nobody","ancient","people","started","fire"}
3、提取詞幹
提取詞幹是西方語言特有的處理,比如說英文單詞有 單數複數的變形,-ing和-ed的變形,但是在計算相關性的時候,應該當做同一個單詞。比如 apple和apples,doing和done是同一個詞,提取詞幹的目的就是還原成最基本的詞。
同時我們可以將所有的大小寫統一。
{"Nobody","ancient","people","started","fire"}處理成{"nobody","ancient","people","start","fire"}
經過上麵三個步驟基本上一個英文句子就處理完了。
中文分詞
對於中文而言,詞是承載語義的最小單元,由詞構成語句,又由語句構成篇章。但是,中文文本是由連續的字序列構成,詞與詞之間是沒有天然的分隔符 ,所以中文分詞相對來說困難很多。中文分詞目前來說基本上都還是基於分詞用的詞典來進行分詞的,將字和字組成不同的詞然後放入詞典中查找。
中文分詞麵臨著相當多的挑戰,首當其衝的就是歧義問題,不同的分割方式會導致不同的意思。
如:結婚/的/和尚/未/結婚/的 和 結婚/的/和/尚未/結婚/的
還有個重要的挑戰就是未登錄詞,用人話就是沒有收錄進詞典的詞,人名就是最簡單的例子,還有就是網友發明的詞,諸如:“草泥馬”、“不明覺厲”之類雲雲。
所以一個好的分詞詞典是決定中文分詞質量的關鍵,還有就是做中文分詞的話必須經常更新、與時俱進。
大致可以將中文分詞算法分為兩種:
1、詞典分詞
詞典分詞簡單來說就是直接將句子拆成字,然後字和字組合進入詞典中匹配,這種方式雖然簡單直接但是容易引起歧義問題。
2、基於統計的分詞
通過人工標注,對中文建模然後將準備好的語料進行訓練,通過計算不同階段下出現的概率並選出概率最大的情況作為結果來進行分詞。
這種分詞方法雖然能盡量避免分詞導致的歧義,但卻需要耗費相當大的性能。
還有一種是基於語義,但是目前還沒有很好的方案所以姑且不議。
在常見的分詞中建議是使用第一種,並且將常見的、唯一的詞如地名、人名等等先單獨建個詞庫,分詞前先將這些詞提取出來然後再進行分詞。然後可以針對自身的情況的建一個歧義糾正詞庫,將一些分詞結果進行糾正。
如分詞結果為“王/小明”(這個名字在未登錄的情況下),但是在糾正詞庫中已經記錄了“王小明”,所以最終結果為“王小明”。
最後更新:2017-07-13 18:02:29