说起sentiment analysis,就不得不说起NLP选手必做题:Bag of Words Meets Bags of Popcorn ,以下简称“影评分析题”。必须负责任的说,这是一道很简单的题,就是对一段影评进行情感倾向预测(positive/negative)。数据为英文文本,数据集自己下载:🔗data
文本清洗技巧
1. re:正则表达式 Regular Expression
中文处理:
除了中文,其他字符全部去掉。这样处理后的output只剩下中文和连接断句的逗号。这个是把非中文的字符比如数字、英文、标点符号、html文本等全部洗掉了,比较狠。这个技能在中文数据集上会比较有用。
1 | import re |
英文处理:
除了英文字母,其他字符全部替换为空格。正则表达式就是专治各种不服。
1 | import re |
2. BeautifulSoup:清洗HTML、垃圾符号
很多网上爬下来的评价内容会带有HTML类型的文本,都是无效信息需要删除,首先”pip install beautifulsoup4“
1 | from bs4 import BeautifulSoup |
这样洗出来的文本”Elvira, Mistress of the Dark”就是真正有效的信息了。
了解文本清洗技巧之后,回到影评情感分析题本身,接下来开始正文。
第一步:创建文本清洗函数
影评分析题的文本是英文的,首先要创建一个简单的函数,将评论清理成我们可以使用的格式。我们只想要原始文本,而不是其他相关的HTML,或其他垃圾符号。
1 | import re |
加载数据,按照上面的函数将样本数据进行清洗:
1 | import pandas as pd |
我这里把整个labeled train data做为整个数据集,将其拆分成训练集、测试集:
1 | from sklearn.model_selection import train_test_split |
第二步:生成词向量
先看一下影评的平均文本长度:
1 | data['clean_review'].apply(lambda x: len(x.split(" "))).mean() |
使用keras的Tokenizer进行分词:
1 | from keras.preprocessing.text import Tokenizer |
第三步: 创建 分类器/模型
天底下的分类器千千万,可以随自己选几个尝试一下。
BiLSTM Classifier
1 | from keras.layers import Dense , Input , LSTM , Embedding, Dropout , Activation, GRU, Flatten |
需要一点时间,运行时会出现:
1 | Train on 16000 samples, validate on 4000 samples |
第四步: 模型评估
1 | list_sentences_test = X_test |
评估结果:
1 | F1-score: 0.8357478065700876 |
整个流程就差不多算完成啦,接下来就是进行模型优化,或者更换其它分类器。
写在最后
这篇就是简单走了个流程,仅作示例。除了本文提到的技巧,还有很多细节可以填充,比如去掉停用词等;还有细节可以优化,比如调整嵌入维度等。之后有空还会继续维护本篇,填充更多有效内容。
更多参考: