您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關python3如何生成標簽云,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
標簽云是現在大數據里面最喜歡使用的一種展現方式,其中在python3下也能實現標簽云的效果,貼圖如下:
-------------------進入正文---------------------
首先要安裝以下幾個庫:
#!/usr/bin/python3.4 # -*- coding: utf-8 -*- # http://www.lfd.uci.edu/~gohlke/pythonlibs/#cx_freeze # 萬能倉庫下載pygame # pip3下載simplejson
還有最重要的庫:
pip3 install pytagcloud
或者去官網下載:
https://pypi.python.org/pypi/pytagcloud/
安裝完畢,利用官網的例子來做:
from pytagcloud import create_tag_image, make_tags from pytagcloud.lang.counter import get_tag_counts YOUR_TEXT = "A tag cloud is a visual representation for text data, typically\ used to depict keyword metadata on websites, or to visualize free form text." tags = make_tags(get_tag_counts(YOUR_TEXT), maxsize=120) create_tag_image(tags, 'cloud_large.png', size=(900, 600), fontname='Lobster')
果斷報錯:
Traceback (most recent call last): File "D:/code/pythonwork/Text.py", line 96, in <module> tags = make_tags(get_tag_counts(YOUR_TEXT), maxsize=120) File "C:\Python34\lib\site-packages\pytagcloud\lang\counter.py", line 25, in get_tag_counts return sorted(counted.iteritems(), key=itemgetter(1), reverse=True) AttributeError: 'dict' object has no attribute 'iteritems'
看了發現問題出在庫中的:
# counter.py return sorted(counted.iteritems(), key=itemgetter(1), reverse=True)
原來是python3.4不支持寫法:
在Python2.x中,items( )用于 返回一個字典的拷貝列表【Returns a copy of the list of all items (key/value pairs) in D】,占額外的內存。
iteritems() 用于返回本身字典列表操作后的迭代【Returns an iterator on all items(key/value pairs) in D】,不占用額外的內存。
Python 3.x 里面,iteritems() 和 viewitems() 這兩個方法都已經廢除了,而 items() 得到的結果是和 2.x 里面 viewitems() 一致的。在3.x 里 用items()替換iteritems() ,可以用于 for 來循環遍歷。
但是當我換成:
# counter.py return sorted(counted.items(), key=itemgetter(1), reverse=True)
發現運行并沒有錯誤,但是沒有生成標簽云啊,一遍一遍打印出來,終于找到問題了:
from pytagcloud import create_tag_image
這個是為了生成一個元組的東西:
# counts =[('cloud', 3), # ('words', 2), # ('code', 1), # ('word', 1), # ('appear', 1)]
但是python3里面的items()是達不到這個效果的,所以我就自己寫吧。
讀取txt文件,將每一行都按照空格劃分成一個個數組的元素:
arr = [] file = open('../tagcloud/tag_file.txt', 'r') data = file.read().split('\r\n') for content in data: contents = validatecontent(content).split() for word in contents: arr.append(word)
['BAISC', 'Python', 'BASICA', 'GVBASIC', 'GWBASIC', 'Python', 'ETBASIC', 'QBASIC', 'Quick', 'Basic', 'Turbo', 'Basic', 'True', 'Python', 'java', 'Basic', 'Visual', 'Basic', 'Visual', 'Basic', 'Net', 'Power', 'Basic', 'Python', 'java', 'SQL', 'VB', 'Small', 'Basic', 'Free', 'Basic', 'DarkBASIC', 'VBScript', 'Visual', 'Basic', 'For', 'ApplicationsVBA', 'REALbasic', 'C', 'C', 'Turbo', 'C', 'Python', 'java', 'SQL', 'VB', 'PHP', 'HTML', 'Borland', 'C', 'C', 'Builder', 'CCLI', 'Python', 'java', 'ObjectiveC', 'C#', 'Microsoft', 'Visual', 'C', 'Pascal', 'Delphi', 'Turbo', 'Python', 'java', 'SQL', 'VB', 'PHP', 'HTML', 'Pascal', 'Object', 'Pascal', 'Free', 'Pascal', 'Lazarus', 'FORTRAN', 'MATLAB', 'Scilab', 'GNU', 'Octave', 'R', 'SPlus', 'Mathematica', 'Maple', 'Python', 'java', 'SQL', 'VB', 'PHP', 'HTML', 'Julia', 'xBaseClipper', 'Visual', 'FoxPro', 'SQLPLSQL', 'TSQL', 'SQLPSM', 'LINQ', 'Xquer', 'Lua', 'Python', 'java', 'SQL', 'VB', 'Perl', 'PHP', 'Python', 'Ruby', 'ASP', 'JSP', 'TclTk', 'VBScript', 'AppleScript', 'AAuto', 'ActionScript', 'DMDScript', 'ECMAScript', 'JavaScript', 'JScript', 'TypeScript', 'sh', 'bash', 'Python', 'java', 'SQL', 'VB', 'PHP', 'HTML', 'sed', 'awk', 'PowerShell', 'csh', 'tcsh', 'ksh', 'zsh', 'XMLSVG', 'XML', 'Schema', 'Python', 'java', 'XSLT', 'XHTML', 'MathML', 'XAML', 'SSML', 'SGML', 'HTML', 'Python', 'java', 'SQL', 'VB', 'Curl', 'SVG', 'XML', 'Schema', 'XSLT', 'XHTML', 'MathML', 'XAML', 'SSML', 'Java', 'Jython', 'JRuby', 'JScheme', 'Groovy', 'Kawa', 'Scala', 'Clojure', 'ALGOL', 'APLJ', 'Ada', 'Falcon', 'Forth', 'Io', 'MUMPS', 'PLI', 'PostScript', 'REXX', 'SAC', 'Self', 'Simula', 'Swift', 'IronPython', 'IronRuby', 'COBOL', 'Python', 'java', 'SQL', 'VB', 'PHP', 'HTML']
其中validatecontent是起初非法字符的函數:
# 去除內容中的非法字符 (Windows) def validatecontent(content): # '/\:*?"<>|' rstr = r"[\/\\\:\*\?\"\<\>\|\.\*\+\-\(\)\"\'\(\)\!\?\“\”\,\。\;\:\{\}\{\}\=\%\*\~\·]" new_content = re.sub(rstr, "", content) return new_content
對每一個元素都來個計數:
from collections import Counter counts = Counter(arr).items() print(counts)
效果出來了:
dict_items([('For', 1), ('SQL', 8), ('JRuby', 1), ('Builder', 1), ('HTML', 6), ('LINQ', 1), ('BAISC', 1), ('BASICA', 1), ('PHP', 6), ('Octave', 1), ('csh', 1), ('PostScript', 1), ('awk', 1), ('Ruby', 1), ('AppleScript', 1), ('Object', 1), ('java', 11), ('TclTk', 1), ('Xquer', 1), ('ksh', 1), ('zsh', 1), ('ETBASIC', 1), ('AAuto', 1), ('Borland', 1), ('SVG', 1), ('Jython', 1), ('Simula', 1), ('IronPython', 1), ('Python', 14), ('Microsoft', 1), ('ActionScript', 1), ('XHTML', 2), ('REXX', 1), ('COBOL', 1), ('Scilab', 1), ('Ada', 1), ('Basic', 9), ('GVBASIC', 1), ('ECMAScript', 1), ('TypeScript', 1), ('Falcon', 1), ('Clojure', 1), ('ASP', 1), ('ALGOL', 1), ('XMLSVG', 1), ('GWBASIC', 1), ('VBScript', 2), ('CCLI', 1), ('Lazarus', 1), ('Julia', 1), ('JSP', 1), ('PowerShell', 1), ('IronRuby', 1), ('Power', 1), ('FORTRAN', 1), ('Self', 1), ('Perl', 1), ('Small', 1), ('FoxPro', 1), ('REALbasic', 1), ('GNU', 1), ('Mathematica', 1), ('True', 1), ('Visual', 5), ('JScheme', 1), ('Maple', 1), ('Quick', 1), ('Turbo', 3), ('SAC', 1), ('JScript', 1), ('APLJ', 1), ('sh', 1), ('Kawa', 1), ('Pascal', 4), ('TSQL', 1), ('SPlus', 1), ('C', 6), ('xBaseClipper', 1), ('tcsh', 1), ('SQLPSM', 1), ('ApplicationsVBA', 1), ('SSML', 2), ('R', 1), ('Groovy', 1), ('XSLT', 2), ('MUMPS', 1), ('bash', 1), ('DarkBASIC', 1), ('SGML', 1), ('XAML', 2), ('VB', 8), ('Curl', 1), ('Schema', 2), ('MATLAB', 1), ('MathML', 2), ('Lua', 1), ('Net', 1), ('ObjectiveC', 1), ('JavaScript', 1), ('Java', 1), ('Io', 1), ('Free', 2), ('Delphi', 1), ('sed', 1), ('XML', 2), ('Forth', 1), ('C#', 1), ('SQLPLSQL', 1), ('QBASIC', 1), ('DMDScript', 1), ('Swift', 1), ('Scala', 1), ('PLI', 1)])
最后直接代入進去就行了:
tags = make_tags(counts, maxsize=120) create_tag_image(tags, 'cloud_large.png', size=(900, 600), fontname='Lobster')
具體的修正需要自己慢慢去琢磨了,比如文字大小、圖片大小、背景顏色等等。
到這里標簽云是算完成了的,但是卻是不支持中文,原因是沒有合適的ttf字體文件,準備一個 ttf 中文字體,如MicrosoftYaHei.ttf ,將其移動到
# C:\Python34\Lib\site-packages\pytagcloud\fonts
接著就是更改fonts.json文件,按照樣式添加類似于css的東西:
{ "name": "MicrosoftYaHei", "ttf": "MicrosoftYaHei.ttf", "web": "none" }
注意前后的逗號就行。最后將這里的代碼改一下:
create_tag_image(tags, 'cloud_large.png', size=(900, 600), fontname='MicrosoftYaHei')
運行,搞定!中文效果圖:
關于“python3如何生成標簽云”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。