重磅 !开源一个机器学习/情感分析实战项目(附源码/教程)

python学习 2019/05/18 10:41

分享一个在公司做的机器学习文本分类项目的demo,该分类项目是一个通用的文本分类项目,这里的数据集我酒店用户评价数据,分类模型为二分类,正面评价和负面评价,这里所说的通用,就是你可以根据你自己的数据,进行train_data的构造,比如你可以换成垃圾短信数据,通过本文方法进行分类,也可以适用于你遇到的其他文本分类场景进程尝试


一、数据集:


正面评价:2000_pos.txt

商务大床房,房间很大,床有2M宽,整体感觉经济实惠不错!
早餐太差,无论去多少人,那边也不加食品的。酒店应该重视一下这个问题了。
宾馆在小街道上,不大好找,但还好北京热心同胞很多~
前台 楼层服务员都不错,房间安静整洁,交通方便,吃的周围也挺多.唯一不足,卫生间地漏设计不好,导致少量积水.
这次去北京,是要去北师大办事,所以特意留意了下附近的宾馆。住了两天,首先该宾馆很好找,离西四大街很近,公交车护国寺站下步行两分钟就到。因离公交站近,去哪坐公交都方便,很省钱省事。宾馆外有很多小吃店,价位比王府井小吃街要便宜,护国寺街上报刊厅、2毛一分钟的公用长途电话、水果摊、24小时便利店、网吧应有尽有,很方便。房间很干净,在这方面,在北京住过的几个三星级的还不如这家二星级的。房间暖气也开得足够,缺点就是冲澡时水温太低,而且忽冷忽热,不知道是什么原因。卫生间的插座不能充电,窗头柜下没插座,所以只能在电视机柜后充电,不太方便。另宾馆对面的烟酒店里的烟不能买,多是假的。宾馆服务员都很热情,让人感觉很好。推荐一个!
3人间还是比较大的,就是暖气不是太暖和,时冷时热。被单会有油污的地方,不过还可以接受。洗漱间和厕所没有暖气洗澡刚开始会较冷。24小时热水、比较周到的服务、桶式饮用水还是不错的。周围环境还可以比较安静,西到西直门、动物园;北到积水潭、新街口豁口;南到西单;东到后海还是比较方便的地理位置。豁口新开的新华百货商场比较气派,还不错可以逛逛。推荐居住!
服务很热情,交通也很便利,下次如果去北京我还会选择这家酒店!
我是1020日一家人入住的,北京五日游,从门童,柜台接待,餐厅服务,卫生,都比较温馨,热情,礼貌,给人一种宾至如归之感.入住,结帐都很及时,速度很快.到北京各景点交通很方便.周围的景点步行10分钟到达的有梅
非常不错的酒店,依山傍水,里面大片森林,散散步很不错,坐在湖边也休息也是不错的选择;房间很幽静,房间的设施很好,服务员态度也很好。
订的标准间,但免费升级为行政间,不错。
携程这次不错,订的行政房给我免费升级到了8号楼的山景房。
酒店非常棒,,环境一流,。。
标准的商务酒店,最大的优点就是位置好。房间比较干净,设施还行,但有些细节还需要改进。楼层服务员很不错(上次住的6楼,在这里表扬一下这位服务员),收拾房间,做清洁很及时,认真,走的时候有东西忘了,追了我好长一段距离告诉我。
环境很不错,。。
宾馆内的环境不错,早上起来我都要逛一圈然后在去吃早饭,入住的人也很多,车场都停满了,服务也可以,总的来说不错,但是没有通过携程预订该酒店,在入住时即可享受该酒店提供的额外优惠,问总台小姐,人家说根本就没有这个,有疑问请自己去找携程问,汗!打携程的电话又总是打不通,只有算了!
刚刚入住过,喜欢山景房。尤其是酒店提供的散步路线图很让人喜欢。由于入住的是五号楼,离温泉稍远,正好赶上小雨,建议提供代步小车。
一家很好的度假型酒店,环境一流,尤其是户外的自然环境很好,房间的设施也不错.唯一有点不足的是酒店里的餐厅价格高了一点,已和香港4星酒店内的价格差不多了.温泉一般,比南京汤山的颐尚差.
通过携程预定的行政双床房(且提前付清房费)~最后居然给我们父女两人一间大床房~还一再申明没有双床房了~在我的一再要求下~最后虽然还是提供了双床房~但是印象大打折扣~
三月入住的五号楼豪华间,酒店的环境真的不错,从室内的陈列到窗外的景色,以及酒店内花园都显得华贵而清幽。
在上海市中心的位置,因此比较牛气。不过在周围几个酒店里性价比算高的了,大床房难订到。
酒店的位置非常好,过了街就是繁华的南京路,离地铁站也特别近。酒店的硬件在4星级里面算是不错的,服务也很好,可能开业的时间比较长了,房间里略显的有点旧,而且接近1000一晚的价格不能免费上网也有点不太人性化。也许上海稍微上点档次的酒店都是这样吧。
我在上海几天里住的最好的一个酒店,同为四星级,整体感觉是最有品质的,订房台给的是转角的2715房,非常舒服,儿子玩得非常高兴,但酒店的服务人员态度比较冷漠,对待内外宾还是有区别的,同样拦出租车,门僮居然对我说,请让我们的客人,我回头一看是一对外国人,同住这家酒店, 难道我不是客人?出于礼貌我让了,但心里很不舒服,希望携程的价格能更低点,
朋友对该酒店的评价比较满意,就是交通非常拥堵。每次进出都要花费很长的时间。
帮同事订的,以下是他给我反馈:It was excellent and I can recommend it to anyone else to stay there. My room was on the top floor, the 8th floor and very nice. Suggest always ask for the 8th floor, even though I did not see the other floors.
非常好的酒店,除了前台的服务态度.
交通方便,去南京步行街是上选.但是餐厅的营业时间(尤其是中餐厅)有些不便,中午二点半到已经没有午餐了.要知道,这家的中餐是小有名气的.
除了停车不是很方便,其他的都还不错的,服务质量也很高,市中心的环境也很吸引人,还不错的!
酒店的位置很方便,小套房的房间比较宽敞和舒适,住酒店停车过夜要收费40元。


