python3生成標簽雲


標簽雲是現在大數據里面最喜歡使用的一種展現方式,其中在python3下也能實現標簽雲的效果,貼圖如下:

-------------------進入正文---------------------

首先要安裝以下幾個庫:

1 #!/usr/bin/python3.4
2 # -*- coding: utf-8 -*-
3 
4 # http://www.lfd.uci.edu/~gohlke/pythonlibs/#cx_freeze
5 # 萬能倉庫下載pygame
6 # pip3下載simplejson

還有最重要的庫:

pip3 install pytagcloud

或者去官網下載:

https://pypi.python.org/pypi/pytagcloud/

安裝完畢,利用官網的例子來做:

1 from pytagcloud import create_tag_image, make_tags
2 from pytagcloud.lang.counter import get_tag_counts
3 
4 YOUR_TEXT = "A tag cloud is a visual representation for text data, typically\
5 used to depict keyword metadata on websites, or to visualize free form text."
6 
7 tags = make_tags(get_tag_counts(YOUR_TEXT), maxsize=120)
8 
9 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文件,將每一行都按照空格划分成一個個數組的元素:

1  arr = []
2  file = open('../tagcloud/tag_file.txt', 'r')
3  data = file.read().split('\r\n')
4  for content in data:
5     contents = validatecontent(content).split()
6     for word in contents:
7         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是起初非法字符的函數:

1 # 去除內容中的非法字符 (Windows)
2 def validatecontent(content):
3     # '/\:*?"<>|'
4     rstr = r"[\/\\\:\*\?\"\<\>\|\.\*\+\-\(\)\"\'\(\)\!\?\“\”\,\。\;\:\{\}\{\}\=\%\*\~\·]"
5     new_content = re.sub(rstr, "", content)
6     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)])

最后直接代入進去就行了:

1 tags = make_tags(counts, maxsize=120)
2 
3 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')

運行,搞定!中文效果圖:

我的在github里面,可以去下載看看。


免責聲明!

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



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