NLP斷詞統計分析(II)-NLTK、wordnet | MaDi's Blog
文章推薦指數: 80 %
NLP斷詞可以處理不同語言,中文常用jieba套件來處理,英文語系則採用NLTK套件居多,本篇文章採用NLTK來做英文語句的斷詞,並結合wordnet這個字詞-語義 ...
0%
NLP斷詞可以處理不同語言,中文常用jieba套件來處理,英文語系則採用NLTK套件居多,本篇文章採用NLTK來做英文語句的斷詞,並結合wordnet這個字詞-語義的網路來協助我們分析同義字,甚至能夠計算不同字詞分類後的結構相似度。
前情提要,NLP自然語言處理的流程:
語料庫(corpus)=>文本(file)=>段落/句子(sentences)=>texts(字詞)
NLTK(NaturalLanguageToolKit)首先,先下載套件
123importnltknltk.download()#GUI介面協助下載
引用網路上的某個英文名言佳句做測試
1text="It'struethatwedon'tknowwhatwe'vegotuntilweloseit,butit'salsotruethatwedon'tknowwhatwe'vebeenlosinguntilitarrives.Itisbettertostaysilentandbethoughtafool,thantoopenone’smouthandremovealldoubt."
用sent_tokenize的函式斷句
123fromnltkimportsent_tokenizesentences=sent_tokenize(text)#斷句
[“It’struethatwedon’tknowwhatwe’vegotuntilweloseit,butit’salsotruethatwedon’tknowwhatwe’vebeenlosinguntilitarrives.”,‘Itisbettertostaysilentandbethoughtafool,thantoopenone’smouthandremovealldoubt.’]
用word_tokenize的函式斷詞
123fromnltkimportword_tokenizetokens=word_tokenize(text)#斷詞
[‘It’,“‘s”,‘true’,‘that’,‘we’,‘do’,“n’t”…
用FreqDist找出高頻率的字詞
123fromnltk.probabilityimportFreqDistfdist=FreqDist(tokens)
FreqDist({‘we’:5,‘it’:3,‘It’:2,“‘s”:2,‘true’:2,‘that’:2,‘do’:2,“n’t”:2,‘know’:2,‘what’:2,…})
12#出現頻率最高的10個單字freq_top10=fdist.most_common(10)
[(‘we’,5),(‘it’,3),(‘It’,2),(“‘s”,2),(‘true’,2),(‘that’,2),(‘do’,2),(“n’t”,2),(‘know’,2),(‘what’,2)]
載入英文版的停用字
123fromnltk.corpusimportstopwordsprint(stopwords.words('english'))
[‘i’,‘me’,‘my’,‘myself’,‘we’,‘our’,‘ours’,‘ourselves’,‘you’,“you’re”,“you’ve”,“you’ll”,“you’d”,‘your’,‘yours’,‘yourself’,‘yourselves’…
1print([tokenfortokenintokensiftokennotinstopwords.words('english')])
[‘It’,“‘s”,‘true’,“n’t”,‘know’,“‘ve”,‘got’,‘lose’,‘,’,“‘s”,‘also’,‘true’,“n’t”,‘know’,“‘ve”,‘losing’,‘arrives’,‘.’,‘It’,‘better’,‘stay’,‘silent’,‘thought’,‘fool’,‘,’,‘open’,‘one’,‘’’,‘mouth’,‘remove’,‘doubt’,‘.’]
用pos_tag來標註詞性(Partsofspeech,POS)
123fromnltkimportpos_tagpos=[pos_tag(token)fortokenintokens]#詞性
[[(‘I’,‘PRP’),(‘t’,‘VBP’)],[(“‘“,‘POS’),(‘s’,‘NN’)],[(‘t’,‘NN’),(‘r’,‘NN’),(‘u’,‘JJ’),(‘e’,‘NN’)],[(‘t’,‘NN’),(‘h’,‘VBZ’),(‘a’,‘DT’),(‘t’,‘NN’)],[(‘w’,‘NN’),(‘e’,‘NN’)]…
去除字尾(Stemming)
1234fromnltk.stemimportPorterStemmerstemmer=PorterStemmer()print(stemmer.stem("writing"))#去除字尾
write
透過詞性去還原(Lemmatization)
123456fromnltk.stemimportWordNetLemmatizerlemmatizer=WordNetLemmatizer()print(lemmatizer.lemmatize("went",pos="v"))#動詞print(lemmatizer.lemmatize("women",pos="n"))#名詞print(lemmatizer.lemmatize("better",pos="a"))#形容詞
gowomangood
wordnet
wordnet是一個語義網絡,以英語語系為主,透過”字詞-語意”的關係去找尋文本中的上下位關係、同義詞、文法的處理(ex:動詞時態、名詞複數…)
首先,載入套件
1fromnltk.corpusimportwordnetaswn
用synsets找同義詞
12#找synsets集合wn.synsets('engineer')
[Synset(‘engineer.n.01’),Synset(‘engineer.n.02’),Synset(‘engineer.v.01’),Synset(‘mastermind.v.01’)]
12#找出選定synsets裡面的字詞wn.synset('engineer.n.01').lemma_names()
[‘engineer’,‘applied_scientist’,‘technologist’]
123#找出所有synsets裡面的字詞forsynsetinwn.synsets('engineer'):print(synset.lemma_names())
[‘engineer’,‘applied_scientist’,‘technologist’][‘engineer’,‘locomotive_engineer’,‘railroad_engineer’,‘engine_driver’][‘engineer’][‘mastermind’,‘engineer’,‘direct’,‘organize’,‘organise’,‘orchestrate’]
用definition來查看synset的定義
1wn.synset('engineer.n.01').definition()
‘apersonwhousesscientificknowledgetosolvepracticalproblems’
用hypernym,hyponym來找上位詞與下位詞,wordnet是對字詞作分類,所以會有結構層級關係,類似於界門綱目科屬種。
而上位詞與下位詞就是代表不同階層的字詞。
12#engineer的上位詞wn.synset('engineer.n.01').hypernyms()
[Synset(‘person.n.01’)]
12#engineer的下位詞wn.synset('engineer.n.01').hyponyms()
[Synset(‘aeronautical_engineer.n.01’),Synset(‘aerospace_engineer.n.01’),Synset(‘army_engineer.n.01’),Synset(‘automotive_engineer.n.01’),Synset(‘civil_engineer.n.01’)…
12#engineer最根源的上位詞wn.synset('engineer.n.01').root_hypernyms()
[Synset(‘entity.n.01’)]
用lowest_common_hypernyms找尋兩個synset的最低位共同詞組,並用path_similarity計算兩者的結構相似度
1234#以工程師為例engineer=wn.synset("engineer.n.01")hacker=wn.synset("hacker.n.01")elephant=wn.synset("elephant.n.01")
123print('engineervsenginner:',engineer.lowest_common_hypernyms(engineer))print('engineervshacker:',engineer.lowest_common_hypernyms(hacker))print('engineervselephant:',engineer.lowest_common_hypernyms(elephant))
engineervsenginner:[Synset(‘engineer.n.01’)]engineervshacker:[Synset(‘person.n.01’)]engineervselephant:[Synset(‘organism.n.01’)]
123print('engineervsenginner:',engineer.path_similarity(engineer))print('engineervshacker:',engineer.path_similarity(hacker))print('engineervselephant:',engineer.path_similarity(elephant))
engineervsenginner:1.0engineervshacker:0.16666666666666666engineervselephant:0.1
最後,我們也可以透過wordnet與WordNetLemmatizer將指定的一句話自動還原詞性
12345678910111213141516fromnltkimportword_tokenize,pos_tagfromnltk.corpusimportwordnetfromnltk.stemimportWordNetLemmatizer#獲取詞性defget_pos(tag):iftag.startswith('J'):#形容詞returnwordnet.ADJeliftag.startswith('V'):#動詞returnwordnet.VERBeliftag.startswith('N'):#名詞returnwordnet.NOUNeliftag.startswith('R'):#副詞returnwordnet.ADVelse:returnwordnet.NOUN#如果都不符合,預設傳回名詞
123456789101112#測試語句text="Hello,mynameisMadi.Iloveplayingbasketball."#斷詞/詞性tokens=word_tokenize(text)postag_tokens=pos_tag(tokens)#定義wordnet的詞態還原wnl=WordNetLemmatizer()#還原詞性的句子print("".join([wnl.lemmatize(tag[0],pos=get_wordnet_pos(tag[1]))fortaginpostag_tokens]))
Hello,mynamebeMadi.Iloveplaybasketball.
參考
NLTK初學指南(一):簡單易上手的自然語言工具箱-探索篇
NLTK初學指南(三):基於WordNet的語義關係表示法—上下位詞結構篇
英文自然語言處理的經典工具:NLTK
Python深度學習筆記(五):使用NLTK進行自然語言處理
2.AccessingTextCorporaandLexicalResources
文章目錄
本站概要
1.NLTK(NaturalLanguageToolKit)2.wordnet3.參考
MaDi
持續學習新技術,反走過必留下痕跡
37
文章
11
分類
GitHub
E-Mail
Instagram
延伸文章資訊
- 1中文自然語言處理基礎 - iT 邦幫忙
結巴的斷詞分成兩個模式,精準模式只找到系統演算出最精準的斷詞可能,全斷詞模式則是把所有可能的斷詞模式列出來,如果你想要用來做文本分析,句子又沒有很長的的時候, ...
- 2[NLP][Python] 中文斷詞最方便的開源工具之一: Jieba
『斷詞』(或者你習慣講『分詞』)的重要性在中文NLP 當中幾乎可說是無人不知、無人不曉。若是今天我們要進行中文的句法分析,試想:若是我們連句子 ...
- 3NLP斷詞統計分析(II)-NLTK、wordnet | MaDi's Blog
NLP斷詞可以處理不同語言,中文常用jieba套件來處理,英文語系則採用NLTK套件居多,本篇文章採用NLTK來做英文語句的斷詞,並結合wordnet這個字詞-語義 ...
- 4斷開中文的鎖鍊!自然語言處理(NLP)是什麼? - Taiwan AI ...
中研院資訊科學研究所的馬偉雲助研究員說明:以中文來說,最基本的,要先教電腦學會「斷詞」和「理解詞的意思」。 如何理解一種語言? 小時候學習中文,會 ...
- 5千呼萬喚十多年!中研院終於開源釋出國產自動化中文斷詞工具
中文NLP研究常用到的自動化中文斷詞工具,實際上,中研院CKIP Lab中文詞知識庫小組自己也有一套國產品,但以前沒有開源,僅提供安裝執行檔,並未提供原始 ...