网易云课堂AI工程师(自然语言处理)学习笔记
NLTK的主要操作:
1、分词断句
from nltk import word_tokenize, sent_tokenize
#分词
words = word_tokenize(corpus) #corpus为数据集
words[:20]
#断句
sentences = sent_tokenize(corpus)
sentences
2、停用词
(1)导入内置停用词
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
(2)使用列表推导式去掉停用词
filtered_corpus = [w for w in words if not w in stop_words]
3、词性标注
词性标注(part-of-speech tagging),又称为词类标注或者简称标注,是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或者其他词性的过程。
词性标注是很多NLP任务的预处理步骤,如句法分析,经过词性标注后的文本会带来很大的便利性,但也不是不可或缺的步骤。 词性标注的最简单做法是选取最高频词性,主流的做法可以分为基于规则和基于统计的方法,包括:
1.基于最大熵的词性标注
2.基于统计最大概率输出词性
3.基于HMM的词性标注
# 词性标注
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、组块分析
分块是命名实体识别的基础,词性给出来的句子成分的属性,但有时候,更多的信息(比如句子句法结构)可以帮助我们对句子中的模式挖掘更充分。举个例子,”古天乐赞助了很多小学“中的头部古天乐是一个人名(命名实体)
提取组块需要用到正则表达式
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) 确定实体类别(人名、地名、机构名或其他)。
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、词干提取
词干提取是去掉词缀得到词根的过程。
例如:一个面向英语的词干提取器,例如要识别字符串“cats”、“catlike”和“catty”是基于词根“cat”;stemmer”、“stemming”和“stemmed”是基于词根“stem”。一根词干提取器可以简化词 “fishing”,“fished”,“fish”和“fisher” 为同一个词根“fish”。
NLTK提取词干的方法:PorterStemmer 、SnowballStemmer
# PorterStemmer
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
stemmer.stem("fishing")
# SnowballStemmer
from nltk.stem import SnowballStemmer
stemmer2 = SnowballStemmer("english")
stemmer2.stem("stemmed")
7、词形还原
词形还原与词干提取很相似。简单说来,词形还原就是去掉单词的词缀,提取单词的主干部分,通常提取后的单词会是字典中的单词,不同于词干提取(stemming),提取后的单词不一定会出现在单词中。比如,单词“cars”词形还原后的单词为“car”,单词“ate”词形还原后的单词为“eat”。
词干提取比词形还原速度要快
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize("makes")
8、词义解析
WordNet是面向语义的英语词典,类似于传统字典。
查看一个单词的同义词集用synsets(); 它有一个参数pos,可以指定查找的词性。这里得到的同义词集是同义词集的集合,即里面不是单纯的词,是同义词的集合
pos可为:NOUN、VERB、ADJ、ADV…
from nltk.corpus import wordnet as wn
wn.synsets('origin')
# 查词义
wn.synsets('origin')[0].definition()
# 造句
origin = wn.synset('origin.v.01')
origin.examples()[0]
# 上位词
origin.hypernyms()