Python pytagcloud 中文分詞 生成標簽雲 系列(一)


轉載地址:https://zhuanlan.zhihu.com/p/20432734
工具

Python 2.7 (前幾天試了試 Scrapy 所以用的 py2 。血淚的教訓告訴我們能用 py3 千萬別用 py2 ,編碼問題累死人)

jieba 結巴分詞 fxsjy/jieba · GitHub

pytagcloud 詞雲生成 atizo/PyTagCloud · GitHub

安裝過程應該沒什么坑,不像 Scrapy 光安裝都能寫一篇出來。自行補充依賴就好。

 

Step 1 爬蟲抓取文本

這個階段比較簡單。雖然我欠了半年的爬蟲系列一直沒有寫,但是抓個貼子標題都不涉及模擬登陸,對入門的人應該問題不大。隨便改了一下以前的代碼就跑出來了。

# -*- coding: utf-8 -*-

import requests import re import os import codecs def get_title(url): s = requests.session() h = s.get(url) html = h.content.decode('utf-8') #print html
 qurl = r'<a href="forum.*? class="s xst">(.*?)</a>' qurllist = re.findall(qurl,html) #print qurllist


    for each in qurllist: f = codecs.open("result.txt", 'a', 'utf-8') f.write(each+'\n') print each #f.flush()
 f.close() for i in range(1,1000): url = 'http://rs.xidian.edu.cn/forum.php?mod=forumdisplay&fid=72&page='+str(i) get_title(url)

 

 

值得注意的還是編碼問題,用 py3 的可以忽略。

Step 2 中文分詞,提取關鍵詞

jieba 的分詞效果還是比較理想的。不過我在統計詞頻的時候一時沒想起什么太好的解決辦法,加上編碼問題把我煩的夠嗆。於是偷懶地選擇了 jieba 自帶的提取關鍵詞並給出權重的功能。

詳見 jieba/extract_tags.py at master · fxsjy/jieba · GitHub

 

import sys sys.path.append('../') import jieba import jieba.analyse from optparse import OptionParser USAGE = "usage: python extract_tags_with_weight.py [file name] -k [top k] -w [with weight=1 or 0]" parser = OptionParser(USAGE) parser.add_option("-k", dest="topK") parser.add_option("-w", dest="withWeight") opt, args = parser.parse_args() if len(args) < 1: print(USAGE) sys.exit(1) file_name = args[0] if opt.topK is None: topK = 10
else: topK = int(opt.topK) if opt.withWeight is None: withWeight = False else: if int(opt.withWeight) is 1: withWeight = True else: withWeight = False content = open(file_name, 'rb').read() tags = jieba.analyse.extract_tags(content, topK=topK, withWeight=withWeight) if withWeight is True: for tag in tags: print("tag: %s\t\t weight: %f" % (tag[0],tag[1])) else: print(",".join(tags))

需要命令行運行。

先 cd 到目錄,然后使用命令 

python extract_tags_with_weight.py [file name] -k [top k] -w [with weight=1 or 0]

 

其中 -k 后輸入關鍵詞個數 -w 選擇是否顯示權重。如圖:(具體的文本和結果我后面打包發一下,就不貼了)

說明:
其實標准的過程應該是分詞以后統計詞頻,生成 k-v 的 Python 字典然后交由 pytagcloud 生成詞雲。由於我也是剛接觸分詞這塊,不太熟悉,統計詞頻時力不從心,所以直接用了現成的關鍵詞提取。
另外由於生成詞雲時需要的格式為 Python 字典(k-v),我自己在中間用 Notepad++ 和 Excel 做了一些文本上的預處理,這方面就八仙過海各顯神通了。
還有,我使用了默認詞典,沒有自定義內容(jieba 是可以自定義詞典的),所以一些詞在提取時出現偏差,比如"新校區"、"老校區"就全部提成了"校區",X號樓只保留下來了"號樓"。另外我沒有做詞性篩選,導致許多無意義副詞出現在結果里,后面生成詞雲時自己手動去掉了。

Step 3 生成詞雲

關於 pytagcloud ,搜到的唯一一篇比較有價值的文章就是Python中文標簽雲之pytagcloud 更多的還是要參考官方示例 atizo/PyTagCloud · GitHub 。我也沒把功能全試完,大家可以自己向深處挖掘。

 

# -*- coding: utf-8 -*-
import codecs import random from pytagcloud import create_tag_image, create_html_data, make_tags, \ LAYOUT_HORIZONTAL, LAYOUTS from pytagcloud.colors import COLOR_SCHEMES from pytagcloud.lang.counter import get_tag_counts wd = {} fp=codecs.open("rsa.txt", "r",'utf-8'); alllines=fp.readlines(); fp.close(); for eachline in alllines: line = eachline.split('        ') #print eachline,
    wd[line[0]] = int(line[1]) print wd from operator import itemgetter swd = sorted(wd.iteritems(), key=itemgetter(1), reverse=True) tags = make_tags(swd,minsize = 50, maxsize = 240,colors=random.choice(COLOR_SCHEMES.values())) create_tag_image(tags, 'keyword_tag_cloud4.png', background=(0, 0, 0, 255), size=(2400, 1000),layout=LAYOUT_HORIZONTAL, fontname="SimHei")

輸出結果如圖。

 

補充:使用 pytagcloud 一定要記得添加中文字體並修改其配置文件,具體方法:
准備一個 ttf 中文字體,如 simhei.ttf ,將其移動到 C:\Users\~\AppData\Roaming\Python\Python27\site-packages\pytagcloud\fonts
並修改該文件夾下的 fonts.json 文件,添加相應的字體記錄,如

{

"name": "SimHei",

"ttf": "simhei.ttf",

"web": "none"

},

 

輸出結果還是比較有趣的,不過校外的人可能不熟悉。當然這本身也只是個很入門的東西,算作娛樂吧。

代碼部分原創的不多…很多是網上拼拼湊湊找的。但是 pytagcloud 相關的內容搜出來比較少,對中文支持也需要自己修改,有人要自己做的話最好用谷歌搜索,然后參考前幾篇文章和官方示例自己嘗試。

在此順便吐槽百度一發,實在難用,百度搜來搜去的結果,遠不如谷歌直擊要害。當然英語好就更棒了,能直接讀文檔和看 stackoverflow 。

想要自己嘗試的可以用我這次的文檔,或者自己抓感興趣的資料。

http://pan.baidu.com/s/1mhn4mN2

 

拓展的話,感興趣的可以多嘗試幾款分詞比較一下。具體的就不推薦了我也不了解,搜一下會有很多,功能很豐富,語義分析,情感傾向,都有,可玩性比較高吧。

另外有另一款 Python 下的詞雲生成器 amueller/word_cloud · GitHub 留作以后研究吧。另外過程中看文章時發現好多詞頻統計和標簽雲是用 R 做的,有機會可以學習一下。

噢對了, pytagcloud 支持直接生成 HTML 網頁的標簽雲,官方 demo 里有,我這邊沒做,就不展示了。


免責聲明!

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



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