本節書摘來異步社群《nltk基礎教程——用nltk和python庫建構機器學習應用》一書中的第2章,第2.5節,作者:nitin hardeniya,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
所謂詞幹提取(stemming),顧名思義就是一個修剪枝葉的過程。這是很有效的方法,通過運用一些基本規則,我們可以在修剪枝葉的過程中得到所有的分詞。詞幹提取是一種較為粗糙的規則處理過程,我們希望用它來取得相關分詞的各種變化。例如eat這個單詞就會有像eating、eaten、eats等變化。在某些應用中,我們是沒有必要區分eat和eaten之間的差別的,是以通常會用詞幹提取的方式将這種文法上的變化歸結為相同的詞根。由此可以看出,我們之是以會用詞幹提取方法,就是因為它的簡單,而對于更複雜的語言案例或更複雜的nlp任務,我們就必須要改用詞形還原(lemmatization)的方法了。詞形還原是一種更為健全、也更有條理的方法,以便用于應對相關詞根的各種文法上的變化。
下面,我們就來看一段詞幹提取的具體過程:
一個擁有基本規則的詞幹提取器,在像移除-s/es、-ing或-ed這類事情上都可以達到70%以上的精确度,而porter詞幹提取器使用了更多的規則,自然在執行上會得到很不錯的精确度。
我們建立了不同的詞幹提取器對象,并在相關字元串上調用了 stem()方法。結果如你所見,當用一個簡單執行個體來檢視時,它們之間并沒有太大的差别,但當多種詞幹提取算法介入時,就會看到它們在精準度和性能上的差異了。關于這方面的更多細節,你可以去看看 <code>http://www.nltk. org/api/nltk.stem.html</code>頁面上的相關資訊。通常情況下,我們使用的是porter詞幹提取器,如果是在英語環境中工作,這個提取器已經夠用了。當然,還有snowball提取器這一整個提取器家族,可分别用于處理荷蘭語、英語、法語、德語、意大利語、葡萄牙語、羅馬尼亞語和俄語等語言。特别地,我也曾經遇到過可用來處理印地文的輕量級詞幹提取器:<code>http://research.variancia.com/hindi_stemmer</code>。
注意 小技巧:
我們會建議那些希望對詞幹提取進行更深入研究的人去看看關于所有詞幹提取器的相關研究<code>http://en.wikipedia. org/wiki/stemming[2]</code>。
但是,對大多數使用者而言,porter和snowball這兩種詞幹提取器就足以應付大量的相關用例了。在現代的nlp應用中,人們有時候會将詞幹提取當作是一種預處理步驟進而将其忽略掉,是以這往往取決于我們所面對的具體領域和應用。在這裡,我們想告訴你一個事實,即如果你希望用到某些nlp标注器,如詞性标注(pos)、ner或某種依賴性解析器中的某些部分,那麼就應該避免進行詞幹提取操作,因為詞幹提取會對相關分詞進行修改,這有可能會導緻不同的結果。
當讨論到一般标注器時,我們還會進一步對此展開讨論。