教程参考来源视频:https://www.bilibili.com/video/av21452290/?p=1

jieba中文处理

与拉丁语系不同,亚洲语言不是以空格分隔词的。因此需要专门的工具将完整的文本分解成粒度更细的词。
jieba就是一个十分好用的中文工具。它以分词起家,但功能比分词强大很多。

1.基本分词函数与用法

jieba.cut及jieba.cut_for_search 返回的结构都是一个可迭代的generator,可以使用for循环来获得分词后得到的每一个词语(unicode)
jieba.cut方法接受三个输入参数:

  • 需要分词的字符串
  • cut_all 参数用了控制是否采用全模式
  • HMM 参数用来控制是否使用HMM模型

jieba.cut_for_search方法接受两个参数

  • 需要分词的字符串
  • 是否使用HMM模型
    该方法适合用于搜索引擎构建倒序索引的分词,粒度比较细
#encoding=utf-8
import jiebaseg_list=jieba.cut("我在学习自然语言处理",cut_all=True)
print(seg_list)
print("Full Mode: "+"/".join(seg_list)) #全模式seg_list=jieba.cut("我在学习自然语言处理",cut_all=False)
print("Default Mode: "+"/".join(seg_list)) #精确模式seq_list=jieba.cut("他毕业于上海交通大学,在百度深度学习研究院进行研究") #默认是精确模式
print(",".join(seq_list))seg_list=jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在哈佛大学深造")  #搜索引擎模式
print(", ".join(seg_list))
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/b3/hjtxm6356wx19tq8jhyw52400000gn/T/jieba.cache<generator object Tokenizer.cut at 0x102bcfd00>Loading model cost 0.703 seconds.
Prefix dict has been built succesfully.Full Mode: 我/在/学习/自然/自然语言/语言/处理
Default Mode: 我/在/学习/自然语言/处理
他,毕业,于,上海交通大学,,,在,百度,深度,学习,研究院,进行,研究
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 哈佛, 大学, 哈佛大学, 深造

jieba.lcutjieba.lcut_for_search直接返回list

result_lcut=jieba.lcut("小明硕士毕业于中国科学院计算所,后在哈佛大学深造")
print(result_lcut)
print(" ".join(result_lcut))
print(" ".join(jieba.lcut_for_search("小明硕士毕业于中国科学院计算所,后在哈佛大学深造")))
['小明', '硕士', '毕业', '于', '中国科学院', '计算所', ',', '后', '在', '哈佛大学', '深造']
小明 硕士 毕业 于 中国科学院 计算所 , 后 在 哈佛大学 深造
小明 硕士 毕业 于 中国 科学 学院 科学院 中国科学院 计算 计算所 , 后 在 哈佛 大学 哈佛大学 深造

添加用户自定义词典

很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇

  • 1.可以使用jieba.load_userdict(file_name)加载用户字典

  • 2.少量的词汇可以自己用下面方法手动添加:

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

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

print('/'.join(jieba.cut('如果放到旧字典中将出错。',HMM=False)))
如果/放到/旧/字典/中将/出错/。
jieba.suggest_freq(('中','将'),True)
494
print('/'.join(jieba.cut('如果放到旧字典中将出错。',HMM=False)))
如果/放到/旧/字典/中/将/出错/。

关键词提取

基于TF-IDF 算法的关键词抽取

import jieba.analyse

  • jieba.analyse.extract_tags(sentence,topK=20,withWeight=False,allowPOS=())
  • sentence 为待提取的文本
  • topK为返回几个TF\IDF权重最大的关键词,默认值为20
  • withWeight为是否一并返回关键词权重值,默认值为False
  • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
import jieba.analyse
lines=open('code/NLK/NAB.txt').read()
print("  ".join(jieba.analyse.extract_tags(lines,topK=20,withWeight=False,allowPOS=())))
怀特  德隆  篮板  赛季  独行侠  三双  猛龙队  拿到  比赛  对阵  球队  球员  自己  四场  卡莱尔  总冠军  达拉斯  之后  他们  几场
lines=open(u'code/NLK/西游记.txt').read()
print(" ".join(jieba.analyse.extract_tags(lines,topK=20,withWeight=False,allowPOS=())))
行者 八戒 师父 三藏 大圣 唐僧 沙僧 菩萨 妖精 和尚 那怪 甚么 那里 长老 呆子 怎么 徒弟 不知 老孙 悟空

关于TF-IDF算法的关键词抽取补充

  • 关键词提取所使用逆文件频率(IDF)文本语料库可以切换为自定义语料库的路径。
  • 用法:jieba.analyse.set_idf_path(file_name) #file_name为自定义语料库的路径
  • 关键词提取所使用停止词(Stop Words)文本语料库也可以切换成自定义语料库的路径
  • 用法:jieba.analyse.set_stop_words(file_name) #file_name为自定义语料库的路径

基于TextRank算法的关键词抽取

  • jieba.analyse.textrank(sentence,topK=20,withWeight=False,allowPOS=(‘ns’,‘n’,‘vn’,‘v’))
    直接使用,接口相同,注意默认过滤词性
  • jieba.analyse.TextRank()新建自定义TextRank 实例

算法基本思想:

  • 将带抽取关键词的文本进行分词
  • 以固定窗口大学(默认为5,通过span属性调整),词之间的共现关系,构建图
  • 计算图中节点的PageRank,注意是无向带权图
import jieba.analyse
lines=open('code/NLK/NAB.txt').read()
print("  ".join(jieba.analyse.textrank(lines,topK=20,withWeight=False,allowPOS=('ns','n','vn','v'))))
print("*"*30)
print("  ".join(jieba.analyse.textrank(lines,topK=20,withWeight=False,allowPOS=('ns','n'))))
可能  德隆  比赛  得到  篮板  成为  证明  猛龙队  总冠军  拿到  留意  时间  球员  变得  接受  戒指  不让  有点  交易  挣扎
******************************
总冠军  猛龙队  证明  时间  球队  球员  方式  私信  社交  戒指  篮板  先签  前场  媒体  球迷  冠军  东西  交易  对阵  感觉
import jieba.analyse
lines=open('code/NLK/西游记.txt').read()
print("  ".join(jieba.analyse.textrank(lines,topK=20,withWeight=False,allowPOS=('ns','n','vn','v'))))
行者  师父  八戒  三藏  大圣  菩萨  不知  只见  妖精  长老  国王  呆子  徒弟  悟空  小妖  不见  不能  不得  出来  师徒

词性标注

  • jieba.posseg.POSTokenizer(tokenizer=None)新建自定义分词器,tokenizer参数可指定内部使用的jieba.Tokenizer分词器。jieba.posseg.dt为默认词性标注分词器
  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法
  • 具体的词性对照表参见 计算所汉语词性标记集
import jieba.posseg as pseg
words=pseg.cut("我爱自然语言处理")
for word,flag in words:print('%s  %s' % (word,flag))
我  r
爱  v
自然语言  l
处理  v

并行分词

原理:将目标文本按行分隔后,把各行文本分配到多个Python进程并行分词,然后归并结果,从而获得分词速度的客观提升 基于python 自带的 multiprocessing 模块,目前暂不支持windows
用法:
jieba.enable_parallel(4) #开启并行分词模式,参数为并行进程数
jieba.disable_parallel() #关闭并行分词模式
试验结果:在4核3.4GHZ linux机器上,对金庸全集进行精确分词,获得了1MB/s的速度,是单进程的3.3倍,但在本人mac实测 1.7倍左右
注意:并行分词仅支持默认分词器jieba.dt和jieba.posseg.dt.

import sys
import time
import jiebajieba.enable_parallel()
content=open(u'code/NLK/西游记.txt',"r").read()
t1=time.time()
words=" / ".join(jieba.cut(content))
t2=time.time()
tm_cost=t2-t1
print("并行分词数速度为 %s bytes/second" % (len(content)/tm_cost))jieba.disable_parallel()
content=open(u'code/NLK/西游记.txt',"r").read()
t1=time.time()
words=" / ".join(jieba.cut(content))
t2=time.time()
tm_cost=t2-t1
print("非并行分词数速度为 %s bytes/second" % (len(content)/tm_cost))
并行分词数速度为 170905.68346768283 bytes/second
非并行分词数速度为 102924.44450978209 bytes/second

Tokenize:返回词在原文的起止位置

注意,输入参数只接受unicode

print("这是默认模式的tokenize")
result=jieba.tokenize(u'自然语言处理非常有用')
for tk in result:print("%s \t\t start:%d\t\t end:%d" %(tk[0],tk[1],tk[2]))
print('*'*30)
print("这是搜索模式的tokenize")
result=jieba.tokenize(u'自然语言处理非常有用',mode='search')
for tk in result:print("%s \t\t start:%d\t\t end:%d" %(tk[0],tk[1],tk[2]))
这是默认模式的tokenize
自然语言         start:0         end:4
处理       start:4         end:6
非常       start:6         end:8
有用       start:8         end:10
******************************
这是搜索模式的tokenize
自然       start:0         end:2
语言       start:2         end:4
自然语言         start:0         end:4
处理       start:4         end:6
非常       start:6         end:8
有用       start:8         end:10

ChineseAnalyzer for Whoosh 搜索引擎

  • from jieba.analyse import ChineseAnalyzer
