NLP基础笔记1——中文分词技术
一、簡介
中文分詞(Chinese Word Segmentation) 指的是將一個漢字序列切分成一個一個單獨的詞。分詞就是將連續(xù)的字序列按照一定的規(guī)范重新組合成詞序列的過程。
中文分詞是其他中文 (信息) 處理的基礎,搜索引擎、機器翻譯(MT)、語音合成、自動分類、自動摘要、自動校對等等,都需要用到分詞。
目前主流分詞方法:基于規(guī)則,基于統(tǒng)計以及二者混合。
基于規(guī)則的分詞:主要是人工建立詞庫也叫做詞典,通過詞典匹配的方式對句子進行劃分。其實現(xiàn)簡單高效,但是對未登陸詞很難進行處理。主要有正向最大匹配法FMM,逆向最大匹配法RMM以及雙向最大匹配法Bi-MM。
def FMM_func(user_dict, sentence):"""正向最大匹配(FMM):param user_dict: 詞典:param sentence: 句子"""# 詞典中最長詞長度max_len = max([len(item) for item in user_dict])start = 0while start != len(sentence):index = start+max_lenif index>len(sentence):index = len(sentence)for i in range(max_len):if (sentence[start:index] in user_dict) or (len(sentence[start:index])==1):print(sentence[start:index], end='/')start = indexbreakindex += -1 def BMM_func(user_dict, sentence):"""反向最大匹配(BMM):param user_dict:詞典:param sentence:句子"""# 詞典中最長詞長度max_len = max([len(item) for item in user_dict])result = []start = len(sentence)while start != 0:index = start - max_lenif index < 0:index = 0for i in range(max_len):if (sentence[index:start] in user_dict) or (len(sentence[start:index])==1):result.append(sentence[index:start])start = indexbreakindex += 1for i in result[::-1]:print(i, end='/')? 雙向最大匹配法:FMM和BMM兩種算法都分詞一遍,然后根據(jù)大顆粒度詞越多越好,非詞典詞和單字詞越少越好的原則,選取其中一種分詞結果輸出。
如:“我們在野生動物園玩”
正向最大匹配法,最終分詞結果為:“我們/在野/生動/物/園/玩”,其中,總分詞數(shù)6個,單字詞為3。
逆向最大匹配法,最終分詞結果為:“我們/在/野生動物園/玩”,其中,總分詞數(shù)4個,單字詞為2。
選擇標準:
因此最終輸出為逆向結果。
https://zhuanlan.zhihu.com/p/103392455
二、Jieba
中文分詞有很多種,常見的比如有中科院計算所 NLPIR、哈工大 LTP、清華大學 THULAC 、斯坦福分詞器、Hanlp 分詞器、jieba 分詞、IKAnalyzer 等。
官方:?https://github.com/fxsjy/jieba
1、分詞
三種分詞算法
- 基于統(tǒng)計詞典,構造前綴詞典,基于前綴詞典對句子進行切分,得到所有切分可能,根據(jù)切分位置,構造一個有向無環(huán)圖(DAG);
- 基于DAG圖,采用動態(tài)規(guī)劃計算最大概率路徑(最有可能的分詞結果),根據(jù)最大概率路徑分詞;
- 對于新詞(詞庫中沒有的詞),采用有漢字成詞能力的 HMM 模型進行切分。
支持三種分詞模式:
- 精確模式,試圖將句子最精確地切開,適合文本分析;
- 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
- 搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
用 lcut 生成 list
jieba.cut 以及?jieba.cut_for_search?返回的結構都是一個可迭代的 Generator,可以使用 for 循環(huán)來獲得分詞后得到的每一個詞語(Unicode)。jieba.lcut 對 cut 的結果做了封裝,l 代表 list,即返回的結果是一個 list 集合。同樣的,用?jieba.lcut_for_search?也直接返回 list 集合。
2、載入字典
自定義添加詞到字典
- jieba.add_word("深享網(wǎng)")
- jieba.load_userdict('user_dict.txt')
3、關鍵詞提取
- 基于TF-IDF
- 基于TextRank
4、詞性標注
jieba 可以很方便地獲取中文詞性,通過 jieba.posseg 模塊實現(xiàn)詞性標注。
import jieba.posseg as psg content = "現(xiàn)如今,機器學習和深度學習帶動人工智能飛速的發(fā)展,并在圖片處理、語音識別領域取得巨大成功。" print([(x.word,x.flag) for x in psg.lcut(content)]) [('現(xiàn)如今', 't'), (',', 'x'), ('機器', 'n'), ('學習', 'v'), ('和', 'c'), ('深度', 'ns'), ('學習', 'v'), ('帶動', 'v'), ('人工智能', 'n'), ('飛速', 'n'), ('的', 'uj'), ('發(fā)展', 'vn'), (',', 'x'), ('并', 'c'), ('在', 'p'), ('圖片', 'n'), ('處理', 'v'), ('、', 'x'), ('語音', 'n'), ('識別', 'v'), ('領域', 'n'), ('取得', 'v'), ('巨大成功', 'nr'), ('。', 'x')]三、準確分詞方法(以jieba、hanlp為例)
1加載自定義字典
當分詞工具分詞不準確時,需要加載自定義詞典!
正則表達式常用函數(shù)
①re.sub用于替換字符串中的匹配項
②compile 函數(shù):用于編譯正則表達式,生成一個正則表達式( Pattern )對象
③findall 函數(shù):在字符串中找到正則表達式所匹配的所有子串,并返回一個列表,如果沒有找到匹配的,則返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
④split 函數(shù):按照能夠匹配的子串將字符串分割后返回列表
?Python正則表達式
2動態(tài)調(diào)整詞頻和字典順序
當分詞字典的詞沖突,相互影響時,需要調(diào)整詞頻和字典順序!
①假設字典中定義的詞也可能被切開,此時需要調(diào)用jieba.suggest_freq函數(shù)
? ? ? 例如“臺中”,字典中定義了依然會分為“臺”,“中”
②使用hanlp時,需要用sort_dict_by_lenth.py來排序字典,不然會沖突
? ? ? 比如字典中有“數(shù)據(jù)挖掘算法工程師”和“數(shù)據(jù)挖掘”兩個,排序后就可以最長字符串匹配
③拓展:?基于詞典的中文分詞
總結
以上是生活随笔為你收集整理的NLP基础笔记1——中文分词技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 滴滴出行 DoKit 2.0 - 泛前端
- 下一篇: java timertask 销毁_ja