網(wǎng)易云課堂AI工程師(自然語言處理)學習筆記
NLTK所森,全稱Natural Language Toolkit扯再,自然語言處理工具包,是最常用的英文自然語言處理python基礎庫之一殴蹄。
它提供了易于使用的接口哗咆,通過這些接口可以訪問超過50個語料庫和詞匯資源(如WordNet)蜘欲,還有一套用于分類、標記化晌柬、詞干提取姥份、詞性標注、詞義解析和語義推理的文本處理庫年碘,以及工業(yè)級NLP庫的封裝器和一個活躍的討論論壇澈歉。
基本操作:
(1)英文Tokenization(標記化/分詞)
-
什么是Tokenization?
文本是不能成段送入模型中進行分析的屿衅,我們通常會把文本切成有獨立含義的字埃难、詞或者短語,這個過程叫做tokenization,這通常是大家解決自然語言處理問題的第一步涡尘。 -
NLTK如何做Tokenization忍弛?
NLTK中提供了2種不同方式的tokenization,sentence tokenization 和 word tokenization考抄,前者把文本進行“斷句”细疚,后者對文本進行“分詞”。
from nltk import word_tokenize, sent_tokenize
# 斷句
sentences = sent_tokenize(corpus) #corpus是一個英文文本數(shù)據(jù)集
# 分詞
words = word_tokenize(corpus)
(2)停用詞
什么是停用詞座泳?
在自然語言處理的很多任務中惠昔,我們處理的主體“文本”中有一些功能詞經(jīng)常出現(xiàn),然而對于最后的任務目標并沒有幫助挑势,甚至會對統(tǒng)計方法帶來一些干擾镇防,我們把這類詞叫做停用詞,通常我們會用一個停用詞表把它們過濾出來潮饱。比如英語當中的定冠詞/不定冠詞(a,an,the等)来氧。NLTK如何去除停用詞?
# 導入內(nèi)置停用詞
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
# 使用列表推導式去掉停用詞
filtered_corpus = [w for w in words if not w in stop_words]
(3)詞性標注
-
什么是詞性標注香拉?
詞性(part-of-speech)是詞匯基本的語法屬性啦扬,通常也稱為詞性。
詞性標注(part-of-speech tagging),又稱為詞類標注或者簡稱標注凫碌,是指為分詞結(jié)果中的每個單詞標注一個正確的詞性的程序扑毡,也即確定每個詞是名詞、動詞盛险、形容詞或者其他詞性的過程瞄摊。
詞性標注是很多NLP任務的預處理步驟,如句法分析苦掘,經(jīng)過詞性標注后的文本會帶來很大的便利性换帜,但也不是不可或缺的步驟。 詞性標注的最簡單做法是選取最高頻詞性鹤啡,主流的做法可以分為基于規(guī)則和基于統(tǒng)計的方法惯驼,包括:
基于最大熵的詞性標注
基于統(tǒng)計最大概率輸出詞性
基于HMM的詞性標注
- NLTK如何做詞性標注?
# 詞性標注
from nltk import pos_tag
tags = pos_tag(filtered_corpus)
- 詞性標注編碼對照表
POS Tag | Description | Example |
---|---|---|
CC | coordinating conjunction | and |
CD | cardinal number | 1, third |
DT | determiner | the |
EX | existential there | there, is |
FW | foreign word | d’hoevre |
IN | preposition or subordinating conjunction | in, of, like |
JJ | adjective | big |
JJR | adjective, comparative | bigger |
JJS | adjective, superlative | biggest |
LS | list marker | 1) |
MD | modal | could, will |
NN | noun, singular or mass | door |
NNS | noun plural | doors |
NNP | proper noun, singular | John |
NNPS | proper noun, plural | Vikings |
PDT | predeterminer | both the boys |
POS | possessive ending | friend‘s |
PRP | personal pronoun | I, he, it |
PRP$ | possessive pronoun | my, his |
RB | adverb | however, usually, naturally, here, good |
RBR | adverb, comparative | better |
RBS | adverb, superlative | best |
RP | particle | give up |
TO | to | to go, to him |
UH | interjection | uhhuhhuhh |
VB | verb, base form | take |
VBD | verb, past tense | took |
VBG | verb, gerund or present participle | taking |
VBN | verb, past participle | taken |
VBP | verb, sing. present, non-3d | take |
VBZ | verb, 3rd person sing. present | takes |
WDT | wh-determiner | which |
WP | wh-pronoun | who, what |
WP$ | possessive wh-pronoun | whose |
WRB | wh-abverb | where, when |
(4)chunking/組塊分析
什么是組塊分析递瑰?
分塊是命名實體識別的基礎祟牲,詞性給出句子成分的屬性,但有時候泣矛,更多的信息(比如句子句法結(jié)構(gòu))可以幫助我們對句子中的模式挖掘更充分疲眷。舉個例子,”古天樂贊助了很多小學“中的頭部古天樂是一個人名(命名實體)您朽。組塊分析是一個非常有用的從文本抽取信息的方法。NLTK如何做組塊分析?
提取組塊需要用到正則表達式哗总。
from nltk.chunk import RegexpParser
from nltk import sent_tokenize,word_tokenize
# 寫一個匹配名詞的模式
pattern = """
NP: {<JJ>*<NN>+}
{<JJ>*<NN><CC>*<NN>+}
"""
# 定義組塊分析器
chunker = RegexpParser(pattern)
# 分句
tokenized_sentence = nltk.sent_tokenize(text)
# 分詞
tokenized_words = [nltk.word_tokenize(sentence) for sentence in tokenized_sentence]
# 詞性標注
tagged_words = [nltk.pos_tag(word) for word in tokenized_words]
# 識別NP組塊
word_tree = [chunker.parse(word) for word in tagged_words]
# word_tree[0].draw()
(5)命名實體識別
什么是命名實體識別几颜?
命名實體識別(Named Entity Recognition,簡稱NER)讯屈,又稱作“專名識別”蛋哭,是指識別文本中具有特定意義的實體,主要包括人名涮母、地名谆趾、機構(gòu)名、專有名詞等叛本。通常包括兩部分:1) 實體邊界識別沪蓬;2) 確定實體類別(人名、地名来候、機構(gòu)名或其他)跷叉。NLTK如何做命名實體識別?
from nltk import ne_chunk, pos_tag, word_tokenize
sentence = "John studies at Stanford University."
print(ne_chunk(pos_tag(word_tokenize(sentence))))
命名實體識別也非常推薦大家使用 stanford core nlp modules 作為nltk的NER工具庫营搅,通常來說它速度更快云挟,而且有更改的識別準確度。
(6)Stemming 詞干提取
什么是詞干提茸省园欣?
詞干提取是指基于簡單的規(guī)則,去掉詞語的后綴休蟹,比如 “ing”, “l(fā)y”, “s”等沸枯。NLTK如何實現(xiàn)詞干提取鸡挠?
詞干提然员ァ:PorterStemmer 、SnowballStemmer
# 可以用PorterStemmer
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
stemmer.stem("running")
# 也可以用
from nltk.stem import SnowballStemmer
stemmer2 = SnowballStemmer("english")
stemmer2.stem("growing")
(7)Lemmatizing 詞形還原
什么是詞形還原拣展?
詞形還原與詞干提取類似彭沼,但比詞干提取更加有效,因為它把詞語轉(zhuǎn)換為它的詞根备埃,而不僅僅是去掉后綴姓惑。它利用了整個詞表,進行形態(tài)學分析以得到詞根按脚。因此于毙,比起詞干提取,我們更傾向于詞形還原辅搬,不過在NLTK中唯沮,詞干提取的速度比較快脖旱。NLTK如何實現(xiàn)詞形還原?
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize("makes")
? ? 新年快樂 ? ?
所有的愿望都會實現(xiàn)