# -*- coding: UTF-8 -*-
from __future__ import unicode_literals
import sys, ossys.path.append("../")
from whoosh.index import create_in, open_dir
from whoosh.fields import *
from whoosh.qparser import QueryParser
from jieba.analyse import ChineseAnalyzer
analyzer = ChineseAnalyzer()
schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT(stored=True, analyzer=analyzer))if not os.path.exists("tmp"):os.mkdir("tmp")ix = create_in("tmp", schema)  # for create new index
# ix = open_dir("tmp") # for read only
writer = ix.writer()writer.add_document(title="document1",path="/a",content="This is the first document we’ve added!"
)writer.add_document(title="document2",path="/b",content="The second one 你 中文测试中文 is even more interesting! 吃水果"
)writer.add_document(title="document3",path="/c",content="买水果然后来世博园。"
)writer.add_document(title="document4",path="/c",content="工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
)writer.add_document(title="document4",path="/c",content="咱俩交换一下吧。"
)writer.commit()
searcher = ix.searcher()
parser = QueryParser("content", schema=ix.schema)for keyword in ("水果世博园", "你", "first", "中文", "交换机", "交换"):print(keyword + "的结果为如下:")q = parser.parse(keyword)results = searcher.search(q)for hit in results:print(hit.highlights("content"))print("\n--------------我是神奇的分割线--------------\n")for t in analyzer("我的好朋友是李明;我爱北京天安门;IBM和Microsoft; I have a dream. this is intetesting and interested me a lot"):print(t.text)
水果世博园的结果为如下:
买<b class="match term0">水果</b>然后来<b class="match term1">世博园</b>--------------我是神奇的分割线--------------你的结果为如下:
second one <b class="match term0">你</b> 中文测试中文 is even more interesting--------------我是神奇的分割线--------------first的结果为如下:
<b class="match term0">first</b> document we’ve added--------------我是神奇的分割线--------------中文的结果为如下:
second one 你 <b class="match term0">中文</b>测试<b class="match term0">中文</b> is even more interesting--------------我是神奇的分割线--------------交换机的结果为如下:
干事每月经过下属科室都要亲口交代24口<b class="match term0">交换机</b>等技术性器件的安装工作--------------我是神奇的分割线--------------交换的结果为如下:
咱俩<b class="match term0">交换</b>一下吧
干事每月经过下属科室都要亲口交代24口<b class="match term0">交换</b>机等技术性器件的安装工作--------------我是神奇的分割线--------------我
好
朋友
是
李明
我
爱
北京
天安
天安门
ibm
microsoft
dream
intetest
interest
me
lot

命令行分词

  • 使用示例:python -m jieba news.txt > cut_result.txt

  • 命令行选项(翻译):

使用: python -m jieba [options] filename

结巴命令行界面。

固定参数:
filename 输入文件

可选参数:

  • -h, --help 显示此帮助信息并退出
  • -d [DELIM], --delimiter [DELIM]
    使用 DELIM 分隔词语,而不是用默认的’ / '。
    若不指定 DELIM,则使用一个空格分隔。
  • -p [DELIM], --pos [DELIM]
    启用词性标注;如果指定 DELIM,词语和词性之间
    用它分隔,否则用 _ 分隔
  • -D DICT, --dict DICT 使用 DICT 代替默认词典
  • -u USER_DICT, --user-dict USER_DICT
    使用 USER_DICT 作为附加词典,与默认词典或自定义词典配合使用
  • -a, --cut-all 全模式分词(不支持词性标注)
  • -n, --no-hmm 不使用隐含马尔可夫模型
  • -q, --quiet 不输出载入信息到 STDERR
  • -V, --version 显示版本信息并退出

如果没有指定文件名,则使用标准输入。

  • –help 选项输出:

$> python -m jieba --help
Jieba command line interface.

positional arguments:
filename input file

optional arguments:

  • -h, --help show this help message and exit
  • -d [DELIM], --delimiter [DELIM]
    use DELIM instead of ’ / ’ for word delimiter; or a
    space if it is used without DELIM
  • -p [DELIM], --pos [DELIM]
    enable POS tagging; if DELIM is specified, use DELIM
    instead of ‘_’ for POS delimiter
  • -D DICT, --dict DICT use DICT as dictionary
  • -u USER_DICT, --user-dict USER_DICT
    use USER_DICT together with the default dictionary or
    DICT (if specified)
  • -a, --cut-all full pattern cutting (ignored with POS tagging)
  • -n, --no-hmm don’t use the Hidden Markov Model
  • -q, --quiet don’t print loading messages to stderr
  • -V, --version show program’s version number and exit

If no filename specified, use STDIN instead.

小结

jieba分词可以满足大部分的中文分词和词性标注场景,可自己准备领域词典,提高分词准确性。
另,可搜索中科院提供的分词包,关注最新进展。

