赞
踩
中文酒店评论语料:
train.tsv数据样式:
- sentence label
- 早餐不好,服务不到位,晚餐无西餐,早餐晚餐相同,房间条件不好,餐厅不分吸烟区.房间不分有无烟房. 0
- 去的时候 ,酒店大厅和餐厅在装修,感觉大厅有点挤.由于餐厅装修本来该享受的早饭,也没有享受(他们是8点开始每个房间送,但是我时间来不及了)不过前台服务员态度好! 1
- 有很长时间没有在西藏大厦住了,以前去北京在这里住的较多。这次住进来发现换了液晶电视,但网络不是很好,他们自己说是收费的原因造成的。其它还好。 1
- 非常好的地理位置,住的是豪华海景房,打开窗户就可以看见栈桥和海景。记得很早以前也住过,现在重新装修了。总的来说比较满意,以后还会住 1
- 交通很方便,房间小了一点,但是干净整洁,很有香港的特色,性价比较高,推荐一下哦 1
- 酒店的装修比较陈旧,房间的隔音,主要是卫生间的隔音非常差,只能算是一般的 0
- 酒店有点旧,房间比较小,但酒店的位子不错,就在海边,可以直接去游泳。8楼的海景打开窗户就是海。如果想住在热闹的地带,这里不是一个很好的选择,不过威海城市真的比较小,打车还是相当便宜的。晚上酒店门口出租车比较少。 1
- 位置很好,走路到文庙、清凉寺5分钟都用不了,周边公交车很多很方便,就是出租车不太爱去(老城区路窄爱堵车),因为是老宾馆所以设施要陈旧些, 1
- 酒店设备一般,套房里卧室的不能上网,要到客厅去。 0
获得训练集和验证集的标签数量分布
- # 导入必备工具包
- import seaborn as sns
- import pandas as pd
- import matplotlib.pyplot as plt
- # 设置显示风格
- plt.style.use('fivethirtyeight')
-
- # 分别读取训练tsv和验证tsv
- train_data = pd.read_csv("./cn_data/train.tsv", sep="\t")
- valid_data = pd.read_csv("./cn_data/dev.tsv", sep="\t")
-
-
- # 获得训练数据标签数量分布
- sns.countplot("label", data=train_data)
- plt.title("train_data")
- plt.show()
-
-
- # 获取验证数据标签数量分布
- sns.countplot("label", data=valid_data)
- plt.title("valid_data")
- plt.show()
获取训练集和验证集的句子长度分布
- # 在训练数据中添加新的句子长度列, 每个元素的值都是对应的句子列的长度
- train_data["sentence_length"] = list(map(lambda x: len(x), train_data["sentence"]))
-
- # 绘制句子长度列的数量分布图
- sns.countplot("sentence_length", data=train_data)
- # 主要关注count长度分布的纵坐标, 不需要绘制横坐标, 横坐标范围通过dist图进行查看
- plt.xticks([])
- plt.show()
-
- # 绘制dist长度分布图
- sns.distplot(train_data["sentence_length"])
-
- # 主要关注dist长度分布横坐标, 不需要绘制纵坐标
- plt.yticks([])
- plt.show()
-
-
- # 在验证数据中添加新的句子长度列, 每个元素的值都是对应的句子列的长度
- valid_data["sentence_length"] = list(map(lambda x: len(x), valid_data["sentence"]))
-
- # 绘制句子长度列的数量分布图
- sns.countplot("sentence_length", data=valid_data)
-
- # 主要关注count长度分布的纵坐标, 不需要绘制横坐标, 横坐标范围通过dist图进行查看
- plt.xticks([])
- plt.show()
-
- # 绘制dist长度分布图
- sns.distplot(valid_data["sentence_length"])
-
- # 主要关注dist长度分布横坐标, 不需要绘制纵坐标
- plt.yticks([])
- plt.show()
训练集句子长度分布:
添加图片注释,不超过 140 字(可选)
获取训练集和验证集的正负样本长度散点分布
- # 绘制训练集长度分布的散点图
- sns.stripplot(y='sentence_length',x='label',data=train_data)
- plt.show()
-
- # 绘制验证集长度分布的散点图
- sns.stripplot(y='sentence_length',x='label',data=valid_data)
- plt.show()
训练集上正负样本的长度散点分布:
验证集上正负样本的长度散点分布:
获得训练集与验证集不同词汇总数统计
- # 导入jieba用于分词
- # 导入chain方法用于扁平化列表
- import jieba
- from itertools import chain
-
- # 进行训练集的句子进行分词, 并统计出不同词汇的总数
- train_vocab = set(chain(*map(lambda x: jieba.lcut(x), train_data["sentence"])))
- print("训练集共包含不同词汇总数为:", len(train_vocab))
-
- # 进行验证集的句子进行分词, 并统计出不同词汇的总数
- valid_vocab = set(chain(*map(lambda x: jieba.lcut(x), valid_data["sentence"])))
- print("训练集共包含不同词汇总数为:", len(valid_vocab))
输出效果:
- 训练集共包含不同词汇总数为: 12147
- 训练集共包含不同词汇总数为: 6857
获得训练集上正负的样本的高频形容词词云
- # 使用jieba中的词性标注功能
- import jieba.posseg as pseg
-
- def get_a_list(text):
- """用于获取形容词列表"""
- # 使用jieba的词性标注方法切分文本,获得具有词性属性flag和词汇属性word的对象,
- # 从而判断flag是否为形容词,来返回对应的词汇
- r = []
- for g in pseg.lcut(text):
- if g.flag == "a":
- r.append(g.word)
- return r
-
- # 导入绘制词云的工具包
- from wordcloud import WordCloud
-
- def get_word_cloud(keywords_list):
- # 实例化绘制词云的类, 其中参数font_path是字体路径, 为了能够显示中文,
- # max_words指词云图像最多显示多少个词, background_color为背景颜色
- wordcloud = WordCloud(font_path="./SimHei.ttf", max_words=100, background_color="white")
- # 将传入的列表转化成词云生成器需要的字符串形式
- keywords_string = " ".join(keywords_list)
- # 生成词云
- wordcloud.generate(keywords_string)
-
- # 绘制图像并显示
- plt.figure()
- plt.imshow(wordcloud, interpolation="bilinear")
- plt.axis("off")
- plt.show()
-
- # 获得训练集上正样本
- p_train_data = train_data[train_data["label"]==1]["sentence"]
-
- # 对正样本的每个句子的形容词
- train_p_a_vocab = chain(*map(lambda x: get_a_list(x), p_train_data))
- #print(train_p_n_vocab)
-
- # 获得训练集上负样本
- n_train_data = train_data[train_data["label"]==0]["sentence"]
-
- # 获取负样本的每个句子的形容词
- train_n_a_vocab = chain(*map(lambda x: get_a_list(x), n_train_data))
-
- # 调用绘制词云函数
- get_word_cloud(train_p_a_vocab)
- get_word_cloud(train_n_a_vocab)
训练集正样本形容词词云:
获得验证集上正负的样本的形容词词云
- # 获得验证集上正样本
- p_valid_data = valid_data[valid_data["label"]==1]["sentence"]
-
- # 对正样本的每个句子的形容词
- valid_p_a_vocab = chain(*map(lambda x: get_a_list(x), p_valid_data))
- #print(train_p_n_vocab)
-
- # 获得验证集上负样本
- n_valid_data = valid_data[valid_data["label"]==0]["sentence"]
-
- # 获取负样本的每个句子的形容词
- valid_n_a_vocab = chain(*map(lambda x: get_a_list(x), n_valid_data))
-
- # 调用绘制词云函数
- get_word_cloud(valid_p_a_vocab)
- get_word_cloud(valid_n_a_vocab)
验证集正样本形容词词云:
举个栗子:
- 假设给定分词列表: ["是谁", "敲动", "我心"]
-
- 对应的数值映射列表为: [1, 34, 21]
-
- 我们可以认为数值映射列表中的每个数字是词汇特征.
-
- 除此之外, 我们还可以把"是谁"和"敲动"两个词共同出现且相邻也作为一种特征加入到序列列表中,
-
- 假设1000就代表"是谁"和"敲动"共同出现且相邻
-
- 此时数值映射列表就变成了包含2-gram特征的特征列表: [1, 34, 21, 1000]
-
- 这里的"是谁"和"敲动"共同出现且相邻就是bi-gram特征中的一个.
-
- "敲动"和"我心"也是共现且相邻的两个词汇, 因此它们也是bi-gram特征.
-
- 假设1001代表"敲动"和"我心"共同出现且相邻
-
- 那么, 最后原始的数值映射列表 [1, 34, 21] 添加了bi-gram特征之后就变成了 [1, 34, 21, 1000, 1001]
提取n-gram特征:
- # 一般n-gram中的n取2或者3, 这里取2为例
- ngram_range = 2
-
- def create_ngram_set(input_list):
- """
- description: 从数值列表中提取所有的n-gram特征
- :param input_list: 输入的数值列表, 可以看作是词汇映射后的列表,
- 里面每个数字的取值范围为[1, 25000]
- :return: n-gram特征组成的集合
- eg:
- >>> create_ngram_set([1, 4, 9, 4, 1, 4])
- {(4, 9), (4, 1), (1, 4), (9, 4)}
- """
- return set(zip(*[input_list[i:] for i in range(ngram_range)]))
调用:
- input_list = [1, 3, 2, 1, 5, 3]
- res = create_ngram_set(input_list)
- print(res)
输出效果:
- # 该输入列表的所有bi-gram特征
- {(3, 2), (1, 3), (2, 1), (1, 5), (5, 3)}
文本长度规范的实现:
- from keras.preprocessing import sequence
-
- # cutlen根据数据分析中句子长度分布,覆盖90%左右语料的最短长度.
- # 这里假定cutlen为10
- cutlen = 10
-
- def padding(x_train):
- """
- description: 对输入文本张量进行长度规范
- :param x_train: 文本的张量表示, 形如: [[1, 32, 32, 61], [2, 54, 21, 7, 19]]
- :return: 进行截断补齐后的文本张量表示
- """
- # 使用sequence.pad_sequences即可完成
- return sequence.pad_sequences(x_train, cutlen)
调用:
- # 假定x_train里面有两条文本, 一条长度大于10, 一天小于10
- x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],
- [2, 32, 1, 23, 1]]
-
- res = padding(x_train)
- print(res)
输出效果:
- [[ 5 32 55 63 2 21 78 32 23 1]
- [ 0 0 0 0 0 2 32 1 23 1]]
回译数据增强实现:
- # 假设取两条已经存在的正样本和两条负样本
- # 将基于这四条样本产生新的同标签的四条样本
- p_sample1 = "酒店设施非常不错"
- p_sample2 = "这家价格很便宜"
- n_sample1 = "拖鞋都发霉了, 太差了"
- n_sample2 = "电视不好用, 没有看到足球"
-
- # 导入google翻译接口工具
- from googletrans import Translator
- # 实例化翻译对象
- translator = Translator()
- # 进行第一次批量翻译, 翻译目标是韩语
- translations = translator.translate([p_sample1, p_sample2, n_sample1, n_sample2], dest='ko')
- # 获得翻译后的结果
- ko_res = list(map(lambda x: x.text, translations))
- # 打印结果
- print("中间翻译结果:")
- print(ko_res)
-
-
- # 最后在翻译回中文, 完成回译全部流程
- translations = translator.translate(ko_res, dest='zh-cn')
- cn_res = list(map(lambda x: x.text, translations))
- print("回译得到的增强数据:")
- print(cn_res)
输出效果:
- 中间翻译结果:
- ['호텔 시설은 아주 좋다', '이 가격은 매우 저렴합니다', '슬리퍼 곰팡이가 핀이다, 나쁜', 'TV가 잘 작동하지 않습니다, 나는 축구를 볼 수 없습니다']
- 回译得到的增强数据:
- ['酒店设施都非常好', '这个价格是非常实惠', '拖鞋都发霉了,坏', '电视不工作,我不能去看足球']
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。