自然語言處理(NLP)的基本概念 (未完待續)

由於工作需要,俺近期一直在學習自然語言處理相關的技術。主要是看英文資料,包括經典書籍,論文,網頁博客之類。不得不說,俺感覺這個領域有點黑啊! 因爲沒有很好的快速入門資料,要麼你得慢慢啃二三百頁的書,要麼就是看看論文裏說的天花亂墜,各種基本概念直接用,啥也看不懂。中文資料少,英文資料看得又慢。在這個老闆今天要你學新技術明天就得出設計圖的坑爹時代,哪有時間啃磚頭啊?這是要把俺們這種零基礎的人往絕路上逼啊!


所以在俺痛苦掙扎之後,決定要幫助可憐的同行們開闢一條活路,把俺學習的東西總結一下,以後好應付老闆那廝們。不過醜話說在前頭,俺學的是英文語言的處理,對中文的不熟,所以這裏講的概念都是以英文爲基礎的,純是因爲工作需要,鳥人們別說俺不愛國啥的,跟那沒關係。


廢話少說,直接進入正題:


1. 分詞 (Tokenization)

NLP裏最基礎的概念了,一切都從這裏開始。Token就是符號,包括單詞和標點兩種。Tokenization就是把一句話或者一段話分解成單個的單詞和標點。比如說:

I hate my boss.

這句話,分詞之後就成了:

['I', 'hate', 'my', 'boss', '.']

這樣一個五元數組。注意最後的句點也算啊。


2. 詞幹提取 (Stemming)

把各種詞形統一到一個基礎詞形。英文單詞有各種單數,複數,時態等等變化,比如:

run 就有 run, runs, running, ran; take 有 take, takes, taking, taken, took 等等不同的形態。洋鬼子懶,能用現成的詞就不發明新詞了,哪像我們苦逼的,啊不是,勤勞的老祖宗倉頡任勞任怨,絕不偷懶。所以給你一句洋文,你的處理程序要處理其中各種單詞的各種可能形態,這明顯是坑爹。爲了讓我們碼農的日子好過一點,我們就發明了一個簡單粗暴的方法:

不管你句子裏的詞是什麼形態,老子的字典裏就一種形態:基本型,老子沒時間考慮什麼過去式,單複數,就那鳥老闆給的那點工資還讓我考慮什麼形態?開玩笑!愛誰誰全都得給我歸到基本型!怎麼做?簡單,英文單詞的形態變化不都是加個詞綴什麼的嗎?詞綴不就是那麼些個嗎?什麼s, es,ed, d, ing的,搞個列表把所有詞綴都加進來,然後不管什麼單詞,只要是以這些詞綴結尾的,統統給我刪掉就行了。什麼?這種方法有漏洞?像took, takes這種詞會誤操作成took,tak? 那我就不管了,除非老闆給漲工資,就這麼着吧。NLTK裏講了兩個做Stemming的軟件(Stemmer): Porter Stemmer 和 Lancaster Stemmer。看看實例吧,這個是nltk給的例子:

原句是:

"""DENNIS: Listen, strange women lying in ponds distributing swords... is no basis for a system of government.  Supreme executive power derives from... a mandate from the masses, not from some farcical aquatic ceremony."""


亂七八糟的一堆句子, 就當是單詞的集合好了,不用考慮句子含義.

Porter Stemmer 做的結果是:

['DENNI', ':', 'Listen', ',', 'strang', 'women', 'lie', 'in', 'pond','distribut', 'sword', 'is', 'no', 'basi', 'for', 'a', 'system', 'of', 'govern','.', 'Suprem', 'execut', 'power', 'deriv', 'from', 'a', 'mandat', 'from','the', 'mass', ',', 'not', 'from', 'some', 'farcic', 'aquat', 'ceremoni', '.']

不怎麼樣啊, 人名Dennis都給人家砍了個s,  strange 也處理成了strang, lying倒是正確處理成了lie,還算有點用。

再來看看 Lancaster Stemmer吧:

這個更牛,den是什麼?dennis的愛稱?這個俺得研究一下。listen直接成了list, women成了wom, 一塌糊塗啊。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章