python詞頻統計,生成詞雲


  本篇博客介紹2個第三方庫,中文分詞庫jieba和詞雲庫WordCloud,我們將完成三個例子:

  統計英文詞匯頻率

  統計中文文本詞匯頻率使用jieba庫

  生成詞雲

  在正式開始之前,我們先安裝兩個第三方庫:中文分詞庫jieba和詞雲庫WordCloud

  

在這里插入圖片描述

 

  統計英文詞匯頻率

  英文詞匯統計十分簡單,因為每個單詞之間都是用空格分開的的,當然也有一些特殊模號,我們將對整個文本進行噪音處理,然后將其分割成單詞,存入字典中,再給詞匯按照頻率排序,步驟如下:

  從文件流 中讀取一段全英文文本

  將文本用lower()歸一化成小寫形式

  將文本中的特殊符號:;<>"~!@#$%^&*()-+[]|{}/*.,?過濾,替換成空格for ch in ';<>"~!@#$%^&*()-+[]|{}/*.,?':replace

  將文本split,划分成單個單詞,返回一個列表

  遍歷這個列表,按照單詞=>出現次存入字典中:counts[x]=counts.get(x,0)+1

  使用items()返回一個列表,給列表排序

  格式化輸出這個列表

  代碼如下:

  #coding=gbk

  def getText(fileName):

  f=open(fileName,'r')

  txt=f.read().lower()

  for ch in ';<>"~!@#$%^&*()-+[]|{}/*.,?':

  txt=txt.replace(ch,' ')

  f.close()

  return txt

  def comp(x):

  return x[1]

  def main():

  txt=getText('English.txt')

  words=txt.split()

  counts={}

  for x in words:

  counts[x]=counts.get(x,0)+1

  items=list(counts.items())

  items.sort(key=comp,reverse=True)

  for i in range(10):

  key,value = items[i]

  print("{0:<10} {1:>5}".format(key,value))

  main()

  讀入文件:

  輸出結果:

  you 32

  to 19

  the 10

  who 10

  those 9

  have 8

  and 8

  that 6

  want 6

  make 6

  統計中文詞匯頻率

  中文語句和英文不一樣,中文詞匯之間沒有空格而是連續的字段,如何對一段文本進行分詞處理呢?我們可以安裝第三方庫jeiba,它使用中文詞庫的方式來識別詞匯:依靠中文詞庫計算出某個詞匯的概率,從而確定某段文字是不是詞匯,我們只需要在cmd中打開script目錄,輸入pip install jieba即可完成安裝,常用函數如下:

  函數  描述  舉例

  jieba.lcut(s)  精確模式,把文本精確地切分開,不存在冗余,返回一個列表類型的分詞結果  jieba.lcut('中國是一個偉大的國家')

  jieba.lcut(s,cut_all=True)  全模式,把文本中所有可能的詞匯都掃描出來,存在冗余,返回一個列表類型的分詞結果  jieba.lcut('中國是一個偉大的國家',cut_all=True)

  jieba.lcut_for_search(s)  搜索引擎模式,在精確模式的基礎上對長詞進行切分,返回一個列表類型的分詞結果  jieba.lcut_for_search('中國是一個偉大的國家')

  jieba.add_word(s)  將新詞匯添加到詞庫中  jieba.add_word(‘我愛python’)

  舉例:

  #coding=gbk

  import jieba

  def main():

  print(jieba.lcut('中國是一個十分美麗的國家'))

  print(jieba.lcut('中國是一個十分美麗的國家',cut_all=True))

  print(jieba.lcut_for_search('中國是一個十分美麗的國家'))

  main()

  '''

  ['中國', '是', '一個', '十分', '美麗', '的', '國家']

  ['中國', '國是', '一個', '一個十', '十分', '美麗', '的', '國家']

  ['中國', '是', '一個', '十分', '美麗', '的', '國家']

  '''

  說完jieba庫,我們要開始統計詞頻了,如何統計?步驟和統計英文相似,不過有了jieba的加持,這變得更為簡單:

  從文件流 中讀取一段全中文文本

  直接使用jieba.lcut(txt)將文本切分,返回一個列表

  當然這個列表中包含了字符,我們可以直接在遍歷過程中不統計len=1的字符

  遍歷這個列表,按照單詞=>出現次存入字典中:counts[x]=counts.get(x,0)+1

  使用items()返回一個列表,給列表排序

  格式化輸出這個列表

  代碼如下:

  #coding=utf-8

  import jieba

  def getText(fileName):

  f=open(fileName,'r',encoding='utf-8')

  txt=f.read()

  f.close()

  return txt

  def comp(x):

  return x[1]

  def main():

  txt=getText('Chinese.txt')

  words=jieba.lcut(txt)

  counts={}

  for x in words:

  if len(x)==1:

  continue

  else:

  counts[x]=counts.get(x,0)+1

  items=list(counts.items())

  items.sort(key=comp,reverse=True)

  for i in range(10):

  key,value = items[i]

  print("{0:<10} {1:>5}".format(key,value))

  main()

  文本讀入

  統計結果:

  '''

  可以 9

  藏不住 4

  如果 3

  一天 3

  我們 3

  一個 3

  男人 3

  每個 3

  那里 3

  不怪 3

  '''

  生成詞雲

  生成詞雲我們是用的是wordcloud庫,這個庫可以將給定的一段文本按照空格鏡像區分,按照頻率顯示在一張圖片上,頻率越高,字體越大,函數以及參數如下:

  生成詞雲對象:wordcloud.WordCloud([width][,height][,min_font_size],[,max_font_size][,font_path][,max_words][,stop_words][,mask])

  參數屬性:鄭州婦科哪家好 http://www.zzkdfk.com/

  函數  描述  舉例

  width  詞雲對象的寬度,默認400  w=wordcloud.WorldCloud(width=800)

  height  詞雲對象的高度,默認600  w=wordcloud.WorldCloud(height=800)

  min_font_size  指定詞雲中字體的最小號,默認為4號  w=wordcloud.WorldCloud(min_font_size=10)

  max_font_size  指定詞雲字體的最大號,默認根據高度自動調節  w=wordcloud.WorldCloud(max_font_size=20)

  font_step  指定詞雲中字體字號的步進間隔,默認為1  w=wordcloud.WorldCloud(font_step=2)

  font_path  指定字體文件的路徑,默認為None  w=wordcloud.WorldCloud(font_path='msyh.ttc')

  max_words  指定詞雲中的最大顯示單詞數量,默認200  w=wordcloud.WorldCloud(max_words=100)

  stop_words  指定詞雲中的排除詞列表,列表中的詞匯將不會出現在詞雲中  w=wordcloud.WorldCloud(stop_words={"python"})

  mask  指定詞雲形狀,默認為長方形,需要引用imread()函數     >>> from scipy.misc import imread

  >>> mk=imread('pic.png')

  >>>w=wordcloud.WordCloud(mask=mk)

  background_color  指定詞雲圖片的背景顏色,默認為黑色  w=wordcloud.WorldCloud(background_color='white')

  將文本加載到詞雲對象:w.generate(txt)

  將詞雲對象導出成文件: w.to_file(fileName)

  wordcloud根據空格來區分單詞,並且會自動過濾符號

  代碼如下:(根據QQ消息記錄,過濾掉頭銜和@后生成詞雲)

  #coding=gbk

  #coding=utf-8

  import wordcloud

  import jieba

  def getText(fileName):

  f=open(fileName,'r',encoding='gbk')

  txt=''

  for line in f:

  if ('【' in line) or ('】' in line) or ('@' in line):continue

  else:txt+=line

  f.close()

  txt=' '.join(jieba.lcut(txt))

  return txt

  def main():

  txt=getText('test.txt')

  w=wordcloud.WordCloud(font_path='msyh.ttc',width=800,height=600,max_words=40,font_step=3)

  w.generate(txt)

  w.to_file('wordcloud3.png')

  print('make wordCloud successfully!')

  main()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM