在英文中同乙個詞的形式是有多種的,名詞的單數複數、動詞的現在和過去式等等,所以在處理英文時要考慮詞幹的抽取問題。這裡直接呼叫nltk自帶的兩個詞幹抽取器
import re
import nltk
raw = """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."""
tokens = nltk.word_tokenize(raw) # 分詞 如果該方法呼叫錯誤請執行 nltk.download('punkt')
porter = nltk.porterstemmer()
print([porter.stem(t) for t in tokens])
lancaster = nltk.lancasterstemmer()
print([lancaster.stem(t) for t in tokens])
結果如下
porter:['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', '.']
lancaster:['den', ':', 'list', ',', 'strange', 'wom', 'lying', 'in', 'pond', 'distribut', 'sword', 'is', 'no', 'bas', 'for', 'a', 'system', 'of', 'govern', '.', 'suprem', 'execut', 'pow', 'der', 'from', 'a', 'mand', 'from', 'the', 'mass', ',', 'not', 'from', 'som', 'farc', 'aqu', 'ceremony', '.']
中文沒有詞幹抽取的煩惱,中文應該關注於分詞的結果(分詞後面介紹,jieba,hanlp等等各種各樣的分詞方法呼叫)
當然你也可以直接用單詞索引文章,但是用完詞幹提取器後索引的效果就更好了。
class indexedtext(object): # 首先定義了乙個類
#初始化引數 stemmer是提取詞幹的方法,text待處理文字,self的作用大家可以直接忽視但是必不可少
def __init__(self, stemmer, text):
self._text = text # 將文字賦予變數self._text
self._stemmer = stemmer # 將提取詞幹的防範賦予self._stemmer
self._index = nltk.index((self._stem(word), i) # 迴圈讀取文字中的詞,最後生成的樣式
for (i, word) in enumerate(text))
# 找出帶處理詞所處的index,然後提取index上下40個長度內的詞
def concordance(self, word, width=40):
key = self._stem(word) # 提取待處理詞的詞幹
wc = width//4 # 獲取大概需要提取詞的個數
for i in self._index[key]: # 迴圈開始獲取上下文
lcontext = ' '.join(self._text[i-wc:i])
rcontext = ' '.join(self._text[i:i+wc])
ldisplay = '%*s' % (width, lcontext[-width:]) # %*s右對齊,讓列印出的長度是width
rdisplay = '%-*s' % (width, rcontext[:width]) # %-*s左對齊,讓列印出的長度是width
print (ldisplay, rdisplay, '/n')
def _stem(self, word): # 詞幹提取並全部改為小寫
return self._stemmer.stem(word).lower()
porter = nltk.porterstemmer() # 定義詞幹提取的方法
grail = nltk.corpus.webtext.words('grail.txt') # 獲取待處理的文字
text = indexedtext(porter, grail) # 例項化剛剛定義的類,同時將兩個引數傳入
text.concordance('lying') # 呼叫類中的找上下文的方法
結果如下,我的ide是spyder,為了讓列印的結果更清晰,我在print()中加入了『/n』讓每一次列印後都換行。
自然語言處理 特徵提取
在語言中,語義的基本單元是單詞。在英語句子中已天然就已經分割成單詞 空白符和標點符號隔開 而在漢語中字和字緊緊的連在一起。所以我們需要進行分詞。分詞有很多種演算法 基於字串匹配演算法 基於理解的演算法 基於統計的演算法 如hmm和n gram 等。下面重點介紹第一種字串匹配演算法。分詞的正向最大匹配...
《Python自然語言處理》
python自然語言處理 基本資訊 出版社 人民郵電出版社 isbn 9787115333681 出版日期 2014 年6月 開本 16開 頁碼 508 版次 1 1 所屬分類 計算機 軟體與程式設計 python 更多關於 python自然語言處理 內容簡介 書籍計算機書籍 自然語言處理 natu...
自然語言處理
自然語言處理主要步驟包括 2.詞法分析 對於英文,有詞頭 詞根 詞尾的拆分,名詞 動詞 形容詞 副詞 介詞的定性,多種詞意的選擇。比如diamond,有菱形 棒球場 鑽石3個含義,要根據應用選擇正確的意思。3.語法分析 通過語法樹或其他演算法,分析主語 謂語 賓語 定語 狀語 補語等句子元素。4.語...