计算机毕设 基于机器学习的文本聚类 - 可用于舆情分析-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

0 简介

今天学长向大家介绍一个毕设项目中文文本分类技术

中文文本分类 ( 机器学习 和 深度学习 ) - 新闻分类 情感分类 垃圾邮件分类

1 项目介绍

由于项目需要需要对旅游游记文本进行聚类为打标签做指导所以调研了主流的短文本聚类方法文本聚类主要还是分成两个方面。

1.1 提取文本特征

在《数学之美》前几章中详细讲了为何要将文本这个自然语言领域的事物转换成数学领域能处理的向量、矩阵。为了分析一段文本我们需要首先得到这段文本的表示向量这个向量就可以作为文本的特征输入决策器中进行判决。

1.2 聚类算法选择

这里的聚类算法就是上面说的决策器。聚类算法主要分成两大类一类是基于距离的迭代算法比如k-means还有一类是基于密度的流式聚类算法比如DBSCAN。他们各有优劣通常由于我们并不清楚聚类的簇数量并且由于海量文本迭代的效率比较低真实应用场景中我们在聚类算法的选择上更加倾向选DBSCAN这类的算法。

这里学长做了几组对照实验分别使用tf-idf或word2vec作为文本的特征采用k-means或者DBSCAN进行聚类分析。实验流程如下

2 代码实现

2.1 中文文本预处理

将清洗过的数据进行分词、去停用词。其中分词的时候载入预先设置好的自定义词典提高分词精度。笔者自己写了一个分词的类提高代码复用率。

from tools.tokenizer.wordCut import WordCut


mydict = ["mysenicdict.txt", "myfooddict.txt"]
file_path = '/home/zcy/haiNan/texttravelgen/data/clean_comments.txt'
# 默认是精确模式
test = WordCut()
test.addDictionary(mydict) # 加载自定义词典
 # 分词去停用词集成在类中了不显示在console保存分词后的文件到file_path目录
test.seg_file(file_path, show=False, write=True)

2.2 特征提取

2.2.1 Tf-idf

# 词频矩阵矩阵元素a[i][j] 表示j词在i类文本下的词频 
vectorizer = CountVectorizer()
# 统计每个词语的tf-idf权值
transformer = TfidfTransformer() 
freq_word_matrix = vectorizer.fit_transform(corpus)
#获取词袋模型中的所有词语
word = vectorizer.get_feature_names()
tfidf = transformer.fit_transform(freq_word_matrix)
# 元素w[i][j]表示j词在i类文本中的tf-idf权重
weight = tfidf.toarray()z

2.2.2 word2vec

# doc2vec
#训练并保存模型
import gensim

sentences = gensim.models.doc2vec.TaggedLineDocument(token_path)
model = gensim.models.Doc2Vec(sentences, size=100, window=2, min_count=3)
model.train(sentences,total_examples=model.corpus_count, epochs=1000)
model.save('../model/demoDoc2Vec.pkl')

2.3 聚类算法

2.3.1 k-means

# K-means聚类
print 'Start K-means:'
from sklearn.cluster import KMeans
clf = KMeans(n_clusters=20)
s = clf.fit(model.docvecs)
print s
#20个中心点  
print(clf.cluster_centers_)        
#每个样本所属的簇  
print(clf.labels_)  
i = 1  
while i <= len(clf.labels_):
    print i, clf.labels_[i-1]  
    i = i + 1    
#用来评估簇的个数是否合适距离越小说明簇分的越好选取临界点的簇个数  
print(clf.inertia_)

2.3.2 DBSCAN

# dbscan 密度聚类
from sklearn.cluster import DBSCAN

# Compute DBSCAN
db = DBSCAN(eps=0.005, min_samples=10).fit(weight)
print db.core_sample_indices_
db.labels_

2.4 实现效果

为了将聚类后的类别信息与原文信对照起来方便查看笔者写了一个类提高重用效率将结果写到ori_path的路径下并提供了排序的功能代码如下

from tools.labelMap.labelText import LabelText

label = clf.labels_
ori_path = "../data/clean_comments.txt"
labelAndText = LabelText(label, ori_path)
labelAndText.sortByLabel(write=True)

2.4.1 tf-idf + k-means聚类结果

