本文主要是对《AI工程师(自然语言处理)体验课》课程的笔记整理
讲师:寒小阳
定义:自然语言处理(Natural Language Processing),简称NLP
,是一种利用计算机为工具对人类特有的书面形式和口头形式的自然语言的信息进行各种类型处理和加工的技术
任务:通过处理和理解语言,来构建执行某些任务的系统
地位:人工智能与语言学的交叉学科,是人工智能的一个重要分支
- 跟计算机视觉、语音等构成人工智能不同研究领域
- 也被叫做计算语言学
- 基于机器学习和深度学习可以解决很多NLP问题
Turing Test
(图灵测试):自然语言理解是人工智能的根本问题
自然语言处理的层级
从左到右: 声音、词态学、语句结构,上层语义,高级应用如文本推理
机器学习:人工对文本提取特征(预处理),稀疏表达
深度学习:端到端的学习,也叫做表示学习,稠密向量
机器学习基本处理流程
机器学习: 基于高维&稀疏的特征,如SVM
,Logistic回归
深度学习:基于密集向量
项目名称: 酒店评论情感分析
情感分析:(也称为意见挖掘)是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别和提取原素材中的主观信息。
具体表示就是,给你一段文本,用情感分析的自动化方法获取这一段内容中表达的情感色彩是什么?
通过爬虫技术获取到酒店的评论内容
传统机器学习文本表示:词袋模型
用稀疏向量去表示文本,也叫“独热向量”
深度学习文本表示:词嵌入(词向量)
以稠密向量的形式去表征词与词之间的向量关系
import warnings
warnings.filterwarnings("ignore")
import jieba
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['figure.figsize'] = (10, 5)
from wordcloud import WordCloud
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
从网络上爬取了部分酒店的评论数据,用于这个场景的模型构建。
stopwords = []
for line in open("./stopwords.txt"):
stopwords.append(line.strip())
def read_file(fi, sentiment, stopwords, words, sentences):
for line in open(fi):
try:
segs = jieba.lcut(line.strip())
segs = [word for word in segs if word not in stopwords and len(word) > 1]
words.extend(segs)
sentences.append((segs, sentiment)) # tuple
except:
print(line)
continue
words = []
sentences = []
sentiment = 1
read_file('./pos.txt', sentiment, stopwords, words, sentences)
sentiment = 0
read_file('./neg.txt', sentiment, stopwords, words, sentences)
# ML
x, y = zip(*sentences)
x = [" ".join(sentences) for sentences in x]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, test_size=0.1)
# feature extract
vec = CountVectorizer(ngram_range=(1, 2), max_features= 1000)
vec.fit(x_train)
def get_feature(x):
vec.transform(x)
classifier = MultinomialNB()
classifier.fit(vec.transform(x_train), y_train)
# 测试
classifier.score(vec.transform(x_test), y_test)
也可以换成其他分类, 如SVM
通过构建LSTM实现情感分类
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense, Embedding, LSTM
from sklearn.model_selection import train_test_split
import pandas as pd
tokenizer = Tokenizer(nb_words=2500, split=' ') # 保留2500个词
tokenizer.fit_on_texts(x)
X = tokenizer.texts_to_sequences(x)
X = pad_sequences(X)
# 设定embedding维度等超参数
embed_dim = 16
lstm_out = 100
batch_size = 32
# 构建LSTM网络
model = Sequential()
model.add(Embedding(2500, embed_dim, input_length=X.shape[1], dropout=0.2))
model.add(LSTM(lstm_out, dropout_U=0.2, dropout_W=0.2))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Y = pd.get_dummies(pd.DataFrame({'label': [str(target) for target in y]})).values
X_train, X_valid, Y_train, Y_valid = train_test_split(X, Y, test_size=0.1, random_state==2018)
# 拟合与训练模型
model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=10)
# 验证
score, acc = model.evaluate(X_valid, Y_valid, verbose=2, batch_size=batch_size)
print('Logloss损失: %.2f' %(score))
print('验证集的准确率 :%.2f'%(acc))
bad case
分析,优化点有哪些项目考核点: