自然语言及语音处理项目式教程 实训指导 实训12 游客目的地聚类分析_第1页
自然语言及语音处理项目式教程 实训指导 实训12 游客目的地聚类分析_第2页
自然语言及语音处理项目式教程 实训指导 实训12 游客目的地聚类分析_第3页
自然语言及语音处理项目式教程 实训指导 实训12 游客目的地聚类分析_第4页
自然语言及语音处理项目式教程 实训指导 实训12 游客目的地聚类分析_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《自然语言处理技术》所示。表STYLEREF1\s3SEQ表\*ARABIC\s13景区和酒店编号的筛选结果景区编号酒店编号高层次A39、A23、A06高层次H37、H06、H11中层次A12、A34、A01中层次H10、H41、H35低层次A42、A04、A27低层次H17、H50、H43景区和酒店特征聚类使用K-Means聚类算法对数据预处理后的景区/酒店进行聚类,步骤如下。创建、训练K-Means模型。通过轮廓系数法进行K值的选取。其中,将K值的寻优范围定为3~9,通过调用metrics模块中的silhouette_score函数,计算轮廓系数,寻找最佳K值。这里需要注意的是,在进行聚类时从3类开始的,而在返回的K值索引是从0开始,因此索引加上3才能得到真实的K值。使用K-Means聚类的算法提取特征词,即进行聚类特色分析。实现K-Means文本聚类需要计算TF-IDF,如REF_Ref137115708\h代码314REF_Ref132317150\h所示。该代码中定义了transform和train两个函数。transform函数用于计算TF-IDF矩阵,而train函数用于训练K-Means模型,train函数可以选择是否输出聚类主题和是否返回聚类模型。代码STYLEREF1\s3SEQ代码\*ARABIC\s114基于TF-IDF的K-Means文本聚类importosimportpandasaspdfromsklearn.feature_extraction.textimportTfidfVectorizerimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansimportsklearnimportre#计算TF-ITFdeftransform(dataset):"""参数:dataset:数据集返回值:X:计算得到的TF-IDF矩阵vectorizer:使用的TfidfVectorizer对象"""vectorizer=TfidfVectorizer(max_df=0.5,min_df=2,use_idf=True)X=vectorizer.fit_transform(dataset)returnX,vectorizer#训练K-Means模型deftrain(X,vectorizer,true_k,showLable=False,choice_k=False):"""参数:X:TF-IDF矩阵vectorizer:使用的TfidfVectorizer对象true_k:聚类的簇数showLable:是否输出聚类主题choice_k:是否返回聚类模型返回值:如果choice_k为True,返回训练好的K-Means模型"""#聚类km=KMeans(n_clusters=true_k,init='k-means++',max_iter=300,n_init=1,verbose=False,random_state=250)km.fit(X)#是否输出聚类主题ifshowLable:order_centroids=km.cluster_centers_.argsort()[:,::-1]terms=vectorizer.get_feature_names()foriinrange(true_k):print("主题%d:"%(i+1),end='')forindinorder_centroids[i,:10]:print('%s'%terms[ind],end='')print()#是否返回聚类模型ifchoice_k==True:returnkmREF_Ref137115708\h代码314REF_Ref132317150\h中使用了sklearn.cluster库中的KMeans函数构建K-Means模型,KMeans函数的常用参数说明如REF_Ref137115793\h表34REF_Ref133335900\h所示。表STYLEREF1\s3SEQ表\*ARABIC\s14KMeans函数的常用参数说明参数名称参数说明n_clusters接收int,表示聚类的数量,即最终要形成的簇数(K值)。默认为8init接收{'k-means++','random'},表示初始质心的选择方法。其中,'k-means++'是一种加速收敛的方法,'random'为随机选择。默认为'k-means++'max_iter接收int,表示算法的最大迭代次数。默认为300n_init接收int,表示用不同质心种子运行算法的次数。默认为10verbose接收int,表示是否输出详细的调试信息。默认为0random_state接收int,表示用于生成随机数的种子,指定random_state可以确保每次运行时结果的一致性。默认为None指定簇的个数K,如REF_Ref137115717\h代码315REF_Ref132317233\h所示。其中,自定义的k_determin的函数通过轮廓系数法确定最佳的聚类簇数。k_determin函数接受一个数据集作为输入,并根据聚类结果的轮廓系数来选择最佳的簇数。在给定的代码中,聚类簇数的范围为3~10。对于每个聚类簇数,首先使用transform函数计算数据集的TF-IDF矩阵,并使用train函数训练K-Means模型;然后计算轮廓系数并将其添加到列表S中;最后,找到具有最大轮廓系数的聚类簇数,并使用该簇数重新训练K-Means模型。此外,k_determin函数还可以根据参数showS来决定是否绘制簇数与轮廓系数之间的关系图。代码STYLEREF1\s3SEQ代码\*ARABIC\s115指定簇的个数K#指定簇的个数K——使用轮廓系数法defk_determin(dataset,showS=False):"""参数:dataset:数据集showS:是否展示轮廓系数图"""X,vectorizer=transform(dataset)S=[]#聚类的数量在3~10之间foriinrange(3,10):km=train(X,vectorizer,true_k=i,choice_k=True)#返回簇标签labels=km.labels_#调用字模块metrics中的silhouette_score函数,计算轮廓系数S.append(sklearn.metrics.silhouette_score(X,labels,metric='euclidean'))#按轮廓系数寻找最佳k值max_k=S.index(max(S))print('最优K值',max_k+3)#使用最佳K值进行聚类train(X,vectorizer,true_k=max_k+3,showLable=True)ifshowS:#展示轮廓系数#中文和负号的正常显示plt.rcParams['font.sans-serif']=['MicrosoftYaHei']plt.rcParams['axes.unicode_minus']=False#设置绘图风格plt.style.use('ggplot')#绘制K的个数与轮廓系数的关系plt.plot(range(3,10),S,'b*-')plt.xlabel('簇的个数')plt.ylabel('轮廓系数')#显示图形plt.show()轮廓系数(SilhouetteCoefficient)是一种衡量聚类效果的指标,可以用于评估聚类结果的紧密性和分离性。REF_Ref137115717\h代码315REF_Ref132317233\h中使用sklearn库中的silhouette_score函数计算所有点的平均轮廓系数,silhouette_score函数的常用参数说明如REF_Ref137115804\h表35REF_Ref132317265\h所示。表STYLEREF1\s3SEQ表\*ARABIC\s15silhouette_score函数的常用参数说明参数名称参数说明X接收矩阵,表示输入的特征矩阵,如TF-IDF矩阵。无默认值labels接收list或numpy数组,表示数据点的聚类标签。无默认值metric接收str,表示用于计算点之间距离的度量方法,可选的度量方法包括'manhattan'、'cosine'等,默认为'euclidean'加载与提取评论,如REF_Ref137115723\h代码316REF_Ref132317294\h所示。代码中包含两个函数:loadDataSet和fileCut。loadDataSet函数用于从指定的文件中加载数据集。它逐行读取文件,并根据给定的fileType参数(默认为float)来解析每一行的数据。数据被存储在一个名为dataMat的列表中,该列表最后被返回。fileCut函数用于从输入的Excel文件(file_name)中提取评论内容,并将其写入一个新的文件(writeFile)。代码STYLEREF1\s3SEQ代码\*ARABIC\s116加载与提取评论#加载预处理后的数据defloadDataSet(fileName,fileType='float'):dataMat=[]#打开文件fr=open(fileName,encoding='utf-8')#逐行读取文件forlineinfr.readlines():#读取的数据类型为striffileType=='str':curLine=line.strip().split('\t')else:#读取的数据类型为floatcurLine=map(float,line.strip().split('\t'))ifcurLine!=['']:dataMat.append(curLine)#返回数据returndataMat#把预处理后样本文件中的评论内容提取出来,并写入新文件deffileCut(file_name,writeFile):#读取Excel文件view=pd.read_excel(file_name)#打开写文件frW=open(writeFile,'w',encoding='utf-8')#逐行处理Excel文件中的评论内容foriinrange(len(view)):#正则表达式匹配中文内容content_regx='\'([\u4e00-\u9fa5]*)\''a=re.findall(content_regx,view['评论内容'][i])#把匹配到的中文内容写入新文件forjina:frW.write(j)frW.write('\t')#写完一条评论后换行frW.write('\n')#关闭文件frW.close()景区与酒店评论聚类,如REF_Ref137115729\h代码317REF_Ref132317325\h所示,通过自定义k_means函数对给定的景区和酒店评论数据执行K-Means聚类。首先,对景区和酒店数据分别进行处理,在处理过程中,需要检查分词后的文件是否存在,若不存在,则进行分词,并将分词后的数据加载到数据集中。然后,将数据集中的数据类型转换为字符串,并使用轮廓系数法确定聚类簇的数量。最后,调用k_determin函数执行聚类。在主函数中,指定预处理后数据的存储位置和切分评论内容后的存储位置,并提供景区和酒店的名称列表后,调用k_means函数进行聚类。代码STYLEREF1\s3SEQ代码\*ARABIC\s117景区与酒店评论聚类#定义K-Means聚类函数defk_means(data_dir,save_dir,spot_name,hotel_name):#确定景区的类个数foriinrange(len(spot_name)):#文件名file_name=spot_name[i]+'景区2.xlsx'#分词后的文件名cutword_name=spot_name[i]+'cutword.txt'print("")print(spot_name[i]+'K-Means聚类结果')#文件路径拼接data_file_path=os.path.join(data_dir,file_name)cut_word_path=os.path.join(save_dir,cutword_name)#分词-去掉停用词,先确实是否已经存在分词文件,没有则进行分词ifos.path.exists(cut_word_path)==False:fileCut(data_file_path,cut_word_path)#加载分词之后的数据dataset=loadDataSet(cut_word_path,fileType='str')#数据类型转化forjinrange(len(dataset)):dataset[j]=str(dataset[j])#确定聚类的个数k_determin(dataset)#确定酒店的聚类数量foriinrange(len(hotel_name)):#文件名file_name=hotel_name[i]+'酒店2.xlsx'#分词后的文件名cutword_name=hotel_name[i]+'cutword.txt'print("")print(hotel_name[i]+'K-Means聚类结果')#文件路径拼接data_file_path=os.path.join(data_dir,file_name)cut_word_path=os.path.join(save_dir,cutword_name)#分词-去掉停用词,先确实是否已经存在分词文件,没有则进行分词ifos.path.exists(cut_word_path)==False:fileCut(data_file_path,cut_word_path)#加载分词之后的数据dataset=loadDataSet(cut_word_path,fileType='str')#数据类型转化forjinrange(len(dataset)):dataset[j]=str(dataset[j])#确定聚类的个数k_determin(dataset)if__name__=='__main__':data_dir='../tmp/已拆分数据'#预处理后数据的存储位置save_dir='../tmp/已拆分评论内容'#切分评论内容后的存储位置#高中低选择的酒店和景区spot_name=['A39','A23','A06','A12','A34','A01','A41','A04','A27']hotel_name=['H37','H06','H11','H10','H41','H35','H17','H50','H43']#使用K-Means模型进行聚类k_means(data_dir,save_dir,spot_name,hotel_name)运行景区和酒店特征聚类代码后,选择酒店和景区部分聚类结果进行展示,具体为景区A23、A34、A04,以及酒店H06、H35、H43进行展示。……A23K-Means聚类结果最优K值9主题1:岭南一去建筑古典江南很大名园公园私家园内主题2:苏州园林老人很漂亮游玩小孩环境优美景点味道绿树成荫值得一看主题3:拍照好去处景色私家园林好找花园景致取景亏了秀丽主题4:景色门票景点票价小贵漂亮建筑小时没什么不值主题5:取票便宜很大园区一去环境下次舒服风景如画售票处主题6:感觉园子好玩挺大景色很漂亮下次天气喜欢不值主题7:风景清净好玩喜欢小贵舒服很美园内宜人取票主题8:古色古香景色令人短信私家园林小桥流水散步环境好去处荷花主题9:环境优雅门票一去好玩景色空气家人便宜清静……A34K-Means聚类结果最优K值5主题1:开心孩子小孩东西门票取票玩得刺激身份证感觉主题2:挺好玩还好台风下雨算高价钱恐龙海螺门票平时主题3:好玩喜欢刺激下次便宜环境干净孩子恐龙危机景色主题4:小朋友不用玩玩非常适合排队大人大熊光头挺好玩还行主题5:游乐晚上景色开心东西刺激玩得夜场偏少工作人员……A04K-Means聚类结果最优K值9主题1:刺激过山车挺好玩取票下次便宜好多夜场喜欢人太多主题2:身份证入园取票不用买票就行了好玩排队订票入场主题3:感觉好玩刺激总体排队东西真的喜欢挺好玩人太多主题4:排队人太多小时不用过山车太久好玩刺激节假日好久主题5:还好排队人太多晚上没开愉快好多装扮雄鹰好玩主题6:晚上好玩白天刺激没什么开放万圣节排队游乐好多主题7:开心玩得好玩孩子刺激下次小孩取票女朋友过山车主题8:万圣节鬼屋气氛吓人人太多恐怖好玩排队氛围工作人员主题9:好玩刺激下次景色过山车水上乐园还会很美人太多……H06K-Means聚类结果最优K值7主题1:入住感受游乐得体离开挺不错很棒打扫卫生游泳小时主题2:干净卫生整洁温泉房间舒适环境下次早餐真的主题3:早餐温泉孩子亲子环境优美喜欢泡温泉工作人员度假味道主题4:下次小朋友还会喜欢开心环境小孩早餐儿童大人主题5:房间服务员温泉孩子流溪河主动晚上早餐喜欢入住主题6:感觉总体温泉宾至如归机会孩子入住早餐房间感受主题7:环境温泉舒服早餐房间舒适水质安静住宿度假……H35K-Means聚类结果最优K值9主题1:不好总体颜色布局女性好像好吃好好好找安静主题2:前台小姐姐房间舒服干净哥哥漂亮礼貌很漂亮第一次主题3:宽敞舒服干净卫生舒适房间颜色女性好像好吃主题4:卫生干净房间下次交通安静环境整洁前台第二次主题5:这家每次第几次温馨颜色小时女性好像好吃好好主题6:舒服房间很大环境好找感觉整洁干净很棒宽敞主题7:舒适房间干净很棒环境安静温馨环境卫生通风地理位置主题8:房间干净环境下次停车场感觉喜欢入住位置安静主题9:客房干净床垫服务员卫生舒服前台环境女性好像……H43K-Means聚类结果最优K值9主题1:景观小蛮感觉交通陈旧珠江老牌超级停车安静主题2:卫生干净位置酒店设施交通一点陈旧这家绝佳礼貌主题3:早餐地段位置下次珠江停车场靠近游泳池小蛮自助主题4:位置装修珠江小蛮出行景观空调稍微合适总体主题5:泳池入住出差宽敞装修房间珠江早餐旅行环境优美主题6:房间江景景色太旧无敌小蛮味道珠江窗户工作人员主题7:前台地理位置舒服服务员办理客服小蛮五星小姐姐不怎么样主题8:老旧风景硬件珠江位置景观无敌小蛮江景安排主题9:环境位置珠江早餐小蛮空调风景还来下次晚上聚类结果分析针对9个景区和9个酒店进行的特色聚类挖掘结果,由于其挖掘结果内容篇幅较大,所以此处仅展现综合评价为高、中、低3个层次中各一个景区和酒店的分析结果。其中,景区选择A23(高层次)、A34(中层次)和A04(低层次);酒店选择H06(高层次)、H35(中层次)、H43(低层次)。景区A23的特色聚类结果如REF_Ref137115831\h表36REF_Ref132621278\h所示。表STYLEREF1\s3SEQ表\*ARABIC\s16景区A23的特色聚类结果主题聚类结果主题1岭南一去建筑古典江南很大名园公园私家园内主题2苏州园林老人很漂亮游玩小孩环境优美景点味道绿树成荫值得一看主题3拍照好去处景色私家园林好找花园景致取景亏了秀丽主题4景色门票景点票价小贵漂亮建筑小时没什么不值主题5取票便宜很大园区一去环境下次舒服风景如画售票处主题6感觉园子好玩挺大景色很漂亮下次天气喜欢不值主题7风景清净好玩喜欢小贵舒服很美园内宜人取票主题8古色古香景色令人短信私家园林小桥流水散步环境好去处荷花主题9环境优雅门票一去好玩景色空气家人便宜清静根据A23景区的聚类结果,提取特征词中体现特色的关键词,如“苏州园林”“古色古香”“舒服”“清净”等,同时对比原评论进行分析,得到A23景区特色与亮点是:古典园林、占地较大、风景优美,值得一去。景区A34的特色聚类结果如REF_Ref137115837\h表37REF_Ref132621297\h所示。表STYLEREF1\s3SEQ表\*ARABIC\s17景区A34的特色聚类结果主题聚类结果主题1开心孩子小孩东西门票取票玩得刺激身份证感觉主题2挺好玩还好台风下雨算高价钱恐龙海螺门票平时主题3好玩喜欢刺激下次便宜环境干净孩子恐龙危机景色主题4小朋友不用玩玩非常适合排队大人大熊光头挺好玩还行主题5游乐晚上景色开心东西刺激玩得夜场偏少工作人员根据A34景区的聚类结果,提取特征词中体现特色的关键词,如“小孩子”“大人”“刺激”“门票”“便宜”等,同时对比原评论进行分析,得到A34景区特色与亮点是:机动游戏乐园、项目刺激、大人和小孩均适合,但人较多影响游玩体验。景区A04的特色聚类结果如REF_Ref137115840\h表38REF_Ref132621305\h所示。表STYLEREF1\s3SEQ表\*ARABIC\s18景区A04的特色聚类结果主题聚类结果主题1刺激过山车挺好玩取票下次便宜好多夜场喜欢人太多主题2身份证入园取票不用买票就行了好玩排队订票入场主题3感觉好玩刺激总体排队东西真的喜欢挺好玩人太多主题4排队人太多小时不用过山车太久好玩刺激节假日好久主题5还好排队人太多晚上没开愉快好多装扮雄鹰好玩主题6晚上好玩白天刺激没什么开放万圣节排队游乐好多主题7开心玩得好玩孩子刺激下次小孩取票女朋友过山车主题8万圣节鬼屋气氛吓人人太多恐怖好玩排队氛围工作人员主题9好玩刺激下次景色过山车水上乐园还会很美人太多根据A04景区的聚类结果,提取特征词中体现特色的关键词,如“取票”“人太多”“排队”“万圣节”等,同时对比原评论进行分析,得到A04景区特色与亮点是:可以凭身份证直接取票入园、项目好玩刺激、整体项目以夜场为主,总体不错,但节假日人多需要排队。酒店H06的特色聚类结果如REF_Ref137115844\h表39REF_Ref132621313\h所示。表STYLEREF1\s3SEQ表\*ARABIC\s19酒店H06的特色聚类结果属性名称示例主题1入住感受游乐得体离开挺不错很棒打扫卫生游泳小时主题2干净卫生整洁温泉房间舒适环境下次早餐真的主题3早餐温泉孩子亲子环境优美喜欢泡温泉工作人员度假味道主题4下次小朋友还会喜欢开心环境小孩早餐儿童大人主题5房间服务员温泉孩子流溪河主动晚上早餐喜欢入住主题6感觉总体温泉宾至如归机会孩子入住早餐房间感受主题7环境温泉舒服早餐房间舒适水质安静住宿度假根据H06酒店的聚类结果,提取特征词中体现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论