博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结巴分词-深入
阅读量:6882 次
发布时间:2019-06-27

本文共 1130 字,大约阅读时间需要 3 分钟。

hot3.png

- 代码(jieba-master)
     - 结构
          jieba/
                    analyse/
                    finalseg/
                         __init__.py
                              cut() 提供DAG的cut操作实现
                    posseg
                         Viterbi.py
                              - 新词发现
                                   - HMM模型的Viterbi算法
                   __init__.py
              
            
- 基本所有逻辑都在这里实现
                               - 解析算法
                                    - trie:基础
                                    - DAG:用于词图扫描
                    dict.txt
                         - trie的基础字典,作者收集大量语料分析得到
     - 运行方式
          - jieba/__init__.py

* 通过trie和DAG提供长度>2的分词效果

* 通过Viterbi提供对新词的二分词

====================================================
结巴中的trie实现是字典,见代码
def gen_trie(f_name):
     lfreq = {}
     trie = {}
     ltotal = 0.0
     content = open(f_name,'rb').read().decode('utf-8')
     for line in content.split("\n"):
          word,freq,_ = line.split(" ")
          freq = float(freq)
          lfreq[word] = freq
          ltotal+=freq
          p = trie
          for c in word:
               if not c in p:
                    p[c] ={}
               p = p[c]
          p['']='' #ending flag
     return trie, lfreq,ltotal
其中
trie是一个根据dict.txt生成的前缀树(dict.txt是中文字典,自然生成的trie树也是中文前缀),末端的叶子以空字符串做标记
     注:将dict.txt取几行出来,执行一次gen_trie()就得到形象的结果
lfreq对应trie树,记录整个词的频率评分
ltotal所有频率评分总和
trie树以空间换时间,通过存储字符串的公共前缀来减少查询开销
因此
1.插入、查询都为O(N)
2.内存消耗大26^n
3.对公共前缀重合度小的输入集,trie的效率显得不那么高
优化
1.通过Double Array实现,能大量减少内存使用
====================================================
__init__.py 中的cut(),结巴分词的入口
根据入参选择 trie 或 DAG(默认)
分词过程中都用了 yield 生成器

转载于:https://my.oschina.net/kakablue/blog/181537

你可能感兴趣的文章
关于分销平台
查看>>
剑指offer---12-**--数值的整数次方
查看>>
PAT - L2-010. 排座位(并查集)
查看>>
HDU - 5269【SBBBBBB Trie】
查看>>
sql server 日志文件结构及误操作数据找回
查看>>
JUnit 3一个例子就懂
查看>>
Mongodb相关 (Shell命令 / mongoose)
查看>>
Web API的Log问题
查看>>
leetcode Second Highest Salary
查看>>
【LeetCode每天一题】Word Break()
查看>>
关于centerOS下修改网络连接
查看>>
牛客暑假多校第二场 K carpet
查看>>
Linux下chkconfig命令详解(转)
查看>>
EF中,保存实体报错:Validation failed for one or more entities. 如何知道具体错误在哪?...
查看>>
和积式
查看>>
你不能错过.net 并发解决方案
查看>>
[PHP] 超全局变量$_FILES上传文件
查看>>
linux如何添加telnet服务
查看>>
解决Windows对JDK默认版本切换问题
查看>>
HTML5本地存储localStorage与seesionStorage
查看>>