python 英语分词_基于Python NLTK库进行英文文本预处理
文本預處理是要文本處理成計算機能識別的格式,是文本分類、文本可視化、文本分析等研究的重要步驟。具體流程包括文本分詞、去除停用詞、詞干抽取(詞形還原)、文本向量表征、特征選擇等步驟,以消除臟數據對挖掘分析結果的影響。
本文僅針對英文文本,中文文本暫時還沒有研究過。介紹的全部都是基于Python2.7,利用NLTK庫進行文本分類的過程。
文本分詞
文本分詞即將文本拆解成詞語單元,英文文本以英文單詞空格連接成句,分詞過程較為簡單。以下介紹幾種方法。
正則表達式分詞
以空格進行分詞
>>> import re
>>> text = 'I was just a kid, and loved it very much! What a fantastic song!'
>>> print re.split(r' ',text)
['I', 'was', 'just', 'a', 'kid,', 'and', 'loved', 'it', 'very', 'much!', 'What', 'a', 'fantastic', 'song!']
re匹配符號進行分詞
>>> print re.split(r'\W+', text)
['I', 'was', 'just', 'a', 'kid', 'and', 'loved', 'it', 'very', 'much', 'What', 'a', 'fantastic', 'song', '']
>>> print re.findall(r'\w+|\S\w*', text)
['I', 'was', 'just', 'a', 'kid', ',', 'and', 'loved', 'it', 'very', 'much', '!', 'What', 'a', 'fantastic', 'song', '!']
>>> print re.findall(r"\w+(?:[-']\w+)*|'|[-.(]+|\S\w*", text)
['I', 'was', 'just', 'a', 'kid', ',', 'and', 'loved', 'it', 'very', 'much', '!', 'What', 'a', 'fantastic', 'song', '!']
NLTK正則表達式分詞器
>>> import re
>>> import nltk
>>> text = 'I was just a kid, and loved it very much! What a fantastic song!'
>>> pattern = r"""(?x) # set flag to allow verbose regexps
(?:[A-Z]\.)+ # abbreviations, e.g. U.S.A.
|\d+(?:\.\d+)?%? # numbers, incl. currency and percentages
|\w+(?:[-']\w+)* # words w/ optional internal hyphens/apostrophe
|\.\.\. # ellipsis
|(?:[.,;"'?():-_`]) # special characters with meanings
"""
>>> print nltk.regexp_tokenize(text, pattern)
['I', 'was', 'just', 'a', 'kid', ',', 'and', 'loved', 'it', 'very', 'much', 'What', 'a', 'fantastic', 'song']
最大匹配算法(MaxMatch)分詞
MaxMatch算法在中文自然語言處理中常常用來進行分詞(或許從名字上你已經能想到它是基于貪婪策略設計的一種算法),算法從右側開始逐漸減少字符串長度,以此求得可能匹配到nltk字庫中詞語的最大長度的字符串。這種方法其實更常用于中文文本分詞,但是不排除某些英文文本并不以空格作為分隔符,特此介紹一下
>>> import nltk
>>> from nltk.corpus import words
>>> wordlist = set(words.words())
>>> def max_match(text):
pos2 = len(text)
result = ''
while len(text) > 0:
word = text[0:pos2]
if word in wordlist:
result = result + text[0:pos2] + ' '
text = text[pos2:]
pos2 = len(text)
else:
pos2 = pos2-1
return result[0:-1]
>>> string = 'theyarebirds'
>>> print(max_match(string))
they are bird s
停用詞去除
簡單易懂,匹配詞庫中的停用詞,去除!以消除冠詞、連詞等一些無意義無作用的詞增加數據占用空間,并避免其為挖掘計算帶來的干擾。
NLTK停用詞庫
>>> import nltk
>>> from nltk.corpus import stopwords
>>> stopworddic = set(stopwords.words('english'))
>>> text = ['I', 'was', 'just', 'a', 'kid', 'and', 'loved', 'it', 'very', 'much', 'What', 'a', 'fantastic', 'song']
>>> text = [i for i in text if i not in stopworddic ]
>>> print text
['I', 'kid', 'loved', 'much', 'What', 'fantastic', 'song']
自定義詞庫
方法同上,自定義停用詞,或者下載網絡上的停用詞庫進行停用詞去除
詞干抽取
將文本列表中的詞語抽取其詞干,以統一特征表征形式,特征降維以減少計算量。NLTK中提供了三種最常用的詞干提取器接口,即 Porter stemmer, Lancaster Stemmer 和 Snowball Stemmer。抽取詞的詞干或詞根形式(不一定能夠表達完整語義)
>>> from nltk.stem.porter import PorterStemmer
>>> porter_stemmer = PorterStemmer()
>>> from nltk.stem.lancaster import LancasterStemmer
>>> lancaster_stemmer = LancasterStemmer()
>>> from nltk.stem import SnowballStemmer
>>> snowball_stemmer = SnowballStemmer(“english”)
>>> porter_stemmer.stem(‘maximum’)
u’maximum’
>>> lancaster_stemmer.stem(‘maximum’)
‘maxim’
>>> snowball_stemmer.stem(‘maximum’)
u’maximum’
>>> porter_stemmer.stem(‘presumably’)
u’presum’
>>> snowball_stemmer.stem(‘presumably’)
u’presum’
>>> lancaster_stemmer.stem(‘presumably’)
‘presum’
>>> porter_stemmer.stem(‘multiply’)
u’multipli’
>>> snowball_stemmer.stem(‘multiply’)
u’multipli’
>>> lancaster_stemmer.stem(‘multiply’)
‘multiply’
>>> porter_stemmer.stem(‘provision’)
u’provis’
>>> snowball_stemmer.stem(‘provision’)
u’provis’
>>> lancaster_stemmer.stem(‘provision’)
u’provid’
>>> porter_stemmer.stem(‘owed’)
u’owe’
>>> snowball_stemmer.stem(‘owed’)
u’owe’
>>> lancaster_stemmer.stem(‘owed’)
‘ow’
各有優劣,看具體文本情況。對于分類、聚類這樣對于特征詞語的具體形態沒有要求的情況下,進行詞干抽取雖然抽取后的詞干可能無實際意義但是卻會大大減少計算時間,提高效率。
詞形還原
詞形還原Lemmatization是把一個任何形式的語言詞匯還原為一般形式(能表達完整語義)。相對而言,詞干提取是簡單的輕量級的詞形歸并方式,最后獲得的結果為詞干,并不一定具有實際意義。詞形還原處理相對復雜,獲得結果為詞的原形,能夠承載一定意義,與詞干提取相比,更具有研究和應用價值。
>>> from nltk.stem import WordNetLemmatizer
>>> wordnet_lemmatizer = WordNetLemmatizer()
>>> word = wordnet_lemmatizer.lemmatize('birds')
bird
nltk的lemmatization算法很雞肋,基本可以理解為只有復數還原為單數形式,當然feet這樣的非常態復數形式也可以實現,但是你要想形容詞變名詞,就不太怎么好使了,比如我在實驗中geology,geography,geographic,geographical這幾個詞就無法還原成統一體。
文本向量表征以及TF-IDF權重表示
這一部分是基于Python的Gensim庫將文本特征抽取為詞袋,并將詞袋表征為id,以特征id以及文檔頻率表征成文本向量。TF-IDF權重是很可靠的權重表征方式,用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。TF-IDF加權的各種形式常被搜索引擎應用,作為文件與用戶查詢之間相關程度的度量或評級。
#coding:utf-8
from gensim import corpora, models, similarities
documents = ["Shipment of gold damaged in a fire","Delivery of silver arrived in a silver truck","Shipment of gold arrived in a truck"]
#分詞#
texts = [[word for word in document.lower().split()] for document in documents]
print texts
#抽取詞袋,將token映射為id
dictionary = corpora.Dictionary(texts)
print dictionary.token2id
#由文檔向量以及頻率構成文檔向量
corpus = [dictionary.doc2bow(text) for text in texts]
print corpus
#計算tfidf權重,注意在gensim的tfidf算法中到文檔頻率的求解過程中對數之后+1了
tfidf = models.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]
for doc in corpus_tfidf:
print doc
print tfidf.dfs
print tfidf.idfs
除此之外,最近導師推給我的一篇文章Word2vec也是文本向量表征的一種方式,考慮了上下文的語義聯系,可以深入研究。
特征選擇
根據研究的需求進行特征的選擇已達到特征降維,減小噪音的影響。常見的是根據詞頻(TF)、倒文檔頻率(IDF)、TFIDF權重等設定閾值進行篩選,無非是在TF/IDF/TFIDF權重計算結果的基礎上設定閾值進行篩檢。除此之外互信息、信息增益、X平方統計也是常見的方法。除此之外,如果你的研究是在給定類別名稱的前提下進行語義文本分類,那么判斷特征詞與分類之間的語義相似度,從而進行篩選也是一種可行的方法。這里介紹的便是基于WordNet進行語義相似度的介紹。
WordNet計算語義相似度常見的包括兩種主要方法:
path_similarity(sense1,sense2) # 詞在詞典層次結構中的最短路徑
wup_similarity(sense1, sense2) # Wu-Palmer 提出的最短路徑
#coding:utf-8
import nltk
from nltk.corpus import wordnet as wn
from heapq import *
from itertools import product
word1 = 'hen'
word2 = 'chicken'
sense1 = wn.synsets(word1)
sense2 = wn.synsets(word2)
sim_wup = max(word1.wup_similarity(word2) for (word1, word2) in product(sense1, sense2))
print sim_wup
sim_path = max(word1.path_similarity(word2) for (word1, word2) in product(sense1, sense2))
print sim_path
運行結果
0.962962962963
0.5
總結
以上是生活随笔為你收集整理的python 英语分词_基于Python NLTK库进行英文文本预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: [leetcode] 229. Majo
- 下一篇: 用latex排版LNCS模板的论文
