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