老是看到別人用Python搞各類統計,前端菜鳥的我也來嘗試了一把。有各類語義分析庫在,一切好像並非很複雜。不過Python剛開始看,估計代碼有點醜。前端
thulac (http://thulac.thunlp.org/)
THULAC(THU Lexical Analyzer for Chinese)由清華大學天然語言處理與社會人文計算實驗室研製推出的一套中文詞法分析工具包,具備中文分詞和詞性標註功能。THULAC具備以下幾個特色:node
jieba (https://github.com/fxsjy/jieba)
聽說是最好的中文分詞組件,支持Python、C++、Java、node.js、PHP等多種語言。python
支持三種分詞模式()git
兩種分詞組件的使用都比較簡單,以 jieba 爲例:github
# -*- coding: utf-8 -*- import jieba # 精確模式 seg_list = jieba.cut("我來到北京清華大學", cut_all=False) print "Default Mode: " + "/ ".join(seg_list) #輸出結果: #Default Mode: 我/ 來到/ 北京/ 清華大學
對文件內容進行分詞其實本質上和對字符串的分詞同樣,只不過多了個文件讀寫的過程。
這裏寫了兩個讀寫文件的函數,之因此使用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))
簡單說一下思路,讀取分詞結果的txt文件,而後用空格分割成詞語數組,遍歷數組,分別統計詞語的出現次數。最後對全部的單詞根據頻次進行排序。app
# 詞語數組 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 對象將保存全部的詞語和詞頻
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')
使用命令行須要引入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]
參見 github node-popcorn,項目中加入了一些puppeteer
無頭瀏覽器爬蟲抓取網頁內容的代碼。