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].word与words[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(),因为会把词分开读入
其他:词频统计
jieba:统计一篇文章中词语数的更多相关文章
- N个任务掌握java系列之统计一篇文章中单词出现的次数
问题:统计一篇文章中单词出现的次数 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中. (2)定义一个Map,key是字符串类型,保存单词:valu ...
- Java统计一篇文章中每个字符出现的个数
大家可以参考下面代码,有什么疑问请留言... import java.io.BufferedReader; import java.io.FileInputStream; import java.io ...
- 一篇文章有若干行,以空行作为输入结束的条件。统计一篇文章中单词the(不管大小写,单词the是由空格隔开的)的个数。
#include <iostream>using namespace std; int k = 0;int n = 0;int main() { char c; char a[1000]; ...
- Python - 统计一篇文章中单词的频率
def frenquence_statistic(file_name): frequence = {} for line in open(file_name,'r').readlines(): wor ...
- js将一篇文章中多个连续的<br>标签替换成两个连续的<br>标签
写本文的目的是今天恰好有一个之前做SEO的同事问我怎样把一篇文章中多个连续的br标签替换成两个连续的br标签,这里就牵涉到SEO层面的问题了. 在做SEO优化的时候,其中有一个需要注意的地方就是尽量减 ...
- 解决前面有一篇文章中'flashplayer.so为什么要设置777权限的'问题 的 思考了
列出某个目录下的所有内容? ls -A, -A等同于-a, 即是-all, 只是-A 不显示.和.. ll ls 某个目录, 如果它下面没有任何东西, 那么 就没有输出! 同时, ll某个目录, 不会 ...
- 针对上一篇文章中的代码,想出的重构方案(python实现)
#!/usr/bin/env python class Processor: def __init__(self, processor): self.processor = processor def ...
- python 找出一篇文章中出现次数最多的10个单词
#!/usr/bin/python #Filename: readlinepy.py import sys,re urldir=r"C:\python27\a.txt" disto ...
- [C#]统计文本文件txt中的行数(快速读取)
快速统计文本文件中的行数( StreamReader.ReadLine() ): 测试代码如下: //读取txt文件中总行数的方法 public static int requestMethod(St ...
随机推荐
- Ubuntu14.4配置vnc
一.安装Xrdp Windows远程桌面使用的是RDP协议,所以ubuntu上就要先安装Xrdp,在ubuntu软件中心搜索xrdp安装. 安装xrdp的同时会自动安装vnc4server,xbase ...
- 了解promise、promise对象
Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象. 所谓Pr ...
- [luoguP4139]上帝与集合的正确用法
\(\text{Description}\) \(\text{Given a number }p(p\leqslant10^7).\) \(\text{Output }2^{2^{2^{2^{\cdo ...
- 体验 正式发布 的OSM v1.0.0 版本
2021年10月份发布了OSM 1.0 RC[1],在过去的几个月里,OSM 的贡献者一直在努力为 v1.0.0 版本的发布做准备.2022年2月1日,OSM 团队正式发布 1.0.0 版本[2]. ...
- JSP中获取各种路径的方法
我们当中可能有很多人不知道如何获得jsp中的路径怎么获取 方法一: <a href ="test.jsp?p=fuck">跳转到test2</a> 方法二: ...
- LVS负载均衡群集部署——NAT模式
LVS负载均衡群集部署--NAT模式 1.群集应用概述 2.NAT模式LVS负载均衡群集部署 1.群集应用概述: 存在的问题: 互联网应用中,随着站点对硬件性能.响应速度.服务稳定性.数据可靠性等要求 ...
- 2022寒假集训day4
day4(day5补完的) 继续刷搜索方面的题, 初步了解了序列. T1 迷宫问题 题目描述设有一个 n*n 方格的迷宫,入口和出口分别在左上角和右上角.迷宫格子中分别放 0 和 1 ,0 表示可通, ...
- ClassPath资源的读取
读取ClassPath的资源 在程序中经常有很多资源需要读取,常见的就是配置文件,Java中将文件当作一种资源来处理,可以使用Class或者ClassLoader来处理 一,使用Class类的getS ...
- INTERSPEECH 2014 | 1-Bit Stochastic Gradient Descent and its Application to Data-Parallel Distributed Training of Speech DNNs
这篇文章之前也读过,不过读的不太仔细,论文中的一些细节并没有注意到.最近为了写开题报告,又把这篇论文细读了一遍.据笔者了解,这篇论文应该是梯度量化领域的开山之作,首次使用了梯度量化技术来降低分布式神经 ...
- Xshell在Windows和Linux间文件的上传和下载
本文通过lrzsz来实现Windows和Linux间文件间的文件传输. lrzsz使用 XMODEM.YMODEM 和 ZMODEM 文件传输协议来实现文件的上传和下载.相比 FTP 或者 WinSC ...