采集内容插入词库(分词特点支持四种分:jieba分词特点)

优采云 发布时间: 2022-01-13 22:03

  采集内容插入词库(分词特点支持四种分:jieba分词特点)

  jieba分词功能支持四种分词模式: jieba分词安装自动安装:

  pip install jieba(window环境) pip3 install jieba(Linux环境)

  *敏*感*词*安装:

  首先下载并解压运行python setup.py install

  手动安装:

  把jieba目录放到当前目录或者site-packages目录下

  导入jieba引用

  如果需要在paddle模式下使用分词和词性标注功能,请先安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。

  主要功能分词1、基本步骤

  初始化

  初始化时,首先加载字典文件dict.txt,遍历每一行,生成word-word count和总词数的key-value对,并将生成的结果保存到缓存中,然后直接从下次缓存。

  初始化可以简单理解为读取字典文件,构造一个词-词号键值对,方便后面的步骤查找字典,即字符串匹配。

  拆分短语

  首先将语句转换为 UTF-8 或 GBK。然后根据用户指定的模式设置剪切模式,是否使用全模式,是否使用HMM隐马尔可夫。然后按照正则,将输入的文本分成句子。最后遍历句子,分别对每个句子进行切分。

  构建 DAG

  查看构建 DAG 的过程。

  首先遍历切分的词组,对这些词组进行分词。

  第一步是构建短语的有向无环图 DAG。在搜索字典进行字符串匹配的过程中,可能有几种可能的切分方式,这些组合形成一个有向无环图,如下图所示:

  得到句子的有向无环图DAG,它记录了一个单词的开始位置和它可能的结束位置。开始位置用作键,结束位置是列表。

  上述语句的完整 DAG 为:{ 0: [1, 2], 1: [2], 2: [3, 4, 5], 3: [4], 4: [5] } 例如, DAG表达式在位置0是{0: [1, 2]},也就是说当0位置是单词的开始位置时,1和2位置可能是单词的结束位置。

  动态规划构建一个Route,并计算从句尾到句首,从DAG中的每个节点到句尾的最大路径概率,以及当该节点对应的词的结束位置时概率最大。

  def calc(self, sentence, DAG, route):

N = len(sentence)

route[N] = (0, 0)

logtotal = log(self.total)

for idx in xrange(N - 1, -1, -1):

# route[idx] = (该汉字到最后一个汉字的最大路径概率,

# 最大路径概率时该汉字对应的词语结束位置).

# 遍历DAG中该汉字节点的结束位置,也就是DAG[idx],

# 计算idx到x之间构成的词语的概率,然后乘以x到语句结束位置的最大概率,

# 即可得到idx到语句结束的路径最大概率.

route[idx] = max(

(log(self.FREQ.get(sentence[idx:x + 1]) or 1)

- log(total)

+ route[x + 1][0]

, x) for x in DAG[idx])

# 每个词的概率 = 字典中该词的词数 / 字典总词数。

  上图构造每个节点的最大路径概率的过程如下:

  p(5)= 1, p(4)= max(p(5) * p(4->5)), p(3)= max( p(4) * p(3->4)),p(2)= max(p(3) * p(2->3), p (4) * p(2->4), p(5) * p(2->5))),对于节点2,他有2->3, 2 ->4, 2->4 三个路径,我们取概率最高的路径作为节点2的路径概率,注意概率最高时节点2的结束位置。p(1) =最大值(p(2) * p(1->2)) p(0) = max(p(1) * p(0->1), p(2)@ > * p(0->2))

  遍历每个节点的Route,组装单词组合。

  如果该词不在字典中,即是一个新词,则使用 HMM 隐马尔可夫模型进行切分。

  按产量一个一个地返回单词。

  2、基本方法

  待分割的字符串可以是unicode或UTF-8字符串、GBK字符串。注意:不建议直接输入 GBK 字符串,因为它可能会被解码为 UTF-8 不正确且无法预料。

  jieba.cut(sentence,

cut_all=False,

HMM=True,

use_paddle=False)

  sentence:需要分词的字符串 cut_all:用于控制是否使用full模式 HMM:用于控制是否使用HMM模型 use_paddle:用于控制是否在paddle模式下使用分词模式,paddle模式采用懒加载方式,通过enable_paddle 接口

   jieba.cut_for_search(sentence, HMM=True)

  该方法适用于搜索引擎的分词构建倒排索引,粒度比较细。句子:分词字符串 HMM:使用HMM模型

  jieba.cut和jieba.cut_for_search返回的结构是一个可迭代的*敏*感*词*,可以使用for循环获取分词后得到的每个单词(unicode)

  jieba.lcut 和 jieba.lcut_for_search 直接返回列表

  jieba.Tokenizer(dictionary=DEFAULT_DICT) 创建一个新的自定义分词器,可用于同时使用不同的字典。jieba.dt 是默认的分词器,所有全局分词相关的函数都是这个分词器的映射。

  代码示例:

  # encoding=utf-8

import jieba

jieba.enable_paddle()# 启动paddle模式。

strs=["我关注了数据STUDIO","我是数据分析师","四川大学"]

