人工智能情感分析源碼,垃圾短信郵箱分析

分享一個機器學習文本分類項目的案例,該分類項目是一個通用的文本分類項目,這裏的數據集我酒店用戶評價數據,分類模型爲二分類,正面評價和負面評價,這裏所說的通用,就是你能夠根據你本身的數據,進行train_data的構造,好比你能夠換成垃圾短信數據,經過本文方法進行分類,也能夠適用於你遇到的其餘文本分類場景進程嘗試。算法

1、數據集:api

正面評價: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元。
View Code

負面評價:2000_neg_txtapp

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元/晚;房間很小,通道小的只容下一條腿。衛生間沒門,淋浴房竟然也沒門,洗澡水下不去,快漫出衛生間!換了一間,仍是這樣。地毯很髒!沒有服務!再不住了!白送也不住!有被大刀砍的感受。
很懷疑五星酒店的評價標準。三星都不如,很失望!
View Code

2、讀取數據構造DataFramedom

咱們再讀取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和1ide

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

3、分詞函數

分詞的目的是爲了後面構造詞向量,將分好的每一個詞都用向量來表示,就是線性代數中的矩陣,由於數值型的矩陣能夠被計算機計算(計算機底層根據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

4、去除停用詞

上面分詞好後的數據,咱們看到有一些詞,好比太,是,的,並且,標點符號,我等這些詞,這些詞屬於沒有多少實際意義的詞,並不能反映該評價的一些特性,並且構形成向量,維度會比較多,有冗餘,因此咱們須要去掉,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   [在, 天津, 很, 差, 酒店, 定, , 單人間, 結果, , 沒有, 窗戶, ,...       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

下面是移除停用詞後的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   [在, 天津, 很, 差, 酒店, 定, , 單人間, 結果, , 沒有, 窗戶, ,...       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   在 天津 很 差 酒店 定  單人間 結果  沒有 窗戶  只能 看見 相距 很近 樓...       0
16            天宇 佔 位置 能夠 光 內部 設施 消耗品 配備 實在 不怎麼樣 並且 很 貴       0

6、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加載便可,這個細節知識本身去作

源碼獲取方式,關注公總號RaoRao1994,查看往期精彩-全部文章,或者回復"20190520情感分析",便可獲取資源下載連接

更多資源獲取,請關注公總號RaoRao1994

相關文章
相關標籤/搜索