




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《自然語言處理技術》所示。表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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年下沉市場消費金融發展趨勢與應對策略分析報告
- 藥品車間現場管理制度
- 藥學信息人員管理制度
- 藥店庫房養護管理制度
- 藥店藥品調劑管理制度
- 營運內控基礎管理制度
- 設備保養檢查管理制度
- 設備備件集中管理制度
- 設備報廢更新管理制度
- 設備檢修進度管理制度
- 山東開放大學招聘筆試真題2024
- 房地產市場報告 -2025年第一季度天津寫字樓和零售物業市場概況報告
- 集資買房協議書范本
- 2025年全國中小學生安全知識網絡競賽試題及答案(共150題)
- 蘭州大學《中國經濟史》2023-2024學年第二學期期末試卷
- 【中興通訊】2025年AI RAN白皮書
- 風力發電項目居間合同
- 輸血管理委員會2024年工作總結
- 間歇性胃管插管護理
- 小學科學新教科版一年級下冊全冊教案(共13課)(2025春詳細版)
- 自發性氣胸PBL護理教學查房
評論
0/150
提交評論