码迷,mamicode.com
首页 > 编程语言 > 详细

Python 分词及词云绘图

时间:2018-01-13 00:14:15      阅读:437      评论:0      收藏:0      [点我收藏+]

标签:fetchall   文件   出现   odi   lib   rds   cursor   rate   字典   

支持三种分词模式:
精确模式,试图将句子最精确地切开,适合文本分析;
全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。


关键词:HMM 隐马尔可夫模型

 

三种分词模式:

# -*- coding: utf-8 -*-
import jieba
#jieba.initialize()

seg_list = jieba.cut("中华人民共和国万岁!", cut_all=False) #精确模式(默认)
print(" | ".join(seg_list))

seg_list = jieba.cut("中华人民共和国万岁!", cut_all=True)  #全模式
print(" | ".join(seg_list)) 

seg_list = jieba.cut_for_search("中华人民共和国万岁!")     #搜索引擎模式
print(" | ".join(seg_list))

结果:
中华人民共和国 | 万岁 | !
中华 | 中华人民 | 中华人民共和国 | 华人 | 人民 | 人民共和国 | 共和 | 共和国 | 万岁 |  |
中华 | 华人 | 人民 | 共和 | 共和国 | 中华人民共和国 | 万岁 | !

 

结果可以直接保持为 list

seg_list = jieba.cut("中华人民共和国万岁!") #默认精确模式
print(seg_list) #此返回生成器

seg_list = jieba.lcut("中华人民共和国万岁!")
print(seg_list)

seg_list = jieba.lcut_for_search ("中华人民共和国万岁!")
print(seg_list)

结果:
<generator object Tokenizer.cut at 0x0000000003972150>
[‘中华人民共和国‘, ‘万岁‘, ‘!‘]
[‘中华‘, ‘华人‘, ‘人民‘, ‘共和‘, ‘共和国‘, ‘中华人民共和国‘, ‘万岁‘, ‘!‘]

 

【自定义分词字典(属额外添加)】
默认分词器为 jieba.dt。可使用自定义字典,添加词库中没有的词,文本必须为 UTF-8 编码。词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开。

测试文件 dict.txt 中,我只添加一个单词 "和国":

jieba.load_userdict("C:/Users/huangzecheng/Desktop/dict.txt") 

seg_list = jieba.cut("中华人民共和国万岁!", cut_all=True)#如全模式
print(" | ".join(seg_list)) 

结果:
中华 | 中华人民 | 中华人民共和国 | 华人 | 人民 | 人民共和国 | 共和 | 共和国 | 和国 | 万岁 |  |

【添加删除分词】
加载的自定义词典,是与默认的一起定义分词的。也可以使用几个函数添加、删除、禁止某个词被划分。
add_word(word, freq=None, tag=None)
del_word(word) 
suggest_freq(segment, tune=True)

jieba.add_word(中华人)
print(" | ".join(jieba.cut("中华人民共和国万岁!", cut_all=True))) 
结果:中华 | 中华人 | 中华人民 | 中华人民共和国 | 华人 | 人民 | 人民共和国 | 共和 | 共和国 | 和国 | 万岁 |  |

jieba.del_word(共和) 
print(" | ".join(jieba.cut("中华人民共和国万岁!", cut_all=True))) 
结果:中华 | 中华人 | 中华人民 | 中华人民共和国 | 华人 | 人民 | 人民共和国 | 共和国 | 和国 | 万岁 |  |

jieba.add_word(共和)
jieba.suggest_freq(国万岁, tune=True)
print(" | ".join(jieba.cut("中华人民共和国万岁!", cut_all=True))) 
结果:中华 | 中华人 | 中华人民 | 中华人民共和国 | 华人 | 人民 | 人民共和国 | 共和国 | 和国 | 国万岁 | 万岁 |  |

【使用最多的分词】
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence :为待提取的文本
topK :为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight :为是否一并返回关键词权重值,默认值为 False
allowPOS :仅包括指定词性的词,默认值为空,即不筛选

测试:去文本中出现次数最多的前5个字符

str = "topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20;"
str = str + "withWeight 为是否一并返回关键词权重值,默认值为 False"
str = str + "allowPOS 仅包括指定词性的词,默认值为空,即不筛选"
str = str + "jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件"
tags = jieba.analyse.extract_tags(str, topK=5)
print(" | ".join(tags))
结果:默认值 | TFIDF | idf | IDF | path

 上面说过字典有3部分组成:词语、词频(可省略)、词性(可省略)。textrank可运行过滤不同词性。
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns‘, ‘n‘, ‘vn‘, ‘v‘)) 

tags = jieba.analyse.textrank(str, topK=5, withWeight=False, allowPOS=(ns, n, vn, v)) 
print(" | ".join(tags))
结果:权重 | 关键词 | 词性 | 频率 | 新建

【取分词及词性】

words = jieba.posseg.cut("中华人民共和国万岁!")
for word, flag in words:
    print(%s %s % (word, flag))

结果:
中华人民共和国 ns
万岁 m
! x

【取分词及起止位置】

words = jieba.tokenize("中华人民共和国万岁!")
for w in words:
    print("word %s\t\t start: %d \t\t end:%d" % (w[0],w[1],w[2]))

结果:
word 中华人民共和国      start: 0         end:7
word 万岁                start: 7         end:9
word !                  start: 9         end:10
words = jieba.tokenize("中华人民共和国万岁!", mode=search) #搜索模式
for w in words:
    print("word %s\t\t start: %d \t\t end:%d" % (w[0],w[1],w[2]))

结果:
word 中华                start: 0                end:2
word 华人                start: 1                end:3
word 人民                start: 2                end:4
word 共和                start: 4                end:6
word 共和国              start: 4                end:7
word 中华人民共和国      start: 0                end:7
word 万岁                start: 7                end:9
word !                  start: 9                end:10

简单示例:从 sql server 数据库中读取某个文本字段,分词并自定义绘图

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

import pymssql
import jieba
import jieba.analyse
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from scipy.misc import imread

host = "localhost"
user = "kk"
passwd = "kk"
dbname = "hzc"
conn = None

try:
    conn = pymssql.connect(
        host = host,
        user = user,
        password = passwd,
        database = dbname
        )
    cur = conn.cursor()
    cur.execute("select col from jieba;")
    rows = cur.fetchall()
    tagsall=u""
    #tagsall = open(‘filepath.txt‘,‘r‘).read()
    for row in rows:
        tags = jieba.analyse.extract_tags(row[0], topK=20)
        tagsjoin = u" ".join(tags)
        tagsall = tagsall + " " + tagsjoin
        #print(tagsjoin)

    #http://labfile.oss.aliyuncs.com/courses/756/DroidSansFallbackFull.ttf
    wc_cfg = WordCloud(
        font_path="D:/Python35/Tools/whl/DroidSansFallbackFull.ttf",#字体
        mask= imread("D:/Python35/Tools/whl/bg.png"),#背景模板(只黑白图,黑的显示)
        background_color="white", #背景色
        max_words=1000,     #最大词量
        mode="RGBA",        #透明底色(background_color不为空).默认rgb
        width=500,          #宽度
        height=400,         #高度
        max_font_size=100   #字体大小
    )
    wc = wc_cfg.generate(tagsall)
    plt.imshow(wc)
    plt.axis("off")
    plt.show()
finally:
    if conn:
        conn.close()

技术分享图片

 

Python 分词及词云绘图

标签:fetchall   文件   出现   odi   lib   rds   cursor   rate   字典   

原文地址:https://www.cnblogs.com/hzc2012/p/8277826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!