jieba 的Tokenizer分词器
2021SC@SDUSC
一、gen_pfdict函数
在初始化的过程中,会构建前缀词典。构建前缀词典的入口函数是gen_pfdict(self, f),解析离线统计词典文本文件,每一行分别对应着词、词频、词性,将词和词频提取出来,以词为key,以词频为value,加入到前缀词典中。对于每个词,再分别获取它的前缀词,如果前缀词已经存在于前缀词典中,则不处理;如果该前缀词不在前缀词典中,则将其词频置为0,便于后续构建有向无环图。
def gen_pfdict(f):lfreq = {}ltotal = 0f_name = resolve_filename(f)for lineno, line in enumerate(f, 1):try:line = line.strip().decode('utf-8')word, freq = line.split(' ')[:2]freq = int(freq)lfreq[word] = freqltotal += freqfor ch in xrange(len(word)):wfrag = word[:ch + 1]if wfrag not in lfreq:lfreq[wfrag] = 0except ValueError:raise ValueError('invalid dictionary entry in %s at Line %s: %s' % (f_name, lineno, line))f.close()return lfreq, ltotal
为什么jieba没有使用trie树作为前缀词典存储的数据结构?
参考jieba中的issue–不用Trie,减少内存加快速度;优化代码细节 #187,本处直接引用该issue的comment,如下,
对于get_DAG()函数来说,用Trie数据结构,特别是在Python环境,内存使用量过大。
二、initialize函数
如果cache缓存中存在词库,就不会进入initialize。
利用get_DAG(sentence)函数获得待切分句子的DAG,首先检测(check_initialized)进程是否已经加载词库,若未初始化词库则调用Tolenizer中的initialize函数进行初始化,initialize中判断有无已经缓存的前缀词典cache_file文件,若有相应的cache文件则直接使用 marshal.load 方法加载前缀词典,若无则通过gen_pfdict对指定的词库dict.txt进行计算生成前缀词典,到jieba进程的初始化工作完成后就调用get_DAG获得句子的DAG;
def initialize(self, dictionary=None):default_logger.debug("Building prefix dict from %s ..." % (abs_path or 'the default dictionary'))t1 = time.time()if self.cache_file:cache_file = self.cache_file# default dictionaryelif abs_path == DEFAULT_DICT:cache_file = "jieba.cache"# custom dictionaryelse:cache_file = "jieba.u%s.cache" % md5(abs_path.encode('utf-8', 'replace')).hexdigest()cache_file = os.path.join(self.tmp_dir or tempfile.gettempdir(), cache_file)# prevent absolute path in self.cache_filetmpdir = os.path.dirname(cache_file)load_from_cache_fail = Trueif os.path.isfile(cache_file) and (abs_path == DEFAULT_DICT oros.path.getmtime(cache_file) > os.path.getmtime(abs_path)):default_logger.debug("Loading model from cache %s" % cache_file)try:with open(cache_file, 'rb') as cf:self.FREQ, self.total = marshal.load(cf)load_from_cache_fail = Falseexcept Exception:load_from_cache_fail = Trueself.initialized = Truedefault_logger.debug("Loading model cost %.3f seconds." % (time.time() - t1))default_logger.debug("Prefix dict has been built successfully.")
三、中文分词器
class ChineseTokenizer(Tokenizer):def __call__(self, text, **kargs):words = jieba.tokenize(text, mode="search")token = Token()for (w, start_pos, stop_pos) in words:if not accepted_chars.match(w) and len(w) <= 1:continuetoken.original = token.text = wtoken.pos = start_postoken.startchar = start_postoken.endchar = stop_posyield token
jieba 的Tokenizer分词器相关推荐
- Pytorch transformers tokenizer 分词器词汇表添加新的词语和embedding
目标: 在NLP领域,基于公开语料的预训练模型,在专业领域迁移时,会遇到专业领域词汇不在词汇表的问题,本文介绍如何添加专有名词到预训练模型. 例如,在bert预训练模型中,并不包含财经词汇,比如'市盈 ...
- Keras的Tokenizer分词器
Tokenizer类 keras.preprocessing.text.Tokenizer(num_words=None, filters='!"#$%&()*+,-./:;< ...
- ElasticSearch之Tokenizer 分词器
java学习讨论群:725562382 Tokenizer Standard Tokenizer curl -X POST "192.168.0.120:9200/_analyze" ...
- 基于Python的中英文分词基础:正则表达式和jieba分词器
基于Python的中英文分词基础:正则表达式和jieba分词器 前言介绍 英文字符串处理 Python中的str 正则表达式 Python中的正则表达式模块 re 小练习 字符串中出现频次最多的字母 ...
- Python第三方库jieba(中文分词)入门与进阶(官方文档)
jieba "结巴"中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点 支持三种分词模式: 精确模式, ...
- es过滤html标签,Elasticsearch 分词器
在全文搜索(Fulltext Search)中,词(Term)是一个搜索单元,表示文本中的一个词,标记(Token)表示在文本字段中出现的词,由词的文本.在原始文本中的开始和结束偏移量.以及数据类型等 ...
- ElasticSearch03_Mapping字段映射、常用类型、数据迁移、ik分词器、自定义分词器
文章目录 ①. Mapping字段映射概述 ②. 常用类型如下 - text.keyword ③. 映射中对时间类型详解 ④. ES的keyword的属性ignore_above ⑤. 映射的查看.创 ...
- 商城项目18_esMapping字段映射、常用类型、数据迁移、ik分词器、自定义分词器
文章目录 ①. Mapping字段映射概述 ②. 常用类型如下 - text.keyword ③. 映射中对时间类型详解 ④. ES的keyword的属性ignore_above ⑤. 映射的查看.创 ...
- 【ES实战】ES分词器介绍
文章目录 ES分词器介绍 什么是分词器 分词器的组成 Character filters Tokenizers Token filters 分词的过程 写入时分词 搜索时分词 测试分词效果 分词器的分 ...
最新文章
- 1032 Sharing
- Android内容提供程序
- vue 打印出git提交信息_VUE项目构建打包生成Git信息(VERSION和COMMITHASH文件)
- 通过python来实现“语象观察“自动化进阶版
- 使用python生成文字视频
- 经纬恒润荣获海克斯康“最佳业绩奖”
- Business English-Unit 4 Memos -A
- 利用ChatGPT学习生物信息数据分析
- 学姐说 | 大学生如何自学短视频剪辑配音制作?
- word转pdf(docx4j)
- 敏捷开发,持续集成/交付/部署, DevOps总结
- 机器学习系列:误差分析(Bias and Variance)和模型调优
- Python爬虫-DAY5淘宝页面爬取
- 百度云的高速下载技巧系列2---多线程文件下载工具idm v6.28.1绿色免注册版(PC)
- 案例分享|方形锂电池铝壳外观缺陷检测
- 驭电之道-用示波器测量电阻的伏安特性曲线 模电实验 示波器 波形
- Python实现深度优先遍历和广度优先遍历
- android mm 版本,多项新功能 傲游MM 2.1Android版本发布
- 腾讯如何做 Code Review的?万字详解!
- Shell 编程入门步步高