自然语言处理(NLP)是人工智能的一个子领域,它涉及理解和从人类语言(如文本和语音)中提取洞察。NLP的一些常见应用包括情感分析、聊天机器人、语言翻译、语音助手、语音识别等。例如,谷歌翻译、Flipkart和Swiggy等应用中的聊天机器人、Gmail中的自动补全功能、像Alexa、Siri和谷歌助手这样的个人助理、电子邮件垃圾邮件检测和文档摘要等。
在当今世界,每天大约产生2.5千万亿字节的数据,其中大部分是未结构化的,例如文本和音频。要利用这些数据并从中提取意义,需要能够处理文本和语音数据的技术。NLP就是这样一种技术,它帮助从这些类型的数据中提取意义。
NLP包括五个重要阶段:词汇分析、句法分析、语义分析、话语整合和语用分析。词汇分析是NLP过程中的第一步,将文本分解成一系列标记或单词以便于分析。它还涉及从句子中移除不必要的空白/空格。句法分析这一步指的是研究单词在句子中的排列,以确定单词是否以正确的顺序排列以构成意义。它还涉及检查句子是否在语法上正确,并把单词转换为词根形式。语义分析这一步涉及从字典中查找单词的含义,并检查单词是否具有意义。话语整合在任何段落中,一个句子的含义取决于上下文。这里分析即时句子/单词对下一句/单词的含义的影响。语用分析是NLP过程的最后阶段,它涉及从文本数据中提取洞察并理解上下文。
已经很好地了解了NLP,让进入RNN和LSTM模型!长短期记忆(LSTM)是一种监督型深度学习算法。在这里,神经元通过时间连接到它们自己。RNN的理念是记住前一个神经元中的信息,以便这些神经元可以将信息传递给自己的未来,以进行进一步的分析。这意味着特定时间实例(t1)的信息被用作下一个时间实例(t2)的输入。这是RNN的理念。
RNN的一个主要问题是梯度消失。在任何神经网络中,权重在训练阶段通过计算误差和通过网络反向传播来更新。但在RNN的情况下,这相当复杂,因为需要通过时间将这些神经元反向传播。问题在于计算这些权重。在每个时间实例计算的梯度必须通过早期网络中的权重反向乘以。因此,当深入网络的时间以计算权重时,梯度变得越来越弱,导致梯度消失。如果梯度值非常小,那么它对学习过程的贡献就不会太大。
# 导入所需库
import nltk
import pandas as pd
from nltk.corpus import stopwords
from textblob import Word
from sklearn.preprocessing import LabelEncoder
from collections import Counter
import wordcloud
from sklearn.metrics import classification_report,confusion_matrix,accuracy_score
from keras.models import Sequential
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.layers import Dense, Embedding, LSTM, SpatialDropout1D
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# 加载数据集并基于‘rating’创建新列‘sentiment’
data = pd.read_csv('amazon_alexa.tsv',sep='\t')
def sentiments(df):
if df['rating'] > 3.0:
return 'Positive'
elif df['rating'] <= 3.0:
return 'Negative'
data['sentiment'] = data.apply(sentiments, axis=1)
# 检查数据集中的空值
data_v1 = data[['verified_reviews','sentiment']]
data_v1.isnull().sum()
# 清洗数据,包括移除特殊字符、数字、不必要的符号和停用词。还需要将单词转换为它们的词根形式以便于解释。
def cleaning(df, stop_words):
# ...(省略部分代码)...
# 可视化评论中的常见单词。每个单词的大小代表它在数据中的出现频率。
common_words=''
for i in data_v1.verified_reviews:
i = str(i)
tokens = i.split()
common_words += " ".join(tokens)+" "
wordcloud = wordcloud.WordCloud().generate(common_words)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
# 使用‘sklearn’库中的‘Label Encoder’对目标变量进行编码
lb=LabelEncoder()
data_v1['sentiment'] = lb.fit_transform(data_v1['sentiment'])
# 将评论转换为数值向量
tokenizer = Tokenizer(num_words=500, split=' ')
tokenizer.fit_on_texts(data_v1['verified_reviews'].values)
X = tokenizer.texts_to_sequences(data['verified_reviews'].values)
X = pad_sequences(X)
# 构建LSTM模型
model = Sequential()
model.add(Embedding(500, 120, input_length = X.shape[1]))
model.add(SpatialDropout1D(0.4))
model.add(LSTM(176, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(2,activation='softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])
print(model.summary())
# 将数据分为训练和测试数据
y=pd.get_dummies(data_v1['sentiment'])
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.3, random_state = 42)
# 使用训练数据训练模型
batch_size=32
model.fit(X_train, y_train, epochs = 5, batch_size=batch_size, verbose = 'auto')
# 评估模型
model.evaluate(X_test,y_test)