NLP简介

NLP简介 自然语言处理属于人工智能领域。所有计算机都擅长对数值数据进行处理,NLP这一部分计算机技术是处理文本数据,
用来分析世界上不同的语言的。 现在NLP的应用大多都在机器翻译、舆情监测、自动摘要、观点提取、文本分类、问题回答、
文本语义对比、语音识别、中文OCR等方面。

安装Spacy和NLTK

pip3 install nltk

有些时候的nltk代码需要语料库才能运行,运行下面的python代码下载语料库。

import nltk
nltk.download()

Spacy配置(安装spacy库,命令行输入以下命令):
pip3 install spacy

接着下载spacy的英语语言库:
python -m spacy download en

有可能会下载失败,这时候我们需要去官网将*.whl文件下载下来,然后再离线安装:

# 官网:https://spacy.io/models/zh
# 离线安装:pip install *.whl
# zh_core_web_sm/en_core_web_sm

注意spacy使用时候需要声明使用的模型

import spacy
 
en_nlp = spacy.load('en_core_web_sm')
zh_nlp = spacy.load("zh_core_web_sm")

spacy库各语种下载传送门:https://spacy.io/usage/models#quickstart

标记化(Tokenization)

当一个句子分解成小的单个单词时,这些单词被称为标记,这个过程被称为标记化。
前缀、中缀、后缀和例外中的句子分解,我们将使用 spacy 库学习标记化:

import spacy

# 加载spacy英文库
load_en = spacy.load("en_core_web_sm")

example_string = "I'm going to meet\ M.S. Dhoni."

# 加载字符串到库
words = load_en(example_string)

for token in words:
    print(token.text)

"""输出
I
'm
going
to
meet\
M.S.
Dhoni
.
"""

我们可以从索引和切片中获取标记

str1 = load_en(u"This laptop belongs to Amit Chauhan")

print(str1[1])
print(str1[2:4])

词干

词干提取是将单词还原为词根的过程。

词干分析器的类型:

  1. Porter Stemmer

  2. Snowball Stemmer

Spacy不包含词干分析器,因此我们将使用 NLTK库进行词干提取。

Porter词干分析器于1980年开发,它的功能就是将单词缩减为其词干或词根:

import nltk

from nltk.stem.porter import PorterStemmer

pot_stem = PorterStemmer()

# 随机次测试搬运工
words = ['happy', 'happier', 'happiest', 'happiness', 'breathing', 'fairly']
for word in words:
    print("word--->", pot_stem.stem(word))

"""输出
word---> happi
word---> happier
word---> happiest
word---> happi
word---> breath
word---> fairli
"""

上面这些词被简化为仅有词干,但是porter词干分析器的结果并不是很让人满意。

因此,就用Snowball词干分析器进行改进:

from nltk.stem.snowball import SnowballStemmer

pot_stem = SnowballStemmer(language="english")

# 随机次测试搬运工
words = ['happy', 'happier', 'happiest', 'happiness', 'breathing', 'fairly']
for word in words:
    print("word--->", pot_stem.stem(word))

"""输出
word---> happi
word---> happier
word---> happiest
word---> happi
word---> breath
word---> fair
"""

词形还原

词形还原比词干提取要好,而且信息丰富,除了词干之外,还可以确定词周围的词性。
因为spacy有词形还原,没有办法提取词干,所以就使用spacy进行词形还原:

import spacy

load_en = spacy.load("en_core_web_sm")

example_string = load_en(u"I'm happy in this happiest place with all happiness. It feels how happier we are")

for word in example_string:
    print(word.text, word.pos_, word.lemma, word.lemma_)

"""词形还原
I PRON 4690420944186131903 I
'm AUX 10382539506755952630 be
happy ADJ 244022080605231780 happy
in ADP 3002984154512732771 in
this DET 1995909169258310477 this
happiest ADJ 244022080605231780 happy
place NOUN 7512738811199700769 place
with ADP 12510949447758279278 with
all DET 13409319323822384369 all
happiness NOUN 2779265004918961325 happiness
. PUNCT 12646065887601541794 .
It PRON 10239237003504588839 it
feels VERB 5741770584995928333 feel
how SCONJ 16331095434822636218 how
happier ADJ 244022080605231780 happy
we PRON 16064069575701507746 we
are AUX 10382539506755952630 be
"""

在上面的词形还原代码中,单词的描述给出了所有信息。每个单词的词性和输出中的数字是英语语言库中的特定引理。
观察结果中的happiest to happy、happier to happy的结果,得出词形还原比词干分析器更好的结论。

停止词

停止词用于过滤一些经常重复且但不提供有关文本信息的词。在Spacy中,有一些停用词的内置列表:

import spacy

load_en = spacy.load("en_core_web_sm")

print(load_en.Defaults.stop_words)

词性 pos

词性是获取文本和单词信息的过程,或者说是获取单词的语法信息,深层信息对于自然语言处理非常重要。

有两种类型的标签:对于名词,动词使用粗标签;对于复数名词,过去时类型,使用细粒度标签 (fine-grained tags):

import spacy

load_en = spacy.load("en_core_web_sm")

str1 = load_en(u"This laptop belongs to Amit Chauhan")

检查有索引位置的标记:
print(str1[1])

调用这个token操作:

# pos_ tag操作

print(str1[1].pos_)

# output: NOUN

# 了解细粒度信息

print(str1[1].tag_)

# output: NN

粗标记是 NOUN,细粒度 标记是NN,可以看出这个名词是单数。

借助spacy了解什么是 POS 计数:

pos_count = str1.count_by(spacy.attrs.POS)
print(pos_count)

# 输出:
# {90: 1, 92: 1, 100: 1, 85: 1, 96: 2}

这些数字是什么?咱们接着看!

先来看看90这个数字是什么意思:

ret = str1.vocab[90].text
print(ret)

# 输出:DET

DET表示数字90属于限定词,数值1属于它,DET在一个句子中重复了一次。

命名实体识别:NER

命名实体识别对于识别文本并将其赋予标签实体非常有用,无论它是原始形式还是非结构化形式。

当你不知道文本的实体类型时,NER帮助你标记它们并赋予文本含义。

使用spacy做NER示例:

import spacy

load_en = spacy.load('en_core_web_sm')

file = load_en(u" I am living in India, Studying in IIT")

for ner in file.ents:
    print(ner.text + ' - ' + ner.label_ + ' - ' + str(spacy.explain(ner.label_)))

输出结果:
India - GPE - Countries, cities, states
Studying - GPE - Countries, cities, states
IIT - ORG - Companies, agencies, institutions, etc.

面的代码中用NER分析文本,发现印度是一个国家名称或州名,所以我们可以知道标记是用实体标注完成的。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