以下是 7 节课,可帮助您开始使用 Python 中的自然语言处理深度学习并提高工作效率:
第 01 课:深度学习和自然语言
第 02 课:清理文本数据
第 03 课:词袋模型
第 04 课:词嵌入表示
第 05 课:学习嵌入
第 06 课:对文本进行分类
第 07 课:电影评论情绪分析项目
自然语言处理,简称NLP,被广泛定义为通过软件自动操作自然语言,如语音和文本。
自然语言处理的研究已经存在了 50 多年,随着计算机的兴起,它从语言学领域发展起来。
理解文本的问题没有得到解决,而且可能永远不会解决,主要是因为语言是混乱的。规则很少。然而,大多数时候我们可以很容易地相互理解。
深度学习对 NLP 的承诺
深度学习方法在自然语言中很受欢迎,主要是因为它们正在兑现承诺。
深度学习力量的首批大型演示是在自然语言处理方面,特别是语音识别。最近在机器翻译方面。
深度学习对自然语言处理的 3 个关键承诺如下:
特征学习的承诺。 也就是说,深度学习方法可以从模型所需的自然语言中学习特征,而不是要求由专家指定和提取特征。
持续改进的承诺。 也就是说,深度学习在自然语言处理中的性能是基于真实的结果,并且这种改进似乎在继续,甚至可能在加速。
端到端模型的承诺。 也就是说,大型端到端深度学习模型可以适应自然语言问题,从而提供更通用、性能更好的方法。
https://machinelearningmastery.com/prepare-text-data-machine-learning-scikit-learn/
您不能直接从原始文本转到拟合机器学习或深度学习模型。
您必须首先清理文本,这意味着将其拆分为单词并规范化问题,例如:
通常,我们将原始文本转换为可以建模的过程称为“标记化”,其中我们留下了单词列表或“标记”。
我们可以手动开发 Python 代码来清理文本,这通常是一个很好的方法,因为每个文本数据集都必须以独特的方式进行标记化。
例如,下面的代码片段将加载一个文本文件,按空格拆分标记,并将每个标记转换为小写。
filename = '...'
file = open(filename, 'rt')
text = file.read()
file.close()
# split into words by white space
words = text.split()
# convert to lowercase
words = [word.lower() for word in words]
许多标记原始文本的最佳实践已被捕获,并在称为自然语言工具包(简称 NLTK)的 Python 库中提供。
您可以通过在命令行上键入以下命令来使用 pip 安装此库:
sudo pip install -U nltk
安装后,还必须通过 Python 脚本安装库使用的数据集:
import nltk
nltk.download()
# load data
filename = '...'
file = open(filename, 'rt')
text = file.read()
file.close()
# split into words
from nltk.tokenize import word_tokenize
tokens = word_tokenize(text)
词及其出现的频率
https://blog.csdn.net/Elenstone/article/details/105134863
丢弃词序,统计词出现的频率 tf-idf
https://machinelearningmastery.com/prepare-text-data-machine-learning-scikit-learn/
如何使用 scikit-learn 对用于机器学习的文本数据进行编码
# 操作词袋模型:
# CountVectorizer:对语料库中出现的词汇进行词频统计,相当于词袋模型。
# 操作方式:将语料库当中出现的词汇作为特征,将词汇在当前文档中出现的频率(次数)作为特征值。
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer()
# 语料库
docs = np.array([
"Where there is a will, there is a way.",
"There is no royal road to learning.",
])
# bag是一个稀疏的矩阵。因为词袋模型就是一种稀疏的表示。
bag = count.fit_transform(docs)
# 输出单词与编号的映射关系。
print(count.vocabulary_)
# 调用稀疏矩阵的toarray方法,将稀疏矩阵转换为ndarray对象。
print(bag)
print(bag.toarray())
# where映射为编号8 there映射为编号5······
# 编号也是bag.toarray转换来的ndarray数组的索引
{'where': 8, 'there': 5, 'is': 0, 'will': 9, 'way': 7, 'no': 2, 'royal': 4, 'road': 3, 'to': 6, 'learning': 1}
(0, 8) 1
(0, 5) 2
(0, 0) 2
(0, 9) 1
(0, 7) 1
(1, 5) 1
(1, 0) 1
(1, 2) 1
(1, 4) 1
(1, 3) 1
(1, 6) 1
(1, 1) 1
[[2 0 0 0 0 2 0 1 1 1]
[1 1 1 1 1 1 1 0 0 0]]
在本课中,您将了解单词嵌入分布式表示,以及如何使用 Gensim Python 库开发单词嵌入。
考虑了前后的关系
单词嵌入是文本的学习表示,其中具有相同含义的单词具有相似的表示。
单词嵌入是一种提供单词的密集向量表示的方法,这些单词捕获了有关其含义的某些信息
正是这种表示单词和文档的方法可能被认为是深度学习在具有挑战性的自然语言处理问题上的关键突破之一。
使用密集和低维向量的好处之一是计算:大多数神经网络工具包不能很好地处理非常高维的稀疏向量。…密集表示的主要好处是泛化能力:如果我们认为某些特征可能提供相似的线索,那么提供能够捕获这些相似性的表示是值得的。
— 第 92 页,自然语言处理中的神经网络方法,2017 年。
词嵌入实际上是一类技术,其中单个词在预定义的向量空间中表示为实值向量。每个单词都映射到一个向量,并且向量值以类似于神经网络的方式学习,因此该技术通常被归入深度学习领域。
该方法的关键是为每个单词使用密集分布式表示的想法。
每个单词都由一个实值向量表示,通常为数十或数百个维度。这与稀疏单词表示(例如独热编码)所需的数千或数百万个维度形成鲜明对比。
与词汇表中的每个单词相关联,一个分布式单词特征向量…特征向量表示单词的不同方面:每个单词都与向量空间中的一个点相关联。功能的数量…比词汇量小得多
— 神经概率语言模型,2003 年。
分布式表示是基于单词的用法来学习的。这使得以相似方式使用的单词具有相似的表示形式,自然地捕捉到它们的含义。这可以与单词袋模型中清晰但脆弱的表示形成对比,除非明确管理,否则不同的单词具有不同的表示,无论它们如何使用。
Word2Vec
GloVe
How to Develop Word Embeddings in Python with Gensim
note
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.embeddings import Embedding
# define problem
vocab_size = 100
max_length = 32
# define the model
model = Sequential()
model.add(Embedding(vocab_size, 8, input_length=max_length))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# summarize the model
print(model.summary())
embeddings +CNN
一个关键的方法是使用词嵌入和卷积神经网络进行文本分类。
单层模型可以很好地处理中等大小的问题,以及如何配置它的想法。
直接对文本进行操作的更深层次的模型可能是自然语言处理的未来。
https://blog.csdn.net/weixin_39107270/article/details/135415889