自然语言处理与LSTM模型构建指南

自然语言处理(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)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485