在Python中使用NLTK庫實(shí)現(xiàn)對詞干的提取的教程
什么是詞干提取?
在語言形態(tài)學(xué)和信息檢索里,詞干提取是去除詞綴得到詞根的過程─—得到單詞最一般的寫法。對于一個(gè)詞的形態(tài)詞根,詞干并不需要完全相同;相關(guān)的詞映射到同一個(gè)詞干一般能得到滿意的結(jié)果,即使該詞干不是詞的有效根。從1968年開始在計(jì)算機(jī)科學(xué)領(lǐng)域出現(xiàn)了詞干提取的相應(yīng)算法。很多搜索引擎在處理詞匯時(shí),對同義詞采用相同的詞干作為查詢拓展,該過程叫做歸并。
一個(gè)面向英語的詞干提取器,例如,要識別字符串“cats”、“catlike”和“catty”是基于詞根“cat”;“stemmer”、“stemming”和“stemmed”是基于詞根“stem”。一根詞干提取算法可以簡化詞 “fishing”、“fished”、“fish”和“fisher” 為同一個(gè)詞根“fish”。
技術(shù)方案的選擇
Python和R是數(shù)據(jù)分析的兩種主要語言;相對于R,Python更適合有大量編程背景的數(shù)據(jù)分析初學(xué)者,尤其是已經(jīng)掌握Python語言的程序員。所以我們選擇了Python和NLTK庫(Natual Language Tookit)作為文本處理的基礎(chǔ)框架。此外,我們還需要一個(gè)數(shù)據(jù)展示工具;對于一個(gè)數(shù)據(jù)分析師來說,數(shù)據(jù)庫的冗繁安裝、連接、建表等操作實(shí)在是不適合進(jìn)行快速的數(shù)據(jù)分析,所以我們使用Pandas作為結(jié)構(gòu)化數(shù)據(jù)和分析工具。
環(huán)境搭建
我們使用的是Mac OS X,已預(yù)裝Python 2.7.
安裝NLTK
sudo pip install nltk
安裝Pandas
sudo pip install pandas
對于數(shù)據(jù)分析來說,最重要的是分析結(jié)果,iPython notebook是必備的一款利器,它的作用在于可以保存代碼的執(zhí)行結(jié)果,例如數(shù)據(jù)表格,下一次打開時(shí)無需重新運(yùn)行即可查看。
安裝iPython notebook
sudo pip install ipython
創(chuàng)建一個(gè)工作目錄,在工作目錄下啟動iPython notebook,服務(wù)器會開啟http://127.0.0.1:8080頁面,并將創(chuàng)建的代碼文檔保存在工作目錄之下。
mkdir Codes cd Codes ipython notebook
文本處理
數(shù)據(jù)表創(chuàng)建
使用Pandas創(chuàng)建數(shù)據(jù)表 我們使用得到的樣本數(shù)據(jù),建立DataFrame——Pandas中一個(gè)支持行、列的2D數(shù)據(jù)結(jié)構(gòu)。
from pandas import DataFrame import pandas as pd d = ['pets insurance','pets insure','pet insurance','pet insur','pet insurance"','pet insu'] df = DataFrame(d) df.columns = ['Words'] df
顯示結(jié)果
NLTK分詞器介紹
RegexpTokenizer:正則表達(dá)式分詞器,使用正則表達(dá)式對文本進(jìn)行處理,就不多作介紹。
PorterStemmer:波特詞干算法分詞器,原理可看這里:http://snowball.tartarus.org/algorithms/english/stemmer.html
第一步,我們創(chuàng)建一個(gè)去除標(biāo)點(diǎn)符號等特殊字符的正則表達(dá)式分詞器:
import nltk tokenizer = nltk.RegexpTokenizer(r'w+')
接下來,對準(zhǔn)備好的數(shù)據(jù)表進(jìn)行處理,添加詞干將要寫入的列,以及統(tǒng)計(jì)列,預(yù)設(shè)默認(rèn)值為1:
df["Stemming Words"] = "" df["Count"] = 1
讀取數(shù)據(jù)表中的Words列,使用波特詞干提取器取得詞干:
j = 0 while (j <= 5): for word in tokenizer.tokenize(df["Words"][j]): df["Stemming Words"][j] = df["Stemming Words"][j] + " " + nltk.PorterStemmer().stem_word(word) j += 1 df
Good!到這一步,我們已經(jīng)基本上實(shí)現(xiàn)了文本處理,結(jié)果顯示如下:
分組統(tǒng)計(jì)
在Pandas中進(jìn)行分組統(tǒng)計(jì),將統(tǒng)計(jì)表格保存到一個(gè)新的DataFrame結(jié)構(gòu)uniqueWords中:
uniqueWords = df.groupby(['Stemming Words'], as_index = False).sum().sort(['Count']) uniqueWords
注意到了嗎?依然還有一個(gè)pet insu未能成功處理。
拼寫檢查
對于用戶拼寫錯(cuò)誤的詞語,我們首先想到的是拼寫檢查,針對Python我們可以使用enchant:
sudo pip install enchant
使用enchant進(jìn)行拼寫錯(cuò)誤檢查,得到推薦詞:
import enchant from nltk.metrics import edit_distance class SpellingReplacer(object): def __init__(self, dict_name='en', max_dist=2): self.spell_dict = enchant.Dict(dict_name) self.max_dist = 2 def replace(self, word): if self.spell_dict.check(word): return word suggestions = self.spell_dict.suggest(word) if suggestions and edit_distance(word, suggestions[0]) <= self.max_dist: return suggestions[0] else: return word from replacers import SpellingReplacer replacer = SpellingReplacer() replacer.replace('insu') 'insu'
但是,結(jié)果依然不是我們預(yù)期的“insur”。能不能換種思路呢?
算法特殊性
用戶輸入非常重要的特殊性來自于行業(yè)和使用場景。采取通用的英語大詞典來進(jìn)行拼寫檢查,無疑是行不通的,并且某些詞語恰恰是拼寫正確,但本來卻應(yīng)該是另一個(gè)詞。但是,我們?nèi)绾伟堰@些背景信息和數(shù)據(jù)分析關(guān)聯(lián)起來呢?
經(jīng)過一番思考,我認(rèn)為最重要的參考庫恰恰就在已有的數(shù)據(jù)分析結(jié)果中,我們回來看看:
已有的5個(gè)“pet insur”,其實(shí)就已經(jīng)給我們提供了一份數(shù)據(jù)參考,我們已經(jīng)可以對這份數(shù)據(jù)進(jìn)行聚類,進(jìn)一步除噪。
相似度計(jì)算
對已有的結(jié)果進(jìn)行相似度計(jì)算,將滿足最小偏差的數(shù)據(jù)歸類到相似集中:
import Levenshtein minDistance = 0.8 distance = -1 lastWord = "" j = 0 while (j < 1): lastWord = uniqueWords["Stemming Words"][j] distance = Levenshtein.ratio(uniqueWords["Stemming Words"][j], uniqueWords["Stemming Words"][j + 1]) if (distance > minDistance): uniqueWords["Stemming Words"][j] = uniqueWords["Stemming Words"][j + 1] j += 1 uniqueWords
查看結(jié)果,已經(jīng)匹配成功!
最后一步,重新對數(shù)據(jù)結(jié)果進(jìn)行分組統(tǒng)計(jì):
uniqueWords = uniqueWords.groupby(['Stemming Words'], as_index = False).sum() uniqueWords
到此,我們已經(jīng)完成了初步的文本處理。
相關(guān)文章
Python列表常見操作詳解(獲取,增加,刪除,修改,排序等)
這篇文章主要介紹了Python列表常見操作,結(jié)合實(shí)例形式總結(jié)分析了Python列表常見的獲取、增加、刪除、修改、排序、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02Python+redis通過限流保護(hù)高并發(fā)系統(tǒng)
這篇文章主要介紹了Python+redis通過限流保護(hù)高并發(fā)系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04python實(shí)現(xiàn)數(shù)據(jù)預(yù)處理之填充缺失值的示例
下面小編就為大家分享一篇python實(shí)現(xiàn)數(shù)據(jù)預(yù)處理之填充缺失值的示例。具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12python中使用paramiko模塊并實(shí)現(xiàn)遠(yuǎn)程連接服務(wù)器執(zhí)行上傳下載功能
paramiko是用python語言寫的一個(gè)模塊,遵循SSH2協(xié)議,支持以加密和認(rèn)證的方式,進(jìn)行遠(yuǎn)程服務(wù)器的連接。這篇文章主要介紹了python中使用paramiko模塊并實(shí)現(xiàn)遠(yuǎn)程連接服務(wù)器執(zhí)行上傳下載功能,需要的朋友可以參考下2020-02-02Python通用驗(yàn)證碼識別OCR庫之ddddocr驗(yàn)證碼識別
dddd_ocr也是一個(gè)用于識別驗(yàn)證碼的開源庫,又名帶帶弟弟ocr,爬蟲界大佬sml2h3開發(fā),識別效果也是非常不錯(cuò),下面這篇文章主要給大家介紹了關(guān)于Python通用驗(yàn)證碼識別OCR庫之ddddocr驗(yàn)證碼識別的相關(guān)資料,需要的朋友可以參考下2022-05-05Python3.2中的字符串函數(shù)學(xué)習(xí)總結(jié)
這篇文章主要介紹了Python3.2中的字符串函數(shù)學(xué)習(xí)總結(jié),本文講解了格式化類方法、查找 & 替換類方法、拆分 & 組合類方法等內(nèi)容,需要的朋友可以參考下2015-04-04