new file saved in /home/zhouchengyu/haiNan/texttravelgen/data/sortedLabelText.csv
0   一下机场携程订的专车很准时的来接了我们服务也很好经过大约40分钟的车程我们从凤凰机场来到了亚龙湾。
0   下午1835坐动车返回美兰住在机场附近小旅馆老板人倒是挺好挺便宜装修这些也算对得起这个价格了。
0   中午十二点飞机准时到达海口美兰国际机场。到达厅内爷爷奶奶早已等待多时。
0   祥鹏航空8L9963特价机票加上机场建设费及燃油费等约300。我们老大火速抢完了27人的机票带着这个超级散团出发
0   到了海南一下飞机湿热的空气就迎面扑来。没几步路就出汗了。出了机场赶紧找订好的住宿的地方。
0   作为一个北方人去过的最南端就是福州了也是今年才去的一般都在武汉止步。终于在北京等了个把星期可以坐上飞机出发啦~~~
0   新加坡的过境签相当方便填一张入境卡就可以了而且居然不用排队。兴冲冲地通过海关后发现机场的两小时的免费观光大巴居然是在转机区而不是入境后只好换了100人民币的新币开始自助公交游。从机场坐地铁到Raffles Palace去找鱼尾狮公园Merlion Park。奇怪的是这么有名的地标性景点一路上居然没有任何指示……雕像附近合影的人超多大家都是到此一游。
0   所有的机场大巴都绕来绕去从同一条线路开往机场了40分钟后到达机场
0   樟宜机场被多家机构评为世界最佳机场是不无道理的。整个机场就像一个购物休闲中心吃喝玩乐各项设施应有尽有。在这里转机丝毫不用担心如何消磨时间。新加坡机场的登机一般提前一个小时因为安检被安排在了各个登机口。这样布局的好处是在机场里可以畅行无阻。加上新加坡机场实际上只有国际区没有国内区全国就这一个机场嘛因此除了边检其他区域都是连成一片的。
0   上班之后基本每次出门都是想要叫车。但是这次想来一次随心所欲的旅行从出发开始就不再走便捷的方法了机场大巴走起。这才发现志诚丽柏那个酒店门口的大巴是半小时发一次10分一次40分一次。会先到西稍门然后才出发。
0   用银行贵宾卡享受了机场贵宾室

label0都与机场有关可以看出来聚类效果还是不错的。

3   在沙滩上玩了一会我就去附近泳池边的WC换泳衣回来和LILY扑向大海试图游泳。其实浪还是挺大的我们在靠近沙滩的地方都不太能稳住自己远处几个金发的外国姑娘却能在浪里漂浮自如也许人家从小在海滩玩到大的吧羡慕啊。    我在水里玩的不亦乐乎LILY时刻紧盯着我的皮肤怕我晒伤我很惊讶他有着能看出我皮肤被晒黑程度的能力我自己看不出来……在海里玩了半小时的样子他果断拖回乐不思蜀的我说再晒我就要回去哭了。
3   南湾猴岛其实是个半岛但这里的位置得天独厚三面环海景色和离岛一样的美。除了拥有优越的热带海岛生态环境、猕猴特色资源、优质的海水以及滨海沙滩还有水上疍家鱼排的独特民俗风情。全国最长的跨海观光索道犹如一条凌空彩链横跨新村港湾将神秘的南湾猴岛、迷人的热带港湾、浓郁的疍家民俗、喧闹的渔港风情等串成一线。
3   大东海是三亚我常去的沙滩其他地方不是下饺子就是煮馄饨。
3   刚上船的时候心情还是挺激动的~想象岛上迷人的风景结果到站之后看到码头左边的天空还有点蓝色了就先往左边走去看看一路上人都很多零星的开着几个小店大概走了100多m的样子都都到头了路封着的一堆建筑垃圾在哪儿堆着也没看见机械设备动工。于是只能调头往回网右边走其实右边一来我就看见了只有很小一片沙滩我还以为左边会有一大片沙滩和浮潜的海域等着我们呢~越往右边走越是失望啊先经过美食一条街各种高价的食品和纪念品出售等终于穿过美食街的人群到了海边那更是失望比大东海划分的每个游泳区域还要小一半以上~还只有三个区域完全没得浮潜地方我也是醉了我还以为是像东南亚那些海岛一样上岛都是很宽泛的游泳和浮潜区域结果。。。而且这个区域离码头也不远水质可想而知当然人也非常多瞬间没了下海的欲望~真不知道网上那些好评怎么来的~商业化的气息太重了我不相信大多数人来这里是为了去深潜去玩那些海上项目~家人都说还不如在大东海游泳还要花100多的门票来看这乌泱泱的水~还好海边沙滩椅收费不贵15块一张随便躺
3   三亚自游行心得1、我不想去景点打卡只为纯度假。所以选择住大东海我住在大菠萝类似于京华城附近的哈曼酒店。去年才开的五星酒店设施完备吃住行都方便哈曼有私家沙滩有酒店电瓶车接送服务很贴心不是所有酒店都有私家沙滩需看清。如果住在没有私家沙滩的酒店各种不便我住的是哈曼的16楼行政山海房最高17层记住一定要高楼层楼层低了什么都看不到2、大东海商业发达价廉物美只是海水和沙滩略逊亚龙湾一筹。                               3、交通因为我住大东海很便利没有租车的必要。去较远的景点、接送机等我全程易到专车、滴滴专车非常方便4、关于第一市场易到司机告诉我们那已经相当于旅游商店的性质了大东海区域用餐我都在大菠萝。
3   从照片看就知道这时候的三亚天气不是很好时常乌云甚至下雨所以找出来的照片好不好看很大程度取决于天气怎么样啦大东海海滩上人很多长长的海岸线上都是人我去的这个时候天不是很热海水还是有些凉的多以游泳的人并不多大多数都在沙滩上捡贝壳或石头。
3   收拾完毕步行至大东海广场的沙滩脱鞋玩水啦
3   亚龙湾是很长一个海湾。沙滩除了名地细腻。有很多的星级酒店私人沙滩。当然我们去的是公共开放海滩建议四点以后再去游泳否则日晒很严重。我和小果果都在阴凉下。