for str in strs:

seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式

print("Paddle Mode: " + '/'.join(list(seg_list)))

seg_list = jieba.cut("我毕业于四川大学,我关注了数据STUDIO", cut_all=True)

print("Full Mode: " + "/ ".join(seg_list)) # 全模式

seg_list = jieba.cut("我毕业于四川大学,我关注了数据STUDIO", cut_all=False)

print("Default Mode: " + "/ ".join(seg_list)) # 精确模式

seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式

print(", ".join(seg_list))

seg_list = jieba.cut_for_search("我是云朵君,我关注了数据STUDIO") # 搜索引擎模式

print(", ".join(seg_list))

  Paddle 启用成功...Paddle Mode: I/Follow/Lead/Data/STUDIOPaddle Mode: I/Yes/Data/Analyst Paddle Mode: 四川大学Full Mode: I/Graduate/ Yu/Sichuan/Sichuan University/ University/ ,/ I /关注/数据/STUDIO默认模式:我/毕业/于/川大/,/我/关注/关注/数据/STUDIO他,来了,来了,网易,航研,I楼,是,云朵,君,,,我, 关注, 数据, STUDIO

  添加自定义字典1、原字典

  字典是基于字符串匹配的分词算法的关键,它决定了最终分词的准确性。jieba字典dict.txt是jieba采集的作者用超*敏*感*词*语料数据获得的。有5M,收录349,046个字。每行对应一个词,包括词号和词性三个部分。

  2、加载字典

  开发人员可以指定自己的自定义词典来收录 jieba 词库中没有的词。虽然jieba有识别生词的能力,但是自己添加生词可以保证更高的准确率。

   jieba.load_userdict(file_name)

  字典格式同dict.txt,一个词占一行;每行分为三个部分:单词、词频(可省略)、词性(可省略)、空格分隔,顺序不能颠倒。

  file_name 是类文件对象或自定义字典的路径。如果是以路径或二进制方式打开的文件,则该文件必须采用 UTF-8 编码。

  省略词频时,自动计算的词频可以保证词的分离。

  例如:

  创新办 3 i

云计算 5

凱特琳 nz

台中

  更改标记器(默认为 jieba.dt)的 tmp_dir 和 cache_file 属性,以分别为受限文件系统指定缓存文件所在的文件夹及其文件名。

  代码示例:

  #encoding=utf-8

import sys

sys.path.append("../")

import jieba

import jieba.posseg as pseg

test_sent = (

"李小福是创新办主任也是云计算方面的专家; 什么是八一双鹿\n"

"例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类\n"

"「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"

)

words = jieba.cut(test_sent)

print("使用默认词库:\n {}".format('/'.join(words)))

print("="*40)

jieba.load_userdict("userdict.txt")

"""

userdict.txt

云计算 5

李小福 2 nr

创新办 3 i

pip_install 3 eng

好用 300

韩玉赏鉴 3 nz

八一双鹿 3 nz

台中

凱特琳 nz

Edu Trust认证 2000

"""

jieba.add_word('石墨烯')

jieba.add_word('凱特琳')

jieba.del_word('自定义词')

words = jieba.cut(test_sent)

print("加载自定义词库后: \n{}".format('/'.join(words)))

print("="*40)

# 带有词性的分词

result = pseg.cut(test_sent)

for w in result:

print(w.word, "/", w.flag, ", ", end=' ')

print("\n" + "="*40)

terms = jieba.cut('pip_install is great')

print('/'.join(terms))

terms = jieba.cut('python 的正则表达式是好用的')

print('/'.join(terms))

print("="*40)

  使用默认词库:Li Xiaofu/Yes/Innovation/Office/Director/Also/Yes/Cloud/Computing/Aspect/The/Expert/加载自定义词库后:Li Xiaofu/Yes/Innovation Office/Director/Also/is/云计算 / 方面 / 的 / 专家 /

  3、调整字典

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

  使用 get_FREQ(word) 统计当前单词的词频。

  使用Suggest_freq(segment, tune=True) 调整单个词的词频,使它们可以(或不能)分开。

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

  代码示例:

  # test frequency tune

testlist = [

('今天天气不错', ('今天', '天气')),

('如果放到post中将出错。', ('中', '将')),

('我们中出了一个叛徒', ('中', '出')),

]

for sent, seg in testlist:

print('/'.join(jieba.cut(sent, HMM=False)))

word = ''.join(seg)

print('%s Before: %s, After: %s' % (word, jieba.get_FREQ(word), jieba.suggest_freq(seg, True)))

print('/'.join(jieba.cut(sent, HMM=False)))

print("-"*40)

  今天的天气/好今天的天气之前:3,之后:0今天/天气/好如果/放入/post/中将/错误/中将之前:763,之后:494如果/放入/post/zhong/will/error/ . We/mid/out/out/a/traitor Creampie Before: 3, After: 3we/mid/out/out/a/traitor

  通过用户定义的字典增强歧义校正能力 [2]

  参考

  [1]

  jieba的分词:

  [2]

  用户自定义字典:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线