1. 程式人生 > >機器學習實戰--酒店情感分析分類

機器學習實戰--酒店情感分析分類

Python爬蟲人工智慧大資料(公眾號)

在這裡插入圖片描述

資料集:

正面評價:2000_pos.txt

商務大床房,房間很大,床有2M寬,整體感覺經濟實惠不錯!
早餐太差,無論去多少人,那邊也不加食品的。酒店應該重視一下這個問題了。
賓館在小街道上,不大好找,但還好北京熱心同胞很多~
前臺 樓層服務員都不錯,房間安靜整潔,交通方便,吃的周圍也挺多.唯一不足,衛生間地漏設計不好,導致少量積水.
這次去北京,是要去北師大辦事,所以特意留意了下附近的賓館。住了兩天,首先該賓館很好找,離西四大街很近,公交車護國寺站下步行兩分鐘就到。因離公交站近,去哪坐公交都方便,很省錢省事。賓館外有很多小吃店,價位比王府井小吃街要便宜,護國寺街上報刊廳、2毛一分鐘的公用長途電話、水果攤、24小時便利店、網咖應有盡有,很方便。房間很乾淨,在這方面,在北京住過的幾個三星級的還不如這家二星級的。房間暖氣也開得足夠,缺點就是沖澡時水溫太低,而且忽冷忽熱,不知道是什麼原因。衛生間的插座不能充電,窗頭櫃下沒插座,所以只能在電視機櫃後充電,不太方便。另賓館對面的菸酒店裡的煙不能買,多是假的。賓館服務員都很熱情,讓人感覺很好。推薦一個!
3人間還是比較大的,就是暖氣不是太暖和,時冷時熱。被單會有油汙的地方,不過還可以接受。洗漱間和廁所沒有暖氣洗澡剛開始會較冷。24小時熱水、比較周到的服務、桶式飲用水還是不錯的。周圍環境還可以比較安靜,西到西直門、動物園;北到積水潭、新街口豁口;南到西單;東到後海還是比較方便的地理位置。豁口新開的新華百貨商場比較氣派,還不錯可以逛逛。推荐居住!
服務很熱情,交通也很便利,下次如果去北京我還會選擇這家酒店!
我是10月20日一家人入住的,北京五日遊,從門童,櫃檯接待,餐廳服務,衛生,都比較溫馨,熱情,禮貌,給人一種賓至如歸之感.入住,結帳都很及時,速度很快.到北京各景點交通很方便.周圍的景點步行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。我住的是靠馬路的標準間。房間內設施簡陋,並且的房間玻璃窗戶外還有一層幕牆玻璃,而且不能開啟,導致房間不能自然通風,採光不好。
出差入住的酒店,訂了個三人間.房間沒空調,冷得要死,而且被子很潮.火車站旁,步行可到.據說當地的第一名金鑰匙是這家
客觀說,不怎麼樣的酒店。我是1月11日住的,天氣特別冷,房間空調根本就不管用,我在房間待了4個小時手腳冰涼,最後沒有辦法打電話投訴,給我加了個電暖氣,效果沒變化。
酒店太舊了, 大堂感覺象三星級的, 房間也就是的好點的三星級的條件, 在青島這樣的酒店是絕對算不上四星標準, 早餐走了兩圈也沒有找到可以吃的, 太差了
由於房間裡面的水是鏽水,大堂副理免費升級到套間,由於我預定3天,講好頭2晚是478,第三晚是578。結果第三天直接告訴只能是678,經過與攜程反映也沒有效果,原因就是第三天有一批人來此開會,房間不夠,故意把住客趕走。堅決再也不住這裡了。態度十分差勁。
酒店設施老化嚴重。
感覺非常一般,房間很髒,而且上網還要收費,好象是2.5元一個小時,極度不爽。往市內走一點,很多又便宜又好的酒店,大把,以後不會再住這個名不副實的酒店,建議攜程不要將這類酒店登入,有損攜程名譽。
1,房間小
房間有異味,入住時室外低於10度,但房間的中央調只有冷風!!!!室內設施陳舊!戶外聲音較嘈雜!只能在大堂看到服務員!總體非常不好!應該只能算是準二星!
看攜程上大家的點評不錯,就訂了間陽面220的房間,慕名前往。
本人5月3日入住。設施太陳舊,一股黴味,住店還收停車費,強烈不推薦。另外,協程給出的地址有誤,是潯陽路,不是潯陽東路。
在天津是很差的酒店,定了4個單人間,結果2個沒有窗戶,2個只能看見相距很近的樓房屋頂,價格還偏高,又不含早,真是差極啦,結果定了2天一天就退房了,因為離天津\南開大學比較近才選擇,永遠不會在這裡住,充其量也就是一個準二星.
天宇也就佔了個位置還可以到光,內部設施和消耗品配備,實在是不怎麼樣,而且,很貴
這是我住過的最差的五星級酒店!8月5日住的所謂經濟間,504元/晚;房間很小,通道小的只容下一條腿。衛生間沒門,淋浴房居然也沒門,洗澡水下不去,快漫出衛生間!換了一間,還是這樣。地毯很髒!沒有服務!再不住了!白送也不住!有被大刀砍的感覺。
很懷疑五星酒店的評價標準。三星都不如,很失望!
500多的房價,定的一間經濟間,房間奇小無比,在裡面都很難轉身,淋浴裝置也很差,被子不乾淨,蓋在身上很癢,房間不通風,空氣很差,隔音效果非常差,旁邊屋做什麼都能聽見,半夜還被酒鬼亂敲門驚醒,這是我住過的最差的五星級酒店,千萬不要在那兒住,開發區很多經濟型酒店都比它好!!
這是我住過的最差的五星級酒店!8月5日住的所謂經濟間,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    客觀說,不怎麼樣的酒店。我是1月11日住的,天氣特別冷,房間空調根本就不管用,我在房間待了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   本人5月3日入住。設施太陳舊,一股黴味,住店還收停車費,強烈不推薦。另外,協程給出的地址有誤...       0
15   在天津是很差的酒店,定了4個單人間,結果2個沒有窗戶,2個只能看見相距很近的樓房屋頂,價格還...       0
16             天宇也就佔了個位置還可以到光,內部設施和消耗品配備,實在是不怎麼樣,而且,很貴       0
17   這是我住過的最差的五星級酒店!8月5日住的所謂經濟間,504元/晚;房間很小,通道小的只容下...       0
18                             很懷疑五星酒店的評價標準。三星都不如,很失望!       0
19   500多的房價,定的一間經濟間,房間奇小無比,在裡面都很難轉身,淋浴裝置也很差,被子不乾淨,...       0
20   這是我住過的最差的五星級酒店!8月5日住的所謂經濟間,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

接下來是分詞,分詞的目的是為了後面構造詞向量,將分好的每個詞都用向量來表示,就是線性代數種的數學資料型別,矩陣,因為數值型的矩陣可以被計算機計算,也就是通過計算機計算建立後期的模型

這裡我們傳入的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

最後一步,演算法

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]]