大數據文本挖掘告訴你,iPhone8的公關做的有多牛
這個世界上最不靠譜的兩件事:
一個是主觀臆斷;一個是一廂情願。
文:朱元祿(@數據分析-jacky)
iPhone8,iPhoneX,來了。
大家猜猜看,網路輿論會對新品iPhone作何報道?
會很貴吧,真的難看吧,跟上一代沒區別吧,裝X神器… …我們想到的是不是這些?上述都只是我們「吃瓜群眾」的主觀臆斷,和一廂情願。
本文,jacky將利用文本挖掘技術,在iPhone8發布後,試圖還原一個真實的輿論環境,告訴大家蘋果公司的網路公關做的多牛。
第一篇章:結果呈現
jacky抓取了主流網站上百篇iphone8發布的新聞報道和評論信息,並創建語料庫,對語料庫的文本進行挖掘,通過詞頻排序生成如下詞雲圖:
從上述解析如下:
蘋果、iPhone:品牌永遠是蘋果最大的王牌;
壟斷、銷量:市場表現的真實寫照;
小米、vivo、華為、三星:大量文本信息告訴我們,蘋果的競爭對手也就這四家;
創新、技術:主流網站對技術的肯定大於否定;
股價、美元、季度:投資人關心的,才是媒體測重的;
我們發現:裝X、賣腎這些我們看似熱門的詞,並沒有大量的出現在網路中。這些詞反而是一些標題黨的熱門詞語,成為了我們茶餘飯後的談資。
第二篇章:技術詳解—Python文本挖掘
下面,跟jacky一起,深入淺出學習文本挖掘,揭秘我如何實現上述分析和挖掘的
文本挖掘技術
定義
- 從大量文本數據中,抽取出有價值的知識,並且利用這些知識更好的組織信息的過程。
目的
- 把文本信息轉化為人們可利用的知識。
(一)語料庫(Corpus)
在python中,如何根據以往的文檔文件搭建一個語料庫?
1.什麼是語料庫
語料庫是我們要分析的所有文檔的集合。
在日常工作中我們對文章的管理,先是一篇篇的文章不斷的積累,我們存了大量的文章之後,會對文章信息進行一些歸類的工作,一般體現於建立不同的文件夾來保存不同類別的文章。
同樣的,我們把我們需要分析的文本文件,讀取內存變數中,然後在內存變數中使用不同的數據結構,對這些文本文件進行存儲,以便進行下一步的分析。
這個內存變數就是語料庫
2.語料庫構建實操
jacky抓取了iphone8發布後,主流新聞網站報導和評論的語料數據。
我存放iphone 語義文件夾的路是:
file:///Users/apple/Downloads/Iphone8如果是windows系統要替換成相應的路徑。1) 如何把語料數據作為語料庫導入到內存中
# -*- coding:utf-8 -*-import osimport os.pathimport codecsfilePaths=[]fileContents=[]for root,dirs,files in os.walk(Users/apple/Documents/Iphone8): for name in files: filePath=os.path.join(root,name) filePaths.append(filePath) f=codecs.open(filePath,r,utf-8) fileContent=f.read() f.close() fileContents.append(fileContent)import pandascorpos=pandas.DataFrame({ filePath:filePaths, fileContent:fileContents})
上述代碼註解:
把一個文件夾中,包括嵌套文件夾的全路徑,讀入到一個內存變數中,我們定義為filePaths數組變數,接著使用os中walk方法,傳入這個目錄作為參數,就可以遍歷該文件中的所有文件了
for root,dirs,files in os.walk中root為文件目錄,dirs為root目錄下的所有子目錄,root目錄下的所有文件,我們命名為files,然後進行遍歷。為了拿到root目錄下的所有文件,我們再次便利所有的文件(代碼:for name in files:)把它追加到filePaths變數中去即可。os.path.join是拼接文件路徑的方法,因為文件路徑在windows,mac,linux中的寫法是不同的,使用這個方法可以解決在不同系統中使用文件路徑要使用不同方法的問題。最後組建數據框pandas.DataFrame
(二)中文分詞(Chinese Word Segmentation)
1.中文分詞
英文中單詞是以空格作為自然分界符,而中文只是字句和段,能夠通過明顯的分界符簡單化簡,唯獨詞沒有一個明顯的分界符
- 將一個漢字序列切分成一個一個單獨的詞
- 我是數據分析部落的發起人 —→ 我/是/數據/分析/部落/的/發起人(@數據分析-jacky)
2.停用詞(Stop Words)
對文章進行分詞後,會產生大量的分詞,這些分詞中並不是每個詞都有用的,在我們進行數據處理時,要過濾掉某些字或詞
- 泛濫的詞:如web,網站等;
- 語氣助詞、副詞、介詞、連接詞等:如的、地、得
3.分詞模塊-jieba分詞包
分詞包有很多,jieba分詞包是效率高,最簡單的分詞包
1)jieba基本使用方法-cut方法
import jiebafor w in jieba.cut(我是數據分析-jacky): print(w)
下面是「分詞屆」最奇葩,也是最津津樂道的分詞難題:
工信處女幹事
每月經過下屬科室都要親口交代24口交換機等技術性器件的安裝工作
import jiebafor w in jieba.cut(工信處女幹事 每月經過下屬科室都要親口交代 24口交換機等技術性器件的安裝工作): print(w)
jieba在沒有使用自定義分詞的情況下,只使用默認詞庫,效果還是非常好的。
2)導入詞庫
雖然jieba包已經有默認詞庫,一般場景使用不會出現什麼問題,但是我們要是把分詞的功能用於專業的場景,會出現什麼狀況呢?
import jiebajieba.add_word(天馬流星拳)jieba.add_word(廬山升龍霸)jieba.add_word(牛逼)seg_list = jieba.cut(天馬流星拳和廬山升龍霸哪個更牛逼呢?)for w in seg_list: print(w)
- 我們增加了自定義分詞,明顯增加了分詞效果
- 但是我們要處理的分詞很多,使用一個個導入的方法就顯得非常不高效了,我們可以使用load_userdict方法一次導入用戶自定義詞庫中
jieba.load_userdict(路徑/聖鬥士招數.txt)
掌握了對單個字元串進行分詞後,我們就可以對大量的文字進行分詞了,用load_userdict一次性導入自定義詞庫中。
3) 與語料庫結合的實操
# -*- coding:utf-8 -*-#搭建預料庫import osimport os.pathimport codecsfilePaths=[]fileContents=[]for root,dirs,files in os.walk(Iphone8): for name in files: filePath=os.path.join(root,name) filePaths.append(filePath) f=codecs.open(filePath,r,GB2312) fileContent=f.read() f.close() fileContents.append(fileContent)import pandascorpos=pandas.DataFrame({ filePath:filePaths, fileContent:fileContents})#每個分詞後面都要跟著一個信息,那就是這個分詞來源是哪篇文章#因此,我們的結果除了分詞,還需要指明分詞的出處,以便進行後續的分析import jiebasegments=[]filePaths=[]#接下來,遍歷所有文章,使用數據框的方法,我們獲取到語料庫的每行數據,這樣遍歷得到的行是一個字典,#列名index作為key,於是我們可以通過列名,使用字典的值的獲取方法,獲取到文件路徑filePath,和文件內容fileContentfor index,row in corpos.iterrows(): filePath=row[filePath] fileContent=row[fileContent] #接著調用cut方法,對文件內容進行分詞segs=jieba.cut(fileContent) #接著遍歷每個分詞,和分詞對應的文件路徑一起,把它加到兩列中 for seg in segs: segments.append(seg) filePaths.append(filePath)#最後我們把得到的結果存在一個數據框中segmentDataFrame=pandas.DataFrame({ segment:segments, filePath:filePaths})print(segmentDataFrame)
(三)文本挖掘的入口-詞頻統計
1.詞頻
- 某個詞在該文檔中出現的次數
- 用詞頻這個指標來做應用的時候,並不會給定特定的詞,而是計算機先對文章進行分詞,然後對所得到的所有分詞進行詞頻統計,然後看看哪些詞在文章中經常出現。
2.如何使用Python進行詞頻統計
接著說上面Iphone8發布會語料庫的案例,我們已經把語料庫搭建好,對語料庫進行了分詞,上面的案例我們得到了一列為分詞(segment),一列為分詞所屬文件(filePath)的數據框,接下來我們進行詞頻統計就非常簡單了
我們使用分組統計函數,直接在分詞變數數據框後調用groupby方法,使用分詞欄位進行分組,然後聚合函數使用numpy.size函數,也就是對分組欄位做一個計數,最後重新設定索引[『segment』],在根據計算進行倒序排列,得到的結果就是我們詞頻統計的結果了
import numpy#進行詞頻統計segStat=segmentDataFrame.groupby( by=segment)[segment].agg({計數:numpy.size}).reset_index().sort( columns=[計數],ascending=False)
- 這裡要特別注意的是:降序計數調用的方法sort函數,需要新版本的pandas庫,懶得升新版本不降序也不影響後續的處理,這裡小夥伴們可以自己處理。
接下來就是過濾停用詞:
#首先判斷分詞列裡面是否包含這些停用詞stopwords=pandas.read_csv("路徑.txt",encoding=utf-8,index_col=False)#用isin方法,包含停用詞就過濾詞,用~符號取反fSegStat=segStat[~segStat.segment.isin(stopwords.stopword)]
(四)生詞詞雲
#導入WordCloud和matplotlib包from wordcloudimport WordCloudimport matplotlib.pyplot as plt#生成一個matplot對象,傳入一個字體位置的路徑和背景顏色即可wordcloud=WordCloud( font_path=字體路徑simhei.ttf, background_color=black)#WordCloud方法接受一個字典結構的輸入,#我們前面整理出來的詞頻統計結果是數據框的形式,因此需要轉換,#轉換的方法,首先把分詞設置為數據框的索引,然後在調用一個to_dict()的方法,就可以轉換為字典的機構words=fSegStat.set_index(segment).to_dict()#接著調用fit_words方法來調用我們的詞頻wordcloud.fit_words(words[計數])#繪圖plt.imshow(wordcloud)plt.close()
(五)完整案例代碼展示
# -*- coding:utf-8 -*-import osimport os.pathimport codecsfilePaths=[]fileContents=[]for root,dirs,files in os.walk(Users/apple/Documents/Iphone8): for name in files: filePath=os.path.join(root,name) filePaths.append(filePath) f=codecs.open(filePath,r,utf-8) fileContent=f.read() f.close() fileContents.append(fileContent)import pandascorpos=pandas.DataFrame({ filePath:filePaths, fileContent:fileContents})import jiebasegments=[]filePaths=[]for index,row in corpos.iterrows(): filePath=row[filePath] fileContent=row[fileContent] segs=jieba.cut(fileContent) for seg in segs: segments.append(seg) filePaths.append(filePath)segmentDataFrame=pandas.DataFrame({ segment:segments, filePath:filePaths})import numpysegStat=segmentDataFrame.groupby( by=segment)[segment].agg({計數:numpy.size}).reset_index().sort( columns=[計數], ascending=False)stopwords=pandas.read_csv("路徑.txt",encoding=utf-8,index_col=False)fSegStat=segStat[~segStat.segment.isin(stopwords.stopword)]from wordcloud import WordCloudimport matplotlib.pyplot as pltwordcloud=WordCloud( font_path=字體路徑simhei.ttf, background_color=black)words=fSegStat.set_index(segment).to_dict()wordcloud.fit_words(words[計數])plt.imshow(wordcloud)plt.close()
最後,我們來看看效果吧:
對本文感興趣的朋友,請關注數據分析部落公眾號(shujudata),我在那裡等你!
推薦閱讀:
※【譯文】100000個故事的情節分析:一個簡單案例
※基於半監督學習技術的達觀文本過濾系統
※基於R語言的唐僧「師徒關係」分析(詞向量分析)
※文本情感分析有什麼好資料、網站、工具推薦呢?
※【譯文】100000個故事中的性別與動詞分析: 一個簡單案例