NLP自然语言处理 之 jieba中文处理相关推荐

  1. 【自然语言处理基础技能(NLP)】jieba中文文本处理

    1.基本分词函数与用法 # jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(un ...

  2. 用python进行自然语言处理_Python NLP自然语言处理之使用jieba进行中文分词实践

    自然语言处理的首要任务是分词,将一段文本分割成独立的词语. 中文分词介绍 已经归纳的三种分词如下: 规则分词.统计分词.混合分词规则分词: 通过设立人工词库,按照一定方式进行切分匹配. 正向最大匹配法 ...

  3. NLP-jieba中文处理 (一)

    jieba中文处理 和拉丁语系不同,亚洲语言是不用空格分开每个有意义的词的.而当我们进行自然语言处理的时候,大部分情况下,词汇是我们对句子和文章理解的基础,因此需要一个工具去把完整的文本中分解成粒度更 ...

  4. nlp自然语言处理_nlp满足可持续投资

    nlp自然语言处理 Sustainable Investing is a growing investment strategy that seeks strong financial returns ...

  5. NLP 自然语言处理实战

    前言 自然语言处理 ( Natural Language Processing, NLP) 是计算机科学领域与人工智能领域中的一个重要方向.它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和 ...

  6. NLP自然语言处理实例——实现机器自动生成商品的推荐标题和推荐语

    NLP自然语言处理实例--实现机器自动生成商品的推荐标题和推荐语 一.案例目的及实现 二.环境配置 1.安装库时遇到的问题 三.数据预处理 1.移除特殊符号 2.去除停用词 3.文本分词jiaba 四 ...

  7. 21- 朴素贝叶斯 (NLP自然语言算法) (算法)

    朴素贝叶斯要点 概率图模型算法往往应用于NLP自然语言处理领域. 根据文本内容判定 分类 . 概率密度公式:   高斯朴素贝叶斯算法: from sklearn.naive_bayes import ...

  8. jieba —— 中文分词工具 (一)

    jieba 中文分词工具包 (一) 01 简介 "结巴" 中文分词:做最好的 Python 中文分词组件: "Jieba" (Chinese for " ...

  9. 经验篇:朋友成功入职商汤自然语言处理算法工程师,整理了一份自然语言处理入门学习资料(NLP自然语言处理/学习路径)

    自然语言处理(Natural Language Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向.简单点说就是怎样让计算机能够理解人类的语言,以执行如机器翻译.文本分析.情 ...

  10. NLP自然语言处理-机器学习和自然语言处理介绍(一)

    "NLP自然语言处理-机器学习和自然语言处理介绍" 一.机器学习 1.什么是机器学习 从广义上来说,机器学习是一种能够赋予机器学习的能力以此让它完成直接编程无法完成的功能的方法.但 ...

最新文章

  1. 4月《程序员》上我讲HTML5的文章---激动人心的HTML5之美
  2. ASP.NET--Menu控件
  3. 笔录软件在linux系统,Linux下查看已安装软件
  4. JSP中的九个内置对象
  5. 芯片业遭双重打击:经济低迷技术难突破
  6. Java前台线程与后台线程
  7. mysql5.5表的创建源码_mysql5.5 源码安装
  8. 4修改初始值_Java基础语法 --4(连载)
  9. Spring JDBC模板惯用方式
  10. 脑波技术来袭,人类hold住吗?
  11. oracle优化查询前几条,一个查询优化的分析调整全过程!很值得一看
  12. 信号能量、功率、功率谱密度、自相关函数公式总结
  13. python3 读取.plist文件_在Python中解析plist文件
  14. 反编译so库破解so
  15. IVCam:电脑调用你的手机摄像头
  16. 面具root后如何解决SafetyNet不通过-SafetyNet API错误解决办法
  17. java native方法及JNI实例
  18. Possibly consider using a shorter maxLifetime value.问题处理
  19. android tools ignore,android tools属性引用
  20. 基于matlab语音增强,基于MATLAB的语音增强系统的设计

热门文章

  1. 2022年道路运输企业安全生产管理人员考试及道路运输企业安全生产管理人员新版试题
  2. K均值聚类算法以及模糊K均值算法研究,matlab
  3. 首推机器人视觉解决方案 百度AI开发者实战营成都站揭秘
  4. matlab 维纳滤波器算法实现
  5. Envi处理大气校正时报错,怎么解决呀
  6. iOS及Mac开源项目和学习资料【超级全面】
  7. DEDECMS5.7自动采集更新伪原创插件高级版GBK
  8. 在本地计算机无法启动iis,IIS常见错误及解决方法
  9. 写给准备看CCNA题库的朋友们 希望有些帮助
  10. ISO/IEC 27017:2015 标准信息安全策略