使用Python分析文本數(shù)據(jù)的詞頻并詞云圖可視化
一、Python分析文本數(shù)據(jù)的優(yōu)點
廣泛的庫和工具支持:Python擁有豐富的文本分析庫,如NLTK(自然語言工具包)、spaCy、TextBlob、Gensim等,這些庫提供了各種文本處理和分析功能,使得文本分析任務更容易實現(xiàn)。
易于學習和使用:Python是一門容易學習的編程語言,因此即使是初學者也可以快速上手文本分析任務。Python的簡潔語法和清晰的代碼結構有助于更好地理解和維護分析代碼。
社區(qū)支持:Python擁有龐大的開發(fā)者社區(qū),這意味著可以輕松找到答案、解決問題,并獲得有關文本分析的支持和建議。
跨平臺性:Python是一種跨平臺的編程語言,可以在Windows、Linux和Mac等操作系統(tǒng)上運行,因此非常適合各種不同環(huán)境中的文本分析。
數(shù)據(jù)處理能力:Python擁有強大的數(shù)據(jù)處理和操作庫,如NumPy和Pandas,這些庫使得數(shù)據(jù)清洗、轉換和分析變得更加容易。
可視化能力:Python中的庫,如Matplotlib、Seaborn和Plotly,可以用于生成各種數(shù)據(jù)可視化,幫助用戶更好地理解和展示文本數(shù)據(jù)的分析結果。
機器學習和深度學習支持:Python在機器學習和深度學習方面表現(xiàn)出色,因此可以使用各種機器學習和深度學習模型來進行文本分類、情感分析、命名實體識別等任務。
開源和免費:Python是一種開源的編程語言,可以免費使用,這意味著無需額外費用就可以進行文本分析。
豐富的文檔和教程:有大量的在線文檔、教程和示例代碼可用于幫助用戶學習和實踐文本分析。
二、Python分析文本常用的第三方庫
NLTK(Natural Language Toolkit):NLTK是一款廣泛用于自然語言處理的庫,提供了文本分詞、詞性標注、命名實體識別、語法分析等功能,以及大量的語料庫和數(shù)據(jù)集。
spaCy:spaCy是一個高度優(yōu)化的自然語言處理庫,具有出色的性能和功能,支持分詞、命名實體識別、詞性標注等任務,并支持多語言。
TextBlob:TextBlob是一個簡單而易于使用的庫,用于執(zhí)行各種文本分析任務,包括情感分析、文本分類、詞性標注等。
Gensim:Gensim是一個用于主題建模和文本向量化的庫,特別適用于處理大型文本語料庫和文本文檔集合。
Scikit-learn:雖然Scikit-learn主要用于機器學習,但它也提供了文本特征提取、文本分類和聚類等文本分析的工具和算法。
Word2Vec:Word2Vec是一個用于詞嵌入(word embedding)的庫,可以將詞匯轉換為向量表示,以便進行文本分析和自然語言處理任務。
Pattern:Pattern是一個用于文本挖掘和自然語言處理的庫,支持詞性標注、情感分析、信息提取等任務。
Spacy-transformers:這是spaCy的一個擴展庫,使其能夠使用預訓練的Transformer模型(如BERT、GPT-2)進行文本分析。
TfidfVectorizer:TfidfVectorizer是Scikit-learn的一部分,用于將文本數(shù)據(jù)轉換為TF-IDF(Term Frequency-Inverse Document Frequency)特征表示,常用于文本分類和信息檢索。
NLTK和TextBlob的情感分析模塊:這些庫提供了用于情感分析的功能,可用于判斷文本的情感傾向,如積極、消極或中性。
Matplotlib、Seaborn和Plotly:這些庫用于可視化文本數(shù)據(jù)分析結果,可以生成各種圖表和圖形,幫助更好地理解文本數(shù)據(jù)。
三、詞頻分析
上次批量提取了上市公司主要業(yè)務信息,要分析這些文本數(shù)據(jù),就需要做文本詞頻分析。由于中文不同于英文,詞是由一個一個漢字組成的,而英文的詞與詞之間本身就有空格,所以中文的分詞需要單獨的庫才能夠?qū)崿F(xiàn),常用的是`jieba`。若沒安裝,直接運行`cmd`,然后輸入`pip install jieba`安裝即可。然后導入`jieba`庫。我們以“華特氣體”公司的主要業(yè)務進行分詞,分詞前如下圖所示。通過`open`打開華特氣體文本文件,使用讀模式`r`,為避免編碼錯誤,指定編碼類型為`utf-8`。讀取出來是一個大字符串,將這個大字符串存入`txt`。然后調(diào)用`jieba`進行分詞。`lcut`的意思是切分詞后再轉換成列表("l"即表示`list`的首字母)。將切分后的詞存入列表`words`。
import jieba txt = open("華特氣體.txt", "r", encoding="utf-8").read() words = jieba.lcut(txt) words
結果如上,可見基本是按照我們的漢字使用習慣來區(qū)分詞的,不能組成詞的字則是按單獨一個字符串存放的。然后我們就需要將詞和對應出現(xiàn)的次數(shù)統(tǒng)計出來。先新建一個字典`wordsDict`用于儲存詞及其出現(xiàn)的次數(shù)。對于單個的字或字符不是我們想要的,所以加了一個`if`語句將其排除在外。`continue`的作用是,`if`后面的條件滿足時,讓程序回到`for`循環(huán),而不執(zhí)行`continue`下面的語句。也就是列表中的元素只有一個字符的時候,就馬上跳到下一個而不執(zhí)行任何操作。只有當元素不止一個字符的時候,才執(zhí)行`else`語句,即將詞及其出現(xiàn)的次數(shù)加入字典。此處用`setdefault`給詞的出現(xiàn)初始值設置為0,每重復出現(xiàn)一次,自動加1。然后我們根據(jù)此出現(xiàn)的次數(shù),降序排序,并查看前20個詞的情況。
wordsDict = {} #新建字典用于儲存詞及詞頻 for word in words: if len(word) == 1: #單個的字符不作為詞放入字典 continue else: wordsDict.setdefault(word, 0) #設置詞的初始出現(xiàn)次數(shù)為0 wordsDict[word] +=1 #對于重復出現(xiàn)的詞,每出現(xiàn)一次,次數(shù)增加1 wordsDict_seq = sorted(wordsDict.items(),key=lambda x:x[1], reverse=True) #按字典的值降序排序 wordsDict_seq[:15]
可以看到,有些詞并不是我們想要的,比如“公司”、“行業(yè)”、“000”。因此需要把這些意義不大的詞刪除。先定義一個儲存要排除的詞的列表`stopWords`,將想排除的詞放進去,一般是放出現(xiàn)次數(shù)較多,但意義不大的詞,可根據(jù)實際需要調(diào)整。然后遍歷這個字典,在檢查這些詞是否在目標字典`wordsDict`中,如果在,就將字典中這個詞對應的數(shù)據(jù)刪除。
stopWords = ["公司","行業(yè)","000","用于","情況","方面","一種","要求","對于","進行","一般","212","實現(xiàn)","處理","通過","投入","隨著"] for word in stopWords: if word in wordsDict: del wordsDict[word] #刪除對應的詞 wordsDict_seq = sorted(wordsDict.items(),key=lambda x:x[1], reverse=True) #按字典的值降序排序 wordsDict_seq[:15]
然后將篩選后的數(shù)據(jù)轉換成DataFrame,并增加列名“詞”和“次數(shù)”,然后導出為Excel文件。
df = pd.DataFrame(wordsDict_seq,columns=['詞','次數(shù)']) df.to_excel("華特氣體-詞頻.xlsx",index = False) #存為Excel時去掉index索引列 df.head(10)
以上,搞定了一個文件的詞頻收集,那批量操作呢?請看下面分解。
import os path='主要業(yè)務' #文件所在文件夾 files = [path+"\\"+i for i in os.listdir(path)] #獲取文件夾下的文件名,并拼接完整路徑 files
以上,先獲取到所有待分析文件的路徑。然后逐個進行分析。稍微修改一下上面的程序,很快分析完成。結果如下。
import jieba import pandas as pd for file in files: txt = open(file, "r", encoding="utf-8").read() words = jieba.lcut(txt) wordsDict = {} #新建字典用于儲存詞及詞頻 for word in words: if len(word) == 1: #單個的字符不作為詞放入字典 continue else: wordsDict.setdefault(word, 0) #設置詞的初始出現(xiàn)次數(shù)為0 wordsDict[word] +=1 #對于重復出現(xiàn)的詞,每出現(xiàn)一次,次數(shù)增加1 stopWords = ["2019","不斷","持續(xù)","主要","企業(yè)","產(chǎn)品","業(yè)務","公司","行業(yè)","000","用于","情況","方面","一種","要求","對于","進行","一般","212","實現(xiàn)","處理","通過","投入","隨著"] for word in stopWords: if word in wordsDict: del wordsDict[word] #刪除對應的詞 wordsDict_seq = sorted(wordsDict.items(),key=lambda x:x[1], reverse=True) #按字典的值降序排序 df = pd.DataFrame(wordsDict_seq,columns=['詞','次數(shù)']) df.to_excel("詞頻//{}.xlsx".format(file.split("\\")[1][:-4]),index = False) #存為Excel時去掉index索引列
四、詞云圖分析
如果要將上面做好的詞頻分析可視化,“詞云圖”是一個很好的選擇。它的原理是,將詞頻高的詞顯示得相對更大一些。而且可以自定義背景圖,讓詞云顯示成個性化的形狀。今天我們就來將上次獲取的10家上市公司的“主要業(yè)務”詞頻文件批量生成詞云圖,這樣一看詞云圖就大致了解這家公司的主要業(yè)務是什么了,放在PPT里展示也顯得高大上。首先,我們導入需要用到庫。若顯示導入不成功,則需要用`pip install + 庫名`進行安裝。
import numpy as np # numpy數(shù)據(jù)處理庫 import wordcloud # 詞云庫 from PIL import Image # 圖像處理庫,用于讀取背景圖片 import matplotlib.pyplot as plt # 圖像展示庫,以便在notebook中顯示圖片 from openpyxl import load_workbook #讀取詞頻Excel文件 import os #獲取詞頻Excel文件路徑
然后獲取所有的Excel詞頻表路徑,以便后續(xù)逐一讀取,并傳入詞云庫生成詞云圖。再定義詞頻背景圖,`np.array(Image.open())`打開圖片后轉為數(shù)組,存入`maskImage`變量。需要注意詞頻背景圖中想要的形狀的背景需要是白色的,不然無法得到想要的詞云圖形狀。比如如下背景圖片,左邊的圖片因為猴子的背景不是白色,做出的詞云圖會占滿整個圖片,即是一個矩形的詞云圖;右邊的圖片中,猴子的背景是白色的,做出的詞云圖看起來就是一只猴子的形狀。
然后用`for`循環(huán)遍歷所有待處理的Excel文件,逐個打開,提取其中的詞和詞頻,存入字典`wordFreq`。然后通過`wordcloud.WordCloud()`定義詞云樣式。這個函數(shù)有很多參數(shù),具體如下。我們只需要關注常用的幾個即可,其它可作為了解。
wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None, background_color='black', max_font_size=None, font_step=1, mode='RGB', relative_scaling='auto', regexp=None, collocations=True, colormap=None, normalize_plurals=True, contour_width=0, contour_color='black', repeat=False, 'include_numbers=False', 'min_word_length=0', 'collocation_threshold=30')
`font_path`:字體路徑。字體存在`C:\Windows\Fonts`目錄,在想要的字體上點右鍵,選擇“屬性”可查看其名稱,然后連同路徑復制,賦給font_path即可。比如本例使用的黑體。需要注意的是,若是中文詞云,需要選中文字體。
`width,height`:畫布的寬度和高度,單位為像素。若沒設置`mask`值,才會使用此默認值400*200。 `margin`:詞間距。 `ranks_only`:文檔未說明。 `prefer_horizontal`:詞語橫排顯示的概率(默認為90%,則豎排顯示概率為10%) `mask`:用于設定繪制模板,需要是一個`nd-array`(多維數(shù)組),所以在用`Image.open()`讀取圖片后,需要用`np.array`轉換成數(shù)組。另外`mask`參數(shù)有設定的話,畫布的大小會由詞頻背景圖的大小決定。這個經(jīng)常使用,因為我們更傾向于自定義模板。 `scale`:比例尺,用于放大畫布的尺寸。一般使用默認值。 `color_func`:顏色函數(shù),一般不用。 `max_words`:詞云圖中最多顯示詞的字數(shù),設定一個值,可讓那些出現(xiàn)次數(shù)極少的詞不顯示出來。 `min_font_size`:字號最小值。 `stopwords`:設置不想顯示的詞。 `random_state`:文檔未說明。 `background_color`:詞云圖背景色,默認為黑色。可根據(jù)需要調(diào)整。 `max_font_size`:字號最大值。 `font_step`:字體的步長,一般使用默認。大于1的時候可提升運算速度,但匹配較差。 `mode`:當設置為"RGBA" 且`background_color`設置為"None"時可產(chǎn)生透明背景。 `relative_scaling`:詞頻對字體大小的影響度,一般使用默認。 `regexp`:正則表達式分割輸入的字符。一般是先處理好才給到wordcloud,所以基本不用。 `collocations`:是否包含兩個詞的搭配,若使用了`generate_from_frequencies`方法則忽略此參數(shù)。一般不用。 `colormap`:每個詞對應的顏色,若設置了`color_func`則忽略此參數(shù)。 `normalize_plurals`:是否移除英文復數(shù)單詞末尾的s ,比如可將word和words視同為一個詞,并將詞頻算到word頭上。如果使用了`generate_from_frequencies`方法則忽略此參數(shù)。 `contour_width`:如果`mask`有設置,且`contour_width`>0,將會繪制`mask`輪廓。 `contour_color`:`mask`輪廓的顏色,默認為黑色。 `repeat`:當詞不足以滿足設定的`max_words`時,是否重復詞或短語以使詞云圖上的詞數(shù)量達到`max_words` `include_numbers`:是否將數(shù)字作為詞。 `min_word_length`:設置一個詞包含的最少字母數(shù)量。 `collocation_threshold`:界定英文中的`bigrams`,對于中文不適用。
此例中,我們調(diào)用`wordcloud`時,設定了字體為“黑體”,使用了背景圖為繪圖模板,設置了最多顯示詞數(shù)為500,字號最大為100。然后使用`generate_from_frequencies()`從已有詞頻數(shù)據(jù)的字典中生成詞云圖。然后將詞云圖按公司名保存到指定路徑(“詞云圖”文件夾)。最后用`plt.imshow()`在notebook中顯示詞云圖。結果如下。
#將存好的Excel詞頻表讀取成字典 path='詞頻' #文件所在文件夾 files = [path+"\\"+i for i in os.listdir(path)] #獲取文件夾下的文件名,并拼接完整路徑 maskImage = np.array(Image.open('background.png')) # 定義詞頻背景圖 for file in files: #將詞頻Excel文件讀取為字典 wb = load_workbook(file) ws = wb.active wordFreq = {} for i in range(2,ws.max_row+1): word = ws["A"+str(i)].value freq = ws["B"+str(i)].value wordFreq[word] = freq #定義詞云樣式 wc = wordcloud.WordCloud( font_path='C:/Windows/Fonts/simhei.ttf', # 設置字體 mask= maskImage, # 設置背景圖 max_words=500, # 最多顯示詞數(shù) max_font_size=100) # 字號最大值 #生成詞云圖 wc.generate_from_frequencies(wordFreq) # 從字典生成詞云 #保存圖片到指定文件夾 wc.to_file("詞云圖\\{}.png".format(file.split("\\")[1][:4])) #在notebook中顯示詞云圖 plt.imshow(wc) # 顯示詞云 plt.axis('off') # 關閉坐標軸 plt.show() # 顯示圖像
以上就是使用Python分析文本數(shù)據(jù)的詞頻并詞云圖可視化的詳細內(nèi)容,更多關于Python分析文本數(shù)據(jù)的資料請關注腳本之家其它相關文章!
相關文章
pytorch建立mobilenetV3-ssd網(wǎng)絡并進行訓練與預測方式
這篇文章主要介紹了pytorch建立mobilenetV3-ssd網(wǎng)絡并進行訓練與預測方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02使用AJAX和Django獲取數(shù)據(jù)的方法實例
這篇文章主要給大家介紹了關于使用AJAX和Django獲取數(shù)據(jù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10基于Django的樂觀鎖與悲觀鎖解決訂單并發(fā)問題詳解
這篇文章主要介紹了基于Django的樂觀鎖與悲觀鎖解決訂單并發(fā)問題詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07解決Python pandas df 寫入excel 出現(xiàn)的問題
今天小編就為大家分享一篇解決Python pandas df 寫入excel 出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07讓Django支持Sql Server作后端數(shù)據(jù)庫的方法
今天小編就為大家分享一篇讓Django支持Sql Server作后端數(shù)據(jù)庫的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05