jieba:统计一篇文章中词语数

jieba官方文档

1、jieba分词的四种模式

精确模式、全模式、搜索引擎模式、paddle模式

精确模式:把文本精确的切分开,不存在冗余单词,适合文本分析;

全模式:把文本中所有可能的词语都扫描出来,不能解决歧义,有冗余

搜索引擎模式:在精确模式的基础上,对长单词再次切分,提高召回率,适用于搜索引擎分词

paddle模式:利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式需要安装paddlepaddle-tiny

pip install paddlepaddle-tiny==1.6.1

 

2、jieba库常用函数

函数 参数
jieba.cut(s,cut_all=False,HMM=False,use_paddle=False)

s:为需要分词的字符串

cut_all:是否采用全模式(False情况下为精确模式)

HMM:是否使用HMM模型

use_paddle:是否使用paddle模式下的分词模式

返回Generator类型

jieba.cut_for_search(s,HMM=False) 搜索引擎模式,参数含义同上,返回Generator类型
jieba.lcut(s,cut_all=False,HMM=False,use_paddle=False) 返回一个List类型
jieba.lcut_for_search(s,HMM=False) 搜索引擎模式,返回List
jieba.add_word(w) 向分词词典中增加新词w
jieba.Tokenizer(dictionary=DEFAULT_DICT)

新建自定义分类器,可用于同时使用不同词典。

jieba.dt为默认分类器,所有全局分词相关函数都是该分类器的映射

3、载入字典

开发者可以指定自己自定义的词典,以便包含jieba词库没有的词。虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率。

用法:jieba.load_userdict(file_name) #file_name为文件类对象或者自定义词典的路径

词典格式和dict.txt一样,一个词占一行;每一行分为三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name如果为路径或者二进制方式打开的文件,则文件必须为UTF-8编码。

词频省略时使用自动计算能保证分出改词的词频。

例如:

 

 

 3.1、调整词典

使用add_word(word , freq=None , tag=None)del_word(word)可以在程序中动态修改词典。

使用suggest_freq(segment , true=True)可以自动调节单个词语的词频,使其能(或者不能)被分出来。

注意:自动计算的词频在使用HMM新词发现功能时可能无效。

>>>jieba.suggest_freq(('' , '') , True)
494
#这样“中将”同时出现时,将不会作为一个词语,而是两个词“中”和“将”

>>>jieba.suggest_freq('台中' , True)
69
#"台"和"中"同时出现时,将作为一个词语“台中”出现

4、词性标注

jieba.posseg.POSTokenizer(tokenizer=None)新建自定义分类器,tokenizer参数可指定内部使用的jieba.Tokenizer分词器。jieba.posseg.dt为默认词性标注分类器。

标注句子分词后每个词的词性,采用和ictclas兼容的标记法。

除了jieba默认的分词模式,提供paddle模式下的词性标注功能。paddle模式采用延迟加载模式,通过提前安装的paddlepaddle-tiny,并且import该部分代码:

用法示例:

复制代码
import jieba
import jieba.posseg as pseg

words = pseg.cut('我爱北京天安门') #默认精确模式

jieba.enable_paddle() #启用paddle模式
words = pseg.cut( '我爱北京天安门' , use_paddle=True ) #paddle模式
for word,flag in words:
    print('%s %s'%(word,flag))
复制代码

结果:

注意:这里pseg.cut的结果是pair对象,而不是普通的List,访问时,比如上文的words,是4个pair对象,一个一个访问时,访问方式为words[i].wordwords[i].flag,分别是词与词性。

 

 

 paddle模式的词性标注对应表如下,其中词性标签24个(小写字母),专名类别标签4个(大写字母)。

 

5、并行分词

原理:将目标文本按行分隔之后,把各行文本分配到多个Python进程并行分词,然后归并结果,从而获得分词速度的可观提升

基于Python自带的multiprocessing模块,目前暂不支持Windows

用法:

jieba.enable_parallel(4) #开启并行分词模式,参数为并行进程数
jieba.disable_parallel() #关闭并行分词模式

结果:与单进程相比提高了3、4倍

 

6、Tokenize:词语在原文中的起止位置

输入参数只接受unicode,即字符串为u'xxxx'的形式

result = jieba.tokenize(u'永和服装饰品有限公司')
for tk in result:
    print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))

 

 搜索引擎模式

result = jieba.tokenize(u'永和服装饰品有限公司', mode='search')
for tk in result:
    print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))

 

 

7、例子

①、统计《边城》中词语的词频

 

复制代码
from collections import Counter
import jieba
import re

def clean(s):
    pattern=re.compile(r'[^\u4e00-\u9fa5]')
    return re.sub(pattern,'',s)

if __name__=='__main__':
    with open('《边城》.txt','r',encoding='utf-8') as f:
        article=f.read()
        article=clean(article)
        words = jieba.lcut(article)
    #停用词表
    stoplists=[line.strip() for line in open('stop_words.txt','r',encoding='utf-8').readlines()]
    wordlist=[]
    for word in words:
        if word not in stoplists:
            wordlist.append(word)
    result_dict=Counter(wordlist)
    result_list = sorted(result_dict.items(), key=lambda item: item[1], reverse=True)
    for i in range(15):
        word ,  count =result_list[i]
        print('{}\t\t{}'.format(word,count))
复制代码

 

 

 

②、去除停用词

停用词:停用词大致分为两类。一类是人类语言中包含的功能词,这些功能词极其普遍,与其他词相比,功能词没有什么实际含义,比如'the'、'is'、'at'、'which'、'on'等。但是对于搜索引擎来说,当所要搜索的短语包含功能词,特别是像'The Who'、'The The'或'Take The'等复合名词时,停用词的使用就会导致问题。

另一类词包括词汇词,比如'want'等,这些词应用十分广泛,但是对这样的词搜索引擎无法保证能够给出真正相关的搜索结果,难以帮助缩小搜索范围,同时还会降低搜索的效率,所以通常会把这些词从问题中移去,从而提高搜索性能。

 停用词表:https://github.com/goto456/stopwords

复制代码
import jieba

#创建停用词列表
def stopwordslist():
        stopwords = [line.strip() for line in open('stop_words.txt',encoding='utf-8').readlines()]
        return stopwords

#对句子进行中文分词
def seg_depart(sentence):
    #对文档中的每一行进行中文分词
    print('正在分词')
    sentence_depart = jieba.cut(sentence.strip())
    #创建一个停用词列表
    stopwords = stopwordslist()
    #输出结果为outstr
    outstr=''
    #去除停用词
    for word in sentence_depart:
        if word not in stopwords:
            outstr + = word
            outstr + = ' '
    return outstr

#输出
filename = 'Init.txt'
outfilename = 'out.txt'
inputs = open(filename)
outputs = open(outfilename,'w')
for line in inputs:
        line_seg=seg_depart(line)
        outputs.write(line_seg + '\n')
        print( '———————正在进行名词筛选——————' )  
outputs.close()
inputs.close()
print('分词成功!!!')
复制代码

 注意上文中的红字:最好不要用read(),因为会把词分开读入

学习自:Python jieba库的使用说明

其他:词频统计

posted @   ShineLe  阅读(2237)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示