负面评价:2000_neg_txt

import csv
标准间太差 房间还不如3星的 而且设施非常陈旧.建议酒店把老的标准间从新改善.
服务态度极其差,前台接待好象没有受过培训,连基本的礼貌都不懂,竟然同时接待几个客人;
地理位置还不错,到哪里都比较方便,
1。我住的是靠马路的标准间。房间内设施简陋,并且的房间玻璃窗户外还有一层幕墙玻璃,而且不能打开,导致房间不能自然通风,采光不好。
1。我住的是靠马路的标准间。房间内设施简陋,并且的房间玻璃窗户外还有一层幕墙玻璃,而且不能打开,导致房间不能自然通风,采光不好。
出差入住的酒店,订了个三人间.房间没空调,冷得要死,而且被子很潮.火车站旁,步行可到.据说当地的第一名金钥匙是这家
客观说,不怎么样的酒店。我是111日住的,天气特别冷,房间空调根本就不管用,我在房间待了4个小时手脚冰凉,最后没有办法打电话投诉,给我加了个电暖气,效果没变化。
酒店太旧了, 大堂感觉象三星级的, 房间也就是的好点的三星级的条件, 在青岛这样的酒店是绝对算不上四星标准, 早餐走了两圈也没有找到可以吃的, 太差了
由于房间里面的水是锈水,大堂副理免费升级到套间,由于我预定3天,讲好头2晚是478,第三晚是578。结果第三天直接告诉只能是678,经过与携程反映也没有效果,原因就是第三天有一批人来此开会,房间不够,故意把住客赶走。坚决再也不住这里了。态度十分差劲。
酒店设施老化严重。
感觉非常一般,房间很脏,而且上网还要收费,好象是2.5元一个小时,极度不爽。往市内走一点,很多又便宜又好的酒店,大把,以后不会再住这个名不副实的酒店,建议携程不要将这类酒店登入,有损携程名誉。
1,房间小
房间有异味,入住时室外低于10度,但房间的中央调只有冷风!!!!室内设施陈旧!户外声音较嘈杂!只能在大堂看到服务员!总体非常不好!应该只能算是准二星!
看携程上大家的点评不错,就订了间阳面220的房间,慕名前往。
本人53日入住。设施太陈旧,一股霉味,住店还收停车费,强烈不推荐。另外,协程给出的地址有误,是浔阳路,不是浔阳东路。
在天津是很差的酒店,定了4个单人间,结果2个没有窗户,2个只能看见相距很近的楼房屋顶,价格还偏高,又不含早,真是差极啦,结果定了2天一天就退房了,因为离天津\南开大学比较近才选择,永远不会在这里住,充其量也就是一个准二星.
天宇也就占了个位置还可以到光,内部设施和消耗品配备,实在是不怎么样,而且,很贵
这是我住过的最差的五星级酒店!85日住的所谓经济间,504元/晚;房间很小,通道小的只容下一条腿。卫生间没门,淋浴房居然也没门,洗澡水下不去,快漫出卫生间!换了一间,还是这样。地毯很脏!没有服务!再不住了!白送也不住!有被大刀砍的感觉。
很怀疑五星酒店的评价标准。三星都不如,很失望!
500多的房价,定的一间经济间,房间奇小无比,在里面都很难转身,淋浴设备也很差,被子不干净,盖在身上很痒,房间不通风,空气很差,隔音效果非常差,旁边屋做什么都能听见,半夜还被酒鬼乱敲门惊醒,这是我住过的最差的五星级酒店,千万不要在那儿住,开发区很多经济型酒店都比它好!!
这是我住过的最差的五星级酒店!85日住的所谓经济间,504元/晚;房间很小,通道小的只容下一条腿。卫生间没门,淋浴房居然也没门,洗澡水下不去,快漫出卫生间!换了一间,还是这样。地毯很脏!没有服务!再不住了!白送也不住!有被大刀砍的感觉。
很怀疑五星酒店的评价标准。三星都不如,很失望!


