python 實現中文分詞統計

老是看到別人用Python搞各類統計,前端菜鳥的我也來嘗試了一把。有各類語義分析庫在,一切好像並非很複雜。不過Python剛開始看,估計代碼有點醜。前端

1、兩種中文分詞開發包

thulac (http://thulac.thunlp.org/)

THULAC(THU Lexical Analyzer for Chinese)由清華大學天然語言處理與社會人文計算實驗室研製推出的一套中文詞法分析工具包,具備中文分詞和詞性標註功能。THULAC具備以下幾個特色:node

  • 能力強。利用咱們集成的目前世界上規模最大的人工分詞和詞性標註中文語料庫(約含5800萬字)訓練而成,模型標註能力強大。
  • 準確率高。該工具包在標準數據集Chinese Treebank(CTB5)上分詞的F1值可達97.3%,詞性標註的F1值可達到92.9%,與該數據集上最好方法效果至關。
  • 速度較快。同時進行分詞和詞性標註速度爲300KB/s,每秒可處理約15萬字。只進行分詞速度可達到1.3MB/s。

jieba (https://github.com/fxsjy/jieba

聽說是最好的中文分詞組件,支持Python、C++、Java、node.js、PHP等多種語言。python

  • 支持三種分詞模式()git

    • 精確模式,試圖將句子最精確地切開,適合文本分析;
    • 全模式,把句子中全部的能夠成詞的詞語都掃描出來, 速度很是快,可是不能解決歧義;
    • 搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提升召回率,適合用於搜索引擎分詞。
  • 支持繁體分詞
  • 支持自定義詞典
  • MIT 受權協議

2、語義分詞

2.1 簡單文本分詞

兩種分詞組件的使用都比較簡單,以 jieba 爲例:github

# -*- coding: utf-8 -*-
import jieba
# 精確模式
seg_list = jieba.cut("我來到北京清華大學", cut_all=False)
print "Default Mode: " + "/ ".join(seg_list)
#輸出結果:
#Default Mode: 我/ 來到/ 北京/ 清華大學

2.2 對文件內容進行分詞

對文件內容進行分詞其實本質上和對字符串的分詞同樣,只不過多了個文件讀寫的過程。
這裏寫了兩個讀寫文件的函數,之因此使用codecs來讀取,主要是爲了解決Python2.7 文件讀寫過程當中Unicode編碼問題數組

# -*- coding: utf-8 -*-
import codecs
# @see 讀取文件內容
def readFile(filename):
  content = ""
  try:
    fo = codecs.open(filename,'r', "utf-8")
    print "讀取文件名:", filename
    for line in fo.readlines():
      content += line.strip()
    print "字數:", len(content)
  except IOError as e:
    print "文件不存在或者文件讀取失敗"
    return ""
  else:
    fo.close()
    return content
    
# @see 寫入文件內容(數組會使用writelines進行寫入)codec.open實現
# @param toFile 文件名
#        content 內容
def writeFile(toFile, content):
  try:
    fo = codecs.open(toFile, 'wb', "utf-8")
    print "文件名:", toFile
    if type(content) == type([]):
      fo.writelines(content)
    else:
      fo.write(content)
  except IOError:
    print "沒有找到文件或文件讀取失敗"
  else:
    print "文件寫入成功"
    fo.close()

將文件讀寫和分詞結合起來瀏覽器

# 讀取源文件(sourceFile)內容
rawContent = readFile(sourceFile)
# 結巴分詞
seg_list = jieba.cut(rawContent, cut_all=False)
# 把分詞結果寫到目標文件(targetFile)中,這裏是用空格分割,也能夠改爲其餘符號
writeFile(targetFile, " ".join(seg_list))

3、對分詞結果進行統計和排序

簡單說一下思路,讀取分詞結果的txt文件,而後用空格分割成詞語數組,遍歷數組,分別統計詞語的出現次數。最後對全部的單詞根據頻次進行排序。app

3.1 統計分詞

# 詞語數組
wordList= []
# 用於統計詞頻
wordCount= {}

# 從分詞後的源文件中讀取數據
sourceData = readFile(sourceFile)
# 利用空格分割成數組
wordList = sourceData.split(' ')
# 遍歷數組進行詞頻統計,這裏使用wordCount 對象,出發點是對象下標方便查詢
for item in wordList:
  if item not in wordCount:
    wordCount[item] = 1
  else:
    wordCount[item] += 1
# 循環結束,wordCount 對象將保存全部的詞語和詞頻

3.2 根據詞頻排序

Python 數組中自帶sort() 函數,爲了方便比較,咱們定義了一個對象,並標明瞭比較方法函數

# 定義wordItem 類
class wordItem:
  label = ''
  times = 0
  # 構造函數
  def __init__(self, l, t):
    self.label = l
    self.times = t
  # 用於比較
  def __lt__(self, other):
    return self.times < other.times

# 定義wordItem 數組用於排序
wordItemArray= []
# 構造對象數組
for key in wordCount:
  wordItemArray.append(wordItem(key, wordCount[key]))
# 按詞頻由高到低倒序排列
wordItemArray.sort(reverse = True)

# 寫入目標文件 target
wf = codecs.open(targetFile,'w', "utf-8")
for item in wordItemArray:
  wf.write(item.label+' '+str(item.times) + '\n')

4、使用命令行

使用命令行須要引入import sys,經過sys.argv[n]能夠得到輸入的命令行參數,注意第一個是腳本名。工具

import sys
# 咱們調用時會 python index.py 'source.txt' 'target.txt'
# 注意這裏argv 是腳本名
# print "name: ", sys.argv[0] # 腳本名 如:index.py
sourceFile = sys.argv[1]
targetFile = sys.argv[2]

5、完整代碼

參見 github node-popcorn,項目中加入了一些puppeteer無頭瀏覽器爬蟲抓取網頁內容的代碼。

相關文章
相關標籤/搜索