jieba源碼研讀筆記(十二) - 詞性標注(使用DAG有向無環圖+動態規劃)

jieba源碼研讀筆記(十二) - 詞性標注(使用DAG有向無環圖+動態規劃)

前言

在前篇中看到了POSTokenizer的詞性標注核心函數包括:__cut_DAG_NO_HMM__cut__cut_detail__cut_DAG

恰如其名,__cut_DAG_NO_HMM的功能是不使用HMM的詞性標注。
其它三個函數則會在使用HMM的模式中被使用。

本篇介紹的重點是不使用HMM的詞性標注。

__cut_DAG_NO_HMM

函數中用到的re_eng1己經於jieba源碼研讀筆記(四) - 正則表達式介紹過,它配對的是長度為1的英數字。

def __cut_DAG_NO_HMM(self, sentence):
    DAG = self.tokenizer.get_DAG(sentence)
    route = {}
    self.tokenizer.calc(sentence, DAG, route)
    x = 0
    N = len(sentence)
    buf = ''
    while x < N:
        y = route[x][1] + 1
        l_word = sentence[x:y]
        #re_eng1:長度為1的英數字
        if re_eng1.match(l_word):
            buf += l_word
            x = y
        else:
            if buf:
                #buf裡只有與re_eng1配對的字
                #所以這裡可以將它的詞性設為英文
                yield pair(buf, 'eng')
                buf = ''
            #如果字典裡沒有l_word,就把它的詞性當成'x'(未知)
            yield pair(l_word, self.word_tag_tab.get(l_word, 'x'))
            x = y
    if buf:
        #buf裡只有與re_eng1配對的字
        #所以這裡可以將它的詞性設為英文
        yield pair(buf, 'eng')
        buf = ''

此處代碼與jieba/__init__.py裡的__cut_DAG_NO_HMM雷同,可以參考jieba源碼研讀筆記(六) - 分詞之精確模式(使用動態規劃)
不同之處僅在於:

  1. self.get_DAGself.calc變成self.tokenizer.get_DAGself.tokenizer.calc
  2. if re_eng.match(l_word) and len(l_word) == 1:被改成了if re_eng1.match(l_word)
  3. yield的東西由一個詞彙變成一個pair

可以從上面的代碼中看出,__cut_DAG_NO_HMM是以匹配正則表達式re_eng1及查找字典self.word_tag_tab並用的方式來標注詞性。

測試:

import jieba.posseg as pseg
for w in pseg._lcut_internal_no_hmm("小明的英文名字是Ming"):
    print(w)
"""
小/a        #形容詞
明/a        #形容詞
的/uj       #結構助詞: 的
英文名字/n   #名詞
是/v        #動詞
Ming/eng    #外語
"""

以上詞性解釋參考自彙整中文與英文的詞性標註代號:結巴斷詞器與FastTag / Identify the Part of Speech in Chinese and English

參考連結

jieba源碼研讀筆記(四) - 正則表達式
jieba源碼研讀筆記(六) - 分詞之精確模式(使用動態規劃)
彙整中文與英文的詞性標註代號:結巴斷詞器與FastTag / Identify the Part of Speech in Chinese and English

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值