第3类都与沙滩有关聚类效果也不错。

2.4.2 word2vec + k-means 聚类结果

1   直到回来后还在流连成都老火锅的味道。真的很好吃。用牛油做锅底加热后牛油化了根本不用加水的。
1   离开宽窄巷子回酒店附近吃了小天鹅午睡过后下午去人民广场喝茶采耳。
1   黄流老鸭海南最有特色的美食之一在三亚最正的黄流老鸭还是在胜利路的光明黄流老鸭店十多年的老店黄流老鸭必然是白切的才是最好的也是最好吃的再加上微热的蘸料就更美味了我们俩人点了白切黄流老鸭、虾酱地瓜叶和冬瓜海螺汤冬瓜海螺汤可以说是此次去三亚吃到的最好吃的汤品其他地方吃到的总有那么些不新鲜的无奈~这的冬瓜海螺汤太让我喜欢了现在想起来都能感觉到的味美~当然鸭肉那可是吃得精光的~海南的特色美食啊~~
1   很多老人在这里聊天喝茶打牌老成都的生活。我们也喝了盖碗茶叫了师傅来采耳享受安逸。
1   第三次登临这座热带岛屿。2013年来的时候还是一个刚上大一的小姑娘在海边遇到同是一个人来三亚游玩的泥巴后来成为了朋友在上海的时候还一起约着吃过饭逛过上海博物馆在夜晚的浦江边散步拍照。    2014年清明趁着假期去了海口约见了在海南念书的闺蜜住在海口巴纳纳国际青旅和一群来自五湖四海的朋友一起玩杀人游戏到凌晨三点多第二天醒来和青旅认识的姑娘一起逛海南的菜市场。来自济南的她对南方的蔬果特别感兴趣她说因为海南的水果多于是她就考了个海大的研究生准备过来捞水果了。    2015年国庆过后和一起奋战过高考的好朋友一起在不同的城市出发来到三亚找在三亚念书的闺蜜。一起住在三亚老班长国际青旅和青旅的义工老板们去吃了三亚最好吃的炒冰炸鸡去大东海游泳玩沙子好是快活。
1   从北京西开出的Z201次列车在漫长的27小时行驶后来到了我的城市。晚上吃过晚饭八点多到火车站候车第二天早上八点就能到三亚了。全程762公里途中跨越琼州海峡火车会被拆分成五节运上粤海轮渡抵达海南岛接驳后将继续行驶。前三图来自网络侵删。
1   海南鸡饭鸡饭的主料是鸡和大米最好的鸡饭选用的作料是“文昌鸡”。由于“文昌鸡”供不应求一般鸡饭摊档选用本地杂色鸡要求是刚成熟而尚未下蛋的鸡以1至1.5公斤重为宜。大米选用上等新鲜的优质米鸡是白切鸡。鸡饭皮色油黄肉白且嫩骨髓带血吃来清甜爽口。这种米饭油润软滑香浓味爽。
1   出发前在老班长国际青旅订好住宿。位置就在吉祥街径直往海边走不到五分钟吉祥街口有到各个景点的汽车公交招手即停交通十分便利。周围有海南最大的超市旺豪超市还有很多吃东西的小饭馆住下来不用愁吃的。
1   三个人一起逛超市看海鲜买水果海洋动物多的就像水族馆。因为海南气候原因种出来的水果都像是放大版的。如果不想在街头小贩那里买不足称的水果可以来超市看看一般海南的各种水果在这里都可以买到。
1   清补凉是三亚当地的一种小吃。将红枣、薏米、绿豆、芋头、西瓜、汤圆等煮熟的东西淋上椰子汁或糖水清热消暑是夏季必备的饮品。在冬天也可以吃到热的清补凉。清补凉摊多是设在路旁摆上一席小桌子和小橱窗旁边摆上一个保温冰桶几套塑料的椅子和木桌。清补凉摊的小橱窗里放着一排塑料碗碗里面分别装着糖水煮的芸豆、煮好的绿豆、通心粉、鹌鹑蛋、菠萝丁、西瓜丁、桂圆肉、红枣、薏米等等很是诱人

可以发现类别1的输出基本都是美食但是也有一些错分的情况发生考虑到Doc2Vec输出的向量跟向量大小、迭代次数等参数影响较大这只是一个Doc2Vec的baseline,这些错误聚类暂时还是可以接受的。

最后

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习