NLP jieba分词源码解析
生活随笔
收集整理的這篇文章主要介紹了
NLP jieba分词源码解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目的
分析jieba如何從句子中拆分詞的
預備知識
jieba api
jieba提供三種分詞方式
if cut_all: # 123cut_block = self.__cut_allelif HMM: # 123cut_block = self.__cut_DAGelse: # 123cut_block = self.__cut_DAG_NO_HMM流程
圖的原理
圖是如何建立的
只有在詞頻表里的詞才會記錄下來,儲存上對應的index作為圖
def get_DAG(self, sentence):self.check_initialized() # 初始化一下DAG = {} # 圖其實就是一個dict[int, list[int]]N = len(sentence)for k in xrange(N):tmplist = [] # 用來存儲是詞的索引i = kfrag = sentence[k]while i < N and frag in self.FREQ:if self.FREQ[frag]: # FREQ是一個dict[str, int],這個是提前load進來的詞頻表,可以根據自己的需求更改tmplist.append(i)i += 1frag = sentence[k:i + 1]if not tmplist:tmplist.append(k)DAG[k] = tmplistreturn DAG第一種分詞邏輯,直接遍歷出詞
def __cut_all(self, sentence):dag = self.get_DAG(sentence)old_j = -1eng_scan = 0eng_buf = u''for k, L in iteritems(dag):if eng_scan == 1 and not re_eng.match(sentence[k]):eng_scan = 0yield eng_bufif len(L) == 1 and k > old_j:word = sentence[k:L[0] + 1]if re_eng.match(word):if eng_scan == 0:eng_scan = 1eng_buf = wordelse:eng_buf += wordif eng_scan == 0:yield wordold_j = L[0]else:for j in L:if j > k:yield sentence[k:j + 1]old_j = jif eng_scan == 1:yield eng_buf第二種HMM
route
def calc(self, sentence, DAG, route): # route是一個dict[int, tuple[int, int]],是索引所對應的N = len(sentence)route[N] = (0, 0)logtotal = log(self.total)for idx in xrange(N - 1, -1, -1):route[idx] = max((log(self.FREQ.get(sentence[idx:x + 1]) or 1) -logtotal + route[x + 1][0], x) for x in DAG[idx])ref
jieba分詞流程之DAG、Route
總結
以上是生活随笔為你收集整理的NLP jieba分词源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rnn 梯度消失爆炸
- 下一篇: NLP hanlp分词源码解析