网易云课堂AI工程师(自然语言处理)学习笔记
NLTK,全称Natural Language Toolkit,自然语言处理工具包,是最常用的英文自然语言处理python基础库之一。
它提供了易于使用的接口,通过这些接口可以访问超过50个语料库和词汇资源(如WordNet),还有一套用于分类、标记化、词干提取、词性标注、词义解析和语义推理的文本处理库,以及工业级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是一个英文文本数据集
# 分词
words = word_tokenize(corpus)
(2)停用词
什么是停用词?
在自然语言处理的很多任务中,我们处理的主体“文本”中有一些功能词经常出现,然而对于最后的任务目标并没有帮助,甚至会对统计方法带来一些干扰,我们把这类词叫做停用词,通常我们会用一个停用词表把它们过滤出来。比如英语当中的定冠词/不定冠词(a,an,the等)。NLTK如何去除停用词?
# 导入内置停用词
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),又称为词类标注或者简称标注,是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或者其他词性的过程。
词性标注是很多NLP任务的预处理步骤,如句法分析,经过词性标注后的文本会带来很大的便利性,但也不是不可或缺的步骤。 词性标注的最简单做法是选取最高频词性,主流的做法可以分为基于规则和基于统计的方法,包括:
基于最大熵的词性标注
基于统计最大概率输出词性
基于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/组块分析
什么是组块分析?
分块是命名实体识别的基础,词性给出句子成分的属性,但有时候,更多的信息(比如句子句法结构)可以帮助我们对句子中的模式挖掘更充分。举个例子,”古天乐赞助了很多小学“中的头部古天乐是一个人名(命名实体)。组块分析是一个非常有用的从文本抽取信息的方法。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),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。通常包括两部分:1) 实体边界识别;2) 确定实体类别(人名、地名、机构名或其他)。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 词干提取
什么是词干提取?
词干提取是指基于简单的规则,去掉词语的后缀,比如 “ing”, “ly”, “s”等。NLTK如何实现词干提取?
词干提取: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 词形还原
什么是词形还原?
词形还原与词干提取类似,但比词干提取更加有效,因为它把词语转换为它的词根,而不仅仅是去掉后缀。它利用了整个词表,进行形态学分析以得到词根。因此,比起词干提取,我们更倾向于词形还原,不过在NLTK中,词干提取的速度比较快。NLTK如何实现词形还原?
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize("makes")
❤ ❤ 新年快乐 ❤ ❤
所有的愿望都会实现