AI学习入门之初识自然语言处理
1、自然语言处理的能力
一、语音识别:机器能够识别自然语言的口语形式,并将其翻译成文本形式。比如智能手机上的听写,你可以启用听写功能并对着手机说话,它会将你所说的一切转换成文本。
二、自然语言理解:机器能够理解自然语言的口语和书面语。如果给机器一个命令,它就能理解并执行。
三、自然语言生成:机器能够自己生成自然语言。
注:文本数据被称为语料库(corpora)或一个语料(corpus)。
2、自然语言处理中的应用
1、自动文摘:包括对语料库生成摘要。
2、翻译:要求有翻译工具,以从不同的语言翻译文本,例如,谷歌翻译。
3、情感分析:这也被称为情感的人工智能或意见挖掘,它是从书面和口头语料库中识别、提取和量化情感和情感状态的过程。情感分析工具用于处理诸如客户评论和社交媒体帖子之类的事情,以理解对特定事物的情绪反应和意见,比如新餐厅的菜品质量。
4、信息提取:这是从语料库中识别并提取重要术语的过程,称为实体。命名实体识别属于这一类,将在下一章中解释。
5、关系提取:关系提取包括从语料库中提取语义关系。语义关系发生在两个或多个实体(如人、组织和事物)之间属于许多语义类别之一。
6、聊天机器人:聊天机器人是人工智能的一种形式,被设计成通过语音和文本与人类交流。
7、社交媒体分析:社交媒体的应用,如Twitter和Facebook,都有标签和趋势,并使用自然语言处理来跟踪和监控这些标签和趋势,以了解世界各地正在交谈的话题。此外,自然语言通过过滤负面的、攻击性的和不恰当的评论和帖子来帮助优化过程。
8、个人语音助理:Siri、Alexa、谷歌助手以及Cortana都是个人语音助理,充分利用自然语言处理技术来理解和回应我们。
9、语法检查:语法检查软件会自动检查和纠正你的语法、标点和拼写错误。
2.1、文本预处理
文本预处理思想是这样的:机器不需要语料库中的无关部分。它只需要执行手头任务所需的重要单词和短语。因此,文本预处理技术涉及为机器学习模型和深度学习模型以及适当的分析准备语料库。文本预处理基本上是告诉机器什么需要考虑、哪些可以忽略。
每个语料库根据需要来执行任务的不同文本预处理技术,一旦你学会了不同的预处理技术,你就会明白什么地方使用什么文本预处理技术和为什么使用。其中技术的解释顺序通常是被执行的顺序。
在下面的练习中,我们将使用NLTK Python库,但是在进行这些活动时可以随意使用不同的库。NLTK代表自然语言工具包(Natural Language Toolkit),是自然语言处理最简单也是最受欢迎的Python库之一,这就是为什么我们用它来理解自然语言处理的基本概念。
2.2、文本预处理技术
1、小写/大写转换
# 将输入句子存储在“s”变量中
s = "The cities I like most in India are Mumbai, Bangalore, Dharamsala and Allahabad."
# 应用lower()函数将大写字母转换为小写字符,然后打印新字符串
s = s.lower()
print(s)
# 创建一个大写字符的单词数组
words = ['indiA', 'India', 'india', 'iNDia']
# 使用列表理解,对words数组的每个元素应用lower()函数,然后打印新数组
words = [word.lower() for word in words]
print(words)
2、去噪
# 导入正则表达式库
import re
# 创建一个名为“clean_words”的函数,该函数将包含从单词中删除不同类型噪声的方法
def clean_words(text):
# remove html markup
text = re.sub("(<.*?>)", "", text)
# remove non-ascii and digits
text = re.sub("(\W|\d+)", " ", text)
# remove whitespace
text = text.strip()
return text
# 创建一个带有噪声的原始单词数组
raw = ['..sleepy', 'sleepy!!', '#sleepy', '>>>>>sleepy>>>>', '<a>sleepy</a>']
# 对raw数组中的单词应用clean_words()函数,然后打印去噪后单词数组
clean = [clean_words(r) for r in raw]
print(clean)
3、文本规范化
文本规范化是将原始语料库转换为规范和标准形式的过程,这基本上是为了确保文本输入在被分析、处理和操作之前保证一致。
对于规范化来说,并没有标准的方法,因为它非常依赖于语料库和手头的任务。最常见的方法是使用字典映射,它涉及手动创建一个字典,将一个单词的所有不同形式映射到该单词,然后用一个标准形式的单词替换掉每个单词。
4、词干提取
在语料库上执行词干提取以将词语减少到词干或词根形式。说“词干或词根形式”的原因在于,词干提取的过程并不总是将词语简化为词根,有时只是将其简化为规范形式。
经过词干提取的词语被称为变形词。这些单词的形式与单词的根形式不同,以表示诸如数字或性别之类的属性。
# 导入nltk和pandas库以及Porter Stemmer
import nltk
import pandas as pd
from nltk.stem import PorterStemmer as ps
# 创建一个stemmer实例
stemmer = ps()
# 创建一个包含相同单词的不同形式的数组
words = ['annoying', 'annoys', 'annoyed', 'annoy']
# 将词干分析器应用于words数组中的每个单词,并将它们存储在一个新数组中
stems = [stemmer.stem(word=word) for word in words]
# 以DataFrame的形式打印原始单词及其词干
sdf = pd.DataFrame({'raw word': words, 'stem': stems})
print(sdf)
5、词形还原
词形还原是一个类似于词干提取的过程,它的目的是将一个词简化为词根形式。它的与众不同之处在于,它不仅仅删除单词的末尾以获取词根形式,而是遵循一个过程,遵守规则,并且经常使用WordNet进行映射以将单词返回到其根形式。
# 导入WordNetLemmatizer
import nltk
import pandas as pd
from nltk.stem import WordNetLemmatizer as wnl
# 创建一个lemmatizer实例
lemmatizer = wnl()
# 创建一个包含相同单词的不同形式的数组
words = ['troubling', 'troubled', 'troubles', 'trouble']
# 将lemmatizer应用于words数组中的每个单词,并将它们存储在新数组中,
# 如下所示。words参数提供了lemmatize函数与它应该被词形还原的单词。
# pos参数是你想要词形还原的词性。“v”代表动词,因此lemmatizer会将单词缩减为最接近的动词形式
lemmatized = [lemmatizer.lemmatize(word=word, pos='v') for word in words]
# 以DataFrame的形式打印原始单词及其根形式
ldf = pd.DataFrame({'raw word': words, 'lemmatized': lemmatized})
ldf = ldf[['raw word', 'lemmatized']]
print(ldf)
6、标记化
标记化是将语料库分解为单个标记的过程。标记是最常用的单词。因此,此过程将语料库分解为单个单词,但也可以包括标点符号和空格等。
这项技术是最重要的技术之一,因为它是我们在下一章中学习的许多自然语言处理应用的先决条件,例如词性(Parts-of-Speech,PoS)标记。这些算法将标记作为输入,并且不能使用字符串或文本段落作为输入。
标记化单词:
# 从nltk中导入word_tokenize和punkt
from nltk import word_tokenize
# 将单词存储在变量中并对其应用word_tokenize(),然后打印结果
s = "hi! my name is john."
tokens = word_tokenize(s)
print(tokens)
标记化句子:
# 从nltk中导入sent_tokenize
from nltk import sent_tokenize
# 在变量中存储两个句子(我们上一个练习中的句子实际上是两个句子,
# 所以我们可以用相同的句子来查看单词和句子标记之间的区别)并在其
# 上应用sent_tokenize(),然后打印结果
s = "hi! my name is shubhangi."
tokens = sent_tokenize(s)
print(tokens)
7、其他技巧
有几种方法可以执行文本预处理,包括使用各种Python库(如BeautifulSoup)去除HTML标记。
删除停止词:
# 导入stopwords
from nltk.corpus import stopwords
from nltk import word_tokenize
# 将句子存储在变量中
s = "the weather is really hot and i want to go for a swim"
# 创建一组英文停止词
stop_words = set(stopwords.words('english'))
# 使用word_tokenize标记句子,然后将那些不出现在stop_words中的标记存储在数组中。然后,打印该数组
tokens = word_tokenize(s)
tokens = [word for word in tokens if not word in stop_words]
print(tokens)
3、词嵌入
自然语言处理为机器学习模型和深度学习模型准备了文本数据。当提供数值数据作为输入时,模型执行效率最高,因此自然语言处理的关键作用是将预处理的文本数据转换为数值数据,数值数据是文本数据的数字表示。
这就是词嵌入的含义:它们是文本实值向量形式的数值表示。具有相似含义的词映射到相似的向量,因此具有相似的表示。这有助于机器学习不同单词的含义和背景。由于词嵌入是映射到单个单词的向量,因此只有在语料库上执行了标记化后才能生成词嵌入。
词嵌入包含多种用于创建学习的数值表示的技术,是表示文档词汇的最流行方式。
词嵌入的主要目的——形成与具有相似含义的单词相对应的相似向量簇。
3.1、词嵌入的生成
我们已经理解了什么是词嵌入及其重要性,现在需要了解它们是如何产生的。将单词转换成其实值向量的过程称为矢量化,是通过词嵌入技术完成的。
有许多可用的词嵌入技术,但是在本章中,我们将讨论两个主要的技术——Word2Vec和GloVe。
一旦词嵌入(矢量)被创建,它们组合形成一个矢量空间,这是一个由遵循矢量加法和标量乘法规则的矢量组成的代数模型。如果你不记得你的线性代数,这可能是一个快速复习的好时机。
1、Word2Vec:是用于从单词生成向量的词嵌入技术之一
Word2Vec是一个浅层神经网络,只有两层,因此不具备深度学习模型的资格。
Word2Vec的功能:
Word2Vec针对与输入语料库中的单词相邻的单词训练单词,有两种方法:
连续单词袋(CBOW):该方法基于上下文预测当前单词。因此,它将单词的周围单词作为输入来产生单词作为输出,并且它基于这个单词确实是句子的一部分的概率来选择这个单词。
Skip-gram:这种方法通过将单词作为输入,理解单词的意思,并将其分配给上下文来预测单词周围的单词。
(1)使用Word2Vec生成词嵌入
# 1、从gensim导入Word2Vec模型,并从nltk导入word_tokenize
from gensim.models import Word2Vec as wtv
from nltk import word_tokenize
# 2、将包含一些常用单词的三个字符串存储到三个独立的变量中,然后标记每个句子,并将所有标记存储在一个数组中
s1 = "Ariana Grande is a singer"
s2 = "She has been a singer for many years"
s3 = "Ariana is a great singer"
sentences = [word_tokenize(s1), word_tokenize(s2), word_tokenize(s3)]
# 3、训练模型 Word2Vec的min_count默认值为5
model = wtv(sentences, min_count=1)
# 4、总结模型
print("this is the summary of the model: ")
print(model)
# 5、通过总结来找出词汇中有哪些单词
words = list(model.wv.vocab)
print("this is the vocabulary for our corpus: ")
print(words)
# 6、看看‘singer’这个词的向量(词嵌入)是什么
print("the vector for the word singer: ")
print(model['singer'])
# 7、lookup top 6 similar words to great
w1 = ["singer"]
# “positive”是指在输出中只描述正矢量值
similar = model.wv.most_similar(positive=w1, topn=6)
print(similar)
w1 = ["great"]
# “positive”是指在输出中只描述正矢量值
similar = model.wv.most_similar(positive=w1, topn=6)
print(similar)
(2)使用GloVe生成词嵌入
GloVe:顾名思义,可以查看语料库中的所有单词
Word2Vec是一种预测模型,学习向量来提高预测能力,而GloVe是一种基于计数的模型。
# 我们需要一个语料库来生成词嵌入,幸运的是,gensim.models.word2vec库有一个名为Text8Corpus的语料库。将它与GloVe-Python库中的两个模块一起导入
import itertools
from gensim.models.word2vec import Text8Corpus
from glove import Corpus, Glove
# 使用itertools将语料库转换成列表形式的句子
sentences = list(itertools.islice(Text8Corpus('text8'), None))
# 启动Corpus()模型,并将其应用于句子
corpus = Corpus()
corpus.fit(sentences, window=10)
# 我们已经准备好了语料库,需要训练嵌入。启动GloVe()模型
glove = Glove(no_components=100, learning_rate=0.05)
# 基于语料库生成共现计数矩阵,并将gloVe模型与该矩阵相匹配 训练模型
glove.fit(corpus.matrix, epochs=30, no_threads=4, verbose=True)
# 模型训练完成
# 添加语料库的词典
glove.add_dictionary(corpus.dictionary)
# 根据生成的词嵌入,使用以下命令查看哪些单词与你选择的单词相似
similar = glove.most_similar('man')
print(similar)
# 你可以试着用几个不同的词来看看哪些词与它们相邻,哪些词与它们最相似
glove.most_similar('queen', number = 10)
举例:使用Word2Vec从语料库中生成词嵌入
# 从gensim模型中导入word2vec
from gensim.models import word2vec
# 将语料库存储在变量中
sentences = word2vec.Text8Corpus('text8')
# 在语料库上匹配word2vec模型
model = word2vec.Word2Vec(sentences, size=200)
# 找到与“man”最相似的词
model.most_similar(['man'])
# 父亲对应女孩,x对应男孩。找出x的前三个单词
model.most_similar(['girl', 'father'], ['boy'], topn=3)
- 点赞
- 收藏
- 关注作者
评论(0)