二、读取数据构造DataFrame


我们再读取txt文件时候,用到了pandas的read_table方法,对于负面评价,我们构造其标签为0,正面评价,构造标签为1,同时为了构造一整个DataFrame,把正面评价和负面评价进行拼接合并,用到append方法

def get_train_data(fu_txt_path,zheng_txt_path):
   fu_txt = pd.read_table(fu_txt_path, encoding="gbk")
   fu_txt.columns = ["data"]
   fu_txt["target"] = 0
   zheng_txt = pd.read_table(zheng_txt_path, encoding="gbk")
   zheng_txt.columns = ["data"]
   zheng_txt["target"] = 1
   train_data = fu_txt.append(zheng_txt).reset_index(drop=True)
   return train_data


合并后的数据集。特征名为data,标签名为target,标签值为0和1

data  target
0              标准间太差 房间还不如3星的 而且设施非常陈旧.建议酒店把老的标准间从新改善.       0
1           服务态度极其差,前台接待好象没有受过培训,连基本的礼貌都不懂,竟然同时接待几个客人;       0
2                                    地理位置还不错,到哪里都比较方便,       0
3    1。我住的是靠马路的标准间。房间内设施简陋,并且的房间玻璃窗户外还有一层幕墙玻璃,而且不能打...       0
4    1。我住的是靠马路的标准间。房间内设施简陋,并且的房间玻璃窗户外还有一层幕墙玻璃,而且不能打...       0
5    出差入住的酒店,订了个三人间.房间没空调,冷得要死,而且被子很潮.火车站旁,步行可到.据说当...       0
6    客观说,不怎么样的酒店。我是111日住的,天气特别冷,房间空调根本就不管用,我在房间待了4...       0
7    酒店太旧了, 大堂感觉象三星级的, 房间也就是的好点的三星级的条件, 在青岛这样的酒店是绝对...       0
8    由于房间里面的水是锈水,大堂副理免费升级到套间,由于我预定3天,讲好头2晚是478,第三晚是...       0
9                                            酒店设施老化严重。       0
10   感觉非常一般,房间很脏,而且上网还要收费,好象是2.5元一个小时,极度不爽。往市内走一点,很...       0
11                                               1,房间小       0
12   房间有异味,入住时室外低于10度,但房间的中央调只有冷风!!!!室内设施陈旧!户外声音较嘈杂...       0
13                      看携程上大家的点评不错,就订了间阳面220的房间,慕名前往。       0
14   本人53日入住。设施太陈旧,一股霉味,住店还收停车费,强烈不推荐。另外,协程给出的地址有误...       0
15   在天津是很差的酒店,定了4个单人间,结果2个没有窗户,2个只能看见相距很近的楼房屋顶,价格还...       0
16             天宇也就占了个位置还可以到光,内部设施和消耗品配备,实在是不怎么样,而且,很贵       0
17   这是我住过的最差的五星级酒店!85日住的所谓经济间,504元/晚;房间很小,通道小的只容下...       0
18                             很怀疑五星酒店的评价标准。三星都不如,很失望!       0
19   500多的房价,定的一间经济间,房间奇小无比,在里面都很难转身,淋浴设备也很差,被子不干净,...       0
20   这是我住过的最差的五星级酒店!85日住的所谓经济间,504元/晚;房间很小,通道小的只容下...       0
21                             很怀疑五星酒店的评价标准。三星都不如,很失望!       0
22   500多的房价,定的一间经济间,房间奇小无比,在里面都很难转身,淋浴设备也很差,被子不干净,...       0
23                         房间太小,无电梯,周围环境还可以,但正在修路,非常嘈杂       0
24                     房间装修陈旧,下水管堵塞,晚上折腾了2个多小时,还是没有修好。       0
25                         房间太小,无电梯,周围环境还可以,但正在修路,非常嘈杂       0
26                                硬件设施太旧,和房价不相符,价格还是贵了       0
27                    该酒店338元/标间价格绝对不值,不知道航空酒店定价标准是什么.       0
28   建议携程不要和这家酒店合作,名曰三星,要我看准星级都勉强!首先不在市区里面(去涵江区打车还要...       0
29   两星级的设施(可能还没有),四星的收费标准。真不知道四星级是怎么评下来的。和携程宣传有很大的...       0
..                                                 ...     ...
219  帮同事订的,以下是他给我反馈:It was excellent and I can reco...       1
220                                  非常好的酒店,除了前台的服务态度.       1
221  交通方便,去南京步行街是上选.但是餐厅的营业时间(尤其是中餐厅)有些不便,中午二点半到已经没...       1
222       除了停车不是很方便,其他的都还不错的,服务质量也很高,市中心的环境也很吸引人,还不错的!       1
223              酒店的位置很方便,小套房的房间比较宽敞和舒适,住酒店停车过夜要收费40元。       1
224         在上海市中心的位置,因此比较牛气。不过在周围几个酒店里性价比算高的了,大床房难订到。       1
225  酒店的位置非常好,过了街就是繁华的南京路,离地铁站也特别近。酒店的硬件在4星级里面算是不错的...       1
226  我在上海几天里住的最好的一个酒店,同为四星级,整体感觉是最有品质的,订房台给的是转角的271...       1
227              朋友对该酒店的评价比较满意,就是交通非常拥堵。每次进出都要花费很长的时间。       1
228                                  非常好的酒店,除了前台的服务态度.       1
229  交通方便,去南京步行街是上选.但是餐厅的营业时间(尤其是中餐厅)有些不便,中午二点半到已经没...       1


三、分词


分词的目的是为了后面构造词向量,将分好的每个词都用向量来表示,就是线性代数中的矩阵,因为数值型的矩阵可以被计算机计算(计算机底层根据01二进制进行计算)

这里我们传入的process_feature是我们需要处理的特征名,应用jieba.cut()方法产生分词后的一个可迭代对象,并转化成列表,成新的DataFrame

# 结巴分词
def get_cut_train_data(train_data,process_feature):
   tmp_feature = train_data[process_feature]
   print(type(process_feature))
   cut_list = []
   for i in tmp_feature:
       print(i)
       i  = list(jieba.cut(i))
       cut_list.append(i)
   train_data[process_feature] = cut_list
   print("结巴分词后的数据",train_data)


分好词的数据结构

结巴分词后的数据         
                            data                      target
0    [标准间, 太, 差,  , 房间, 还, 不如, 3, 星, 的,  , 而且, 设施, ...       0
1    [服务态度, 极其, 差, ,, 前台, 接待, 好象, 没有, 受过, 培训, ,, 连,...       0
2                [地理位置, 还, 不错, ,, 到, 哪里, 都, 比较, 方便, ,]
      0
3    [1, 。, 我, 住, 的, 是, 靠, 马路, 的, 标准间, 。, 房间内, 设施, ...       0
4    [1, 。, 我, 住, 的, 是, 靠, 马路, 的, 标准间, 。, 房间内, 设施, ...       0
5    [出差, 入住, 的, 酒店, ,, 订, 了, 个, 三人间, ., 房间, 没, 空调,...       0
6    [客观, 说, ,, 不怎么样, 的, 酒店, 。, 我, 是, 1, 月, 11, 日住,...       0
7    [酒店, 太旧, 了, ,,  , 大堂, 感觉, 象, 三星级, 的, ,,  , 房间,...       0
8    [由于, 房间, 里面, 的, 水, 是, 锈水, ,, 大堂, 副理, 免费, 升级, 到...       0
9                                    [酒店设施, 老化, 严重, 。]
      0
10   [感觉, 非常, 一般, ,, 房间, 很脏, ,, 而且, 上网, 还要, 收费, ,, ...       0
11                                       [1, ,, 房间, 小]
      0


四、去除停用词


上面分词好后的数据,我们看到有一些词,比如 太,是,的,而且,标点符号,我 等这些词,这些词属于没有多少实际意义的词,并不能反映该评价的一些特性,而且构造成向量,维度会比较多,有冗余,所以我们需要去掉,stopwords_list是我构造的一个停用词库,从一个txt文件种读取,停用词数据如下图


stop_words
XX





.
,


;

:

*
/

|
[
]
{
}
(
)
-
_
+
=


我们在去掉停用词时候,根据每个样本的下标,进行遍历,如果该样本种的词在停用词表,我们就删除,同时最后用一个新的remove_list来保存去除停用词后的样本

# 去除停用词
def remove_stop_words(train_data,process_feature,stopwords_list):
   tmp_feature = train_data[process_feature]
   remove_list = []
   for i in tmp_feature:
       index = len(i) - 1
       while index>0:
           if i[index] in stopwords_list:
               del i[index]
               index -=1
           else:
               index -=1
       remove_list.append(i)
   train_data[process_feature]=remove_list
   print("移出停用词后的数据",train_data)
   return train_data


下面是移除停用词后的train_data,很明显, 是,的等待 这些词已经被去掉,当然可能停用词表不是特别完善,有些词并不能完全去掉,这就需要我们手动对停用词表进行扩充,或者从网上下载一些比较全的词表

移出停用词后的数据            data  target
0    [标准间, 太, 差,  , 房间, 不如, 星,  , 而且, 设施, 非常, 陈旧, 建...       0
1    [服务态度, 极其, 差, 前台, 接待, 好象, 没有, 受过, 培训, 连, 基本, 礼...       0
2                               [地理位置, 不错, 哪里, 比较, 方便]
      0
3    [1, 住, 靠, 马路, 标准间, 房间内, 设施, 简陋, 并且, 房间, 玻璃窗, 户...       0
4    [1, 住, 靠, 马路, 标准间, 房间内, 设施, 简陋, 并且, 房间, 玻璃窗, 户...       0
5    [出差, 入住, 酒店, 订, 三人间, 房间, 没, 空调, 冷得, 要死, 而且, 被子...       0
6    [客观, 说, 不怎么样, 酒店, 月, 11, 日住, 天气, 特别, 冷, 房间, 空调...       0
7    [酒店, 太旧,  , 大堂, 感觉, 象, 三星级,  , 房间, 就是, 好点, 三星级...       0
8    [由于, 房间, 里面, 水, 锈水, 大堂, 副理, 免费, 升级, 套间, 由于, 预定...       0
9                                       [酒店设施, 老化, 严重]
      0
10   [感觉, 非常, 一般, 房间, 很脏, 而且, 上网, 还要, 收费, 好象, 2.5, ...       0
11                                          [1, 房间, 小]
      0
12   [房间, 异味, 入住, 室外, 低于, 10, 度, 房间, 中央, 调, 只有, 冷风,...       0
13     [看, 携程, 大家, 点评, 不错, 就订, 间, 阳面, 220, 房间, 慕名, 前往]
      0
14   [本人, 月, 日, 入住, 设施, 太, 陈旧, 一股, 霉味, 住店, 还收, 停车费,...       0
15   [在, 天津, 很, 差, 酒店, 定, 4, 单人间, 结果, 2, 没有, 窗户, 2,...       0
16   [天宇, 占, 位置, 可以, 光, 内部, 设施, 消耗品, 配备, 实在, 不怎么样, ...       0
17   [这, 住, 过, 最差, 五星级, 酒店, 8, 月, 日住, 所谓, 经济, 间, 50...       0
18              [很, 怀疑, 五星, 酒店, 评价, 标准, 三星, 不如, 很, 失望]
      0
19   [500, 多, 房价, 定, 一间, 经济, 间, 房间, 奇小, 无比, 里面, 很, ...       0
20   [这, 住, 过, 最差, 五星级, 酒店, 8, 月, 日住, 所谓, 经济, 间, 50...       0
21              [很, 怀疑, 五星, 酒店, 评价, 标准, 三星, 不如, 很, 失望]
      0
22   [500, 多, 房价, 定, 一间, 经济, 间, 房间, 奇小, 无比, 里面, 很, ...       0
23           [房间, 太小, 无, 电梯, 周围环境, 可以, 正在, 修路, 非常, 嘈杂]
      0
24    [房间, 装修, 陈旧, 下水管, 堵塞, 晚上, 折腾, 多, 小时, 还是, 没有, 修好]       0
25           [房间, 太小, 无, 电梯, 周围环境, 可以, 正在, 修路, 非常, 嘈杂]       0
26                  [硬件, 设施, 太旧, 房价, 不, 相符, 价格, 还是, 贵]       0
27   [该, 酒店, 338, 元, 标间, 价格, 绝对, 不值, 不, 知道, 航空, 酒店,...       0
28   [建议, 携程, 不要, 这家, 酒店, 合作, 名曰, 三星, 要, 看准, 星级, 勉强...       0
29   [两, 星级, 设施, 可能, 没有, 四星, 收费, 标准, 真不知道, 四星级, 怎么,...       0


、构造空格型数据


构造空格型数据,用了pandas的map函数,实现遍历

# 构造空格型字符串,将[觉得, 不是, 特别, 注重, 成绩, 那种]去掉中括号和逗号,逗号替换成空格
def change_list_to_str(train_data,process_feature):
   tmp_feature = train_data[process_feature]
   tmp_feature = tmp_feature.map(lambda x: " ".join(x))
   train_data[process_feature] = tmp_feature
   print("空格型数据",train_data)
   return train_data


看下面打印的数据,我们每个样本的词中间都是空格,并且去掉了中括号[ ],这种数据结构是我们传入后面构造词向量TF-IDF方法要求的数据结构

空格型数据                    data  target
0     标准间 太 差   房间 不如 星   而且 设施 非常 陈旧 建议 酒店 老 标准间 新 改善       0
1    服务态度 极其 差 前台 接待 好象 没有 受过 培训 连 基本 礼貌 不 懂 竟然 同时 ...       0
2                                     地理位置 不错 哪里 比较 方便       0
3    1 住 靠 马路 标准间 房间内 设施 简陋 并且 房间 玻璃窗 户外 还有 一层 幕墙 玻...       0
4    1 住 靠 马路 标准间 房间内 设施 简陋 并且 房间 玻璃窗 户外 还有 一层 幕墙 玻...       0
5    出差 入住 酒店 订 三人间 房间 没 空调 冷得 要死 而且 被子 很潮 火车站 旁 步行...       0
6    客观 说 不怎么样 酒店 月 11 日住 天气 特别 冷 房间 空调 根本 不管 房间 待 ...       0
7    酒店 太旧   大堂 感觉 象 三星级   房间 就是 好点 三星级 条件   青岛 这样 ...       0
8    由于 房间 里面 水 锈水 大堂 副理 免费 升级 套间 由于 预定 天 讲 好头 晚是 4...       0
9                                           酒店设施 老化 严重       0
10   感觉 非常 一般 房间 很脏 而且 上网 还要 收费 好象 2.5 元 一个 小时 极度 不...       0
11                                              1 房间 小       0
12   房间 异味 入住 室外 低于 10 度 房间 中央 调 只有 冷风 室内 设施 陈旧 户外 ...       0
13                  看 携程 大家 点评 不错 就订 间 阳面 220 房间 慕名 前往       0
14   本人 月 日 入住 设施 太 陈旧 一股 霉味 住店 还收 停车费 强烈 不 推荐 另外 协...       0
15   在 天津 很 差 酒店 定 4 单人间 结果 2 没有 窗户 2 只能 看见 相距 很近 楼...       0
16            天宇 占 位置 可以 光 内部 设施 消耗品 配备 实在 不怎么样 而且 很 贵       0


六、TF-IDF算法+分类算法+模型评价


def predict_class(train_data,feature,label,test_size,random_state,predict_method):
   try:
       x = train_data[feature]
       y = train_data[label]
       x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=test_size, random_state=random_state)
       print(x_train,x_test,y_train,y_test)
       # tfidf计算词向量和权重
       tfidf = TfidfVectorizer()
       x_train = tfidf.fit_transform(x_train)
       x_test = tfidf.transform(x_test)
       print("训练样本集",x_train.toarray())
       print("测试集",x_test.toarray())
       if predict_method == 0:
           rfc = MultinomialNB()
       elif predict_method == 1:
           rfc = GridSearchCV(svm.SVC(kernel="linear"), param_grid={"C": [0.1, 1, 10], "gamma": [1, 0.1, 0.01]}, cv=4)
       elif predict_method == 2:
           rfc = DecisionTreeClassifier(criterion="gini", max_depth=5)
       elif predict_method == 3:
           rfc = RandomForestClassifier(n_estimators=10, max_depth=4, criterion="entropy")
       rfc.fit(x_train, y_train)
       print("模型",rfc )
       y_predict = rfc.predict(x_test).tolist()
       rescore = rfc.score(x_test, y_test)
       print(rescore)
       print("测试目标值", y_test.tolist())
       print("预测目标值", y_predict)
       report = classification_report(y_true=y_test, y_pred=y_predict)
       s = confusion_matrix(y_true=y_test, y_pred=y_predict)
       print(s)
   except Exception as e:
       print(e)


train_test_split:方法是用来对数据进行切分

x : 传入的特征数据

y : 传入的标签数据

test_size参数是用来进行一个切分比例,我这里传入0.2表示训练数据占80%,测试数据占20%

random_state:是一个随机种子,表示是否随机,默认随机选取20%的数据作为测试数据

tfidf算法:上一部构造的分词好的DataFrame传入tfidf算法即可生成词向量,我用了toarray()方法转换成了numpy矩阵

训练样本集 [[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]
测试集 [[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]


训练模型:模型都直接用的api,可以有多种模型供选择,都可以尝试

rfc.fit(x_train, y_train)

模型预测:

y_predict = rfc.predict(x_test).tolist()
rescore = rfc.score(x_test, y_test)


模型效果:准确度0.86分

0.86
测试目标值 [0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
预测目标值 [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]


混淆矩阵:对角线是分正确的数量,35和8分别是0和1分类正确的数量

[[35  1]
[ 6  8]]


其他技术:

结巴分词有自定义词典, 默认分法会把“不完美”,"不符合"等词分为["不","完美"],["不","符合"], 这种默认分法会对模型的训练有一定潜在影响, 我们实际想要的仍然是["不完美"],["不符合"]这样的分词结果 ,你需要构造一个类似停用词表那样的自定义词表,然后load_userdict加载即可,这个细节知识自己去做


公众号回复: 情感分析 ,即可获取源码


python爬虫人工智能大数据公众号

知识图谱,重磅 !开源一个机器学习/情感分析实战项目(附源码/教程)