Day3-中文分词技术(常用分词技术介绍)
1:分詞技術(shù)
1.1:規(guī)則分詞
基于規(guī)則的分詞是一種機(jī)械分詞的方法,主要是通過(guò)維護(hù)詞典,在切分語(yǔ)句時(shí),將語(yǔ)句的每個(gè)字符串與詞表中的詞進(jìn)行逐一匹配,找到則切分,否則不切分。
1.1.1 正向最大匹配法
正向最大匹配法(Maximum Match Method,MM法)的基本思想:假定分詞詞典中的最長(zhǎng)詞有i個(gè)漢字字符,則用被處理文檔的當(dāng)前子串中的前i個(gè)字作為匹配字段,查找字典。如果字典中存在這樣的一個(gè)i字詞,則匹配成功,匹配字段被作為一個(gè)詞切分出來(lái)。如果詞典中找不到這樣的一個(gè)i字詞,則匹配失敗,將匹配字段中的最后一個(gè)字去掉,對(duì)剩下的字串重新進(jìn)行匹配處理。如此進(jìn)行下去,直到匹配成功,即切分出一個(gè)詞或剩余字串的長(zhǎng)度為0為止。這樣就完成了一輪匹配,然后取下一個(gè)i字字串進(jìn)行匹配處理,直到文檔被掃描完為止。
算法描述:
1:從左向右取待切分漢語(yǔ)句的m個(gè)字符作為匹配字段,m為機(jī)器詞典中最長(zhǎng)詞條的字符數(shù)。
2:查找機(jī)器詞典并進(jìn)行匹配。若匹配成功,則將這個(gè)匹配字段作為一個(gè)詞切分出來(lái)。若匹配不成功,則將這個(gè)匹配字段的最后一個(gè)字去掉,剩下的字符串作為新的匹配字段,進(jìn)行再次匹配,重復(fù)以上過(guò)程明知道切分出所有詞為止。
例如:
現(xiàn)在有個(gè)詞典,最長(zhǎng)詞的長(zhǎng)度是5,詞典中有“南京市長(zhǎng)”和“長(zhǎng)江大橋”兩個(gè)詞。
現(xiàn)對(duì)“南京市長(zhǎng)江大橋”
正向最大匹配法結(jié)果:“南京市長(zhǎng)”,“江”,“大橋”
示例代碼:
class MM(object):def __init__(self):self.window_size = 3def cut(self, text):result = []index = 0text_length = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源', '牛皮', '厲害', '學(xué)習(xí)', '嘔吼']while text_length > index:for size in range(self.window_size + index, index, -1): # 4,0,-1piece = text[index:size]if piece in dic:index = size - 1breakindex = index + 1result.append(piece + '----')print(result)if __name__ == '__main__':text = '研究生命的起源真牛皮車(chē)呀'tokenizer = MM()print(tokenizer.cut(text))輸出結(jié)果:
['研究生----', '命----', '的----', '起源----', '真----', '牛皮----', '車(chē)----', '呀----']如此可看結(jié)果并不能讓人很滿(mǎn)意。
1.1.2 逆向最大匹配法
逆向最大匹配法(Reverse Maximum Match Method,RMM法)原理:基本原理與MM法相同,不同的是分詞切分的方向與MM法相反。
現(xiàn)對(duì)“南京市長(zhǎng)江大橋”進(jìn)行逆向最大匹配法,結(jié)果:“南京市”,“長(zhǎng)江大橋”。
這樣的結(jié)果看似是對(duì)的,但是如果是 南京的市長(zhǎng) 姓名是 "江大橋" 呢?這樣分詞 還是不對(duì)的。
示例代碼:
class RMM(object):def __init__(self):self.window_size = 3def cut(self, text):result = []index = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源', '牛皮', '厲害', '學(xué)習(xí)', '嘔吼']while index > 0:for size in range(index - self.window_size, index):piece = text[size:index]if piece in dic:index = size + 1breakindex = index - 1result.append(piece + '----')result.reverse()print(result)if __name__ == '__main__':text = '研究生命的起源真牛皮車(chē)呀'tokenizer = RMM()print(tokenizer.cut(text))輸出:
['研究----', '生命----', '的----', '起源----', '真----', '牛皮----', '車(chē)----', '呀----']這樣的話(huà),輸出結(jié)果就靠譜了點(diǎn)。
1.1.3 雙向最大匹配法
雙向最大匹配法(Bi-directction Matching method)是將正向最大匹配法得到的分詞結(jié)果和逆向最大匹配法得到的結(jié)果進(jìn)行比較,然后按照最大匹配原則,選取次數(shù)切分最少的作為結(jié)果。
例如:還是 “南京市長(zhǎng)江大橋”,
正向結(jié)果:“南京市長(zhǎng)”,“江”,“大”,“橋”
逆向結(jié)果:南京市,長(zhǎng)江大橋。
示例代碼:
class MM():def __init__(self):self.window_size = 3def cut(self, text):result = []index = 0text_length = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源']while text_length > index:for size in range(self.window_size + index, index, -1):piece = text[index:size]if piece in dic:index = size - 1breakindex = index + 1result.append(piece + '----')return (result)class RMM():def __init__(self):self.window_size = 3def cut(self, text):result = []index = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源']while index > 0:for size in range(index - self.window_size, index):piece = text[size:index]if piece in dic:index = size + 1breakindex = index - 1result.append(piece + '----')result.reverse()return (result)if __name__ == '__main__':text = '研究生命的起源'count1 = count2 = 0First = MM()Second = RMM()# result1 和 result2 分別是正向和逆向切詞結(jié)果result1 = First.cut(text)result2 = Second.cut(text)# 如果兩個(gè)結(jié)果一樣,隨便返回一個(gè)if result1 == result2:print(result1)else:# 獲取 兩個(gè)結(jié)果的長(zhǎng)度# len() 方法返回對(duì)象(字符、列表、元組等)長(zhǎng)度或項(xiàng)目個(gè)數(shù)。a = len(result1)b = len(result2)# 如果相同 循環(huán)兩個(gè)數(shù)組 并比較 單詞數(shù)量# 因?yàn)榉祷氐姆衷~都有后綴 '----',所以比較時(shí)==5if a == b:for A in result1:if len(A) == 5:count1 = count1 + 1for B in result2:if len(B) == 5:count2 = count2 + 1if count1 > count2:print(result2)else:print(result1)elif a > b:print(result2)elif a < b:print(result1)結(jié)果:
['研究----', '生命----', '的----', '起源----']1.2:統(tǒng)計(jì)分詞
簡(jiǎn)介:
把每個(gè)詞看做是由詞的最小單位的各個(gè)字組成,如果相連的字在不同的文本中出現(xiàn)的次數(shù)越多,就證明這相連的字很有可能就是一個(gè)詞。
利用字與字相鄰出現(xiàn)的頻率來(lái)反應(yīng)成詞的可靠度,統(tǒng)計(jì)語(yǔ)料中相鄰垂涎的各個(gè)字的組合的頻度,當(dāng)這個(gè)組合達(dá)到某個(gè)臨界值時(shí),就認(rèn)為這個(gè)詞組是可以構(gòu)成一個(gè)詞語(yǔ)。
主要步驟:
1):建立統(tǒng)計(jì)語(yǔ)言模型。
2):對(duì)句子進(jìn)行單詞劃分,然后對(duì)劃分結(jié)果進(jìn)行概率計(jì)算,獲得概率最大的分詞方式。用到了統(tǒng)計(jì)學(xué)習(xí)算法,如 隱含馬爾可夫(HMM),條件隨機(jī)場(chǎng)(CRF)等。
1.2.1:語(yǔ)言模型(詳情自行百度了解)
1.2.2:HMM模型(詳情自行百度了解)
1.2.3:其他統(tǒng)計(jì)分詞算法(詳情自行百度了解)
2:中文分詞工具——Jieba
jieba分詞官方地址:https://github.com/fxsjy/jieba
安裝方式:
pip install jieba,或 pip3 install jieba
2.1:Jieba三種分詞模式
- 精確模式:試圖將句子最精確的切分,適合文本分析。
- 全模式:把句子中所有可以成詞的詞語(yǔ)都掃描出來(lái),速度非???#xff0c;但是不能解決歧義。
- 搜索引擎模式:在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次切分,提高召回率,適合用于搜索引擎分詞。
示例代碼:
import jiebasent = '中文分詞是文本處理不可或缺的一步!' seg_list = jieba.cut(sent, cut_all=True) print('全模式', '/'.join(seg_list)) seg_list = jieba.cut(sent, cut_all=False) print('精確模式', '/'.join(seg_list)) seg_list = jieba.cut(sent) print('默認(rèn)模式', '/'.join(seg_list)) seg_list = jieba.cut_for_search(sent) print('搜索引擎模式', '/'.join(seg_list))返回:
全模式 中文/分詞/是/文本/文本處理/本處/處理/不可/不可或缺/或缺/的/一步/! 精確模式 中文/分詞/是/文本處理/不可或缺/的/一步/! 默認(rèn)模式 中文/分詞/是/文本處理/不可或缺/的/一步/! 搜索引擎模式 中文/分詞/是/文本/本處/處理/文本處理/不可/或缺/不可或缺/的/一步/!2.2:實(shí)戰(zhàn)之高頻詞提取
高頻詞:一般是指文檔中出現(xiàn)頻率較高且非無(wú)用的詞語(yǔ),其一定程度上代表了文檔的焦點(diǎn)所在。
高頻詞提取其實(shí)就是自然語(yǔ)言處理的TF(Term Frequency)策略。主要有以下干擾項(xiàng):
- 標(biāo)點(diǎn)符號(hào):一般標(biāo)點(diǎn)符號(hào)無(wú)任何價(jià)值,需要去除。
- 停用詞:諸如“的”“是”“了”等常用無(wú)任何意義,也需要提出。
代碼示例:
# 讀取數(shù)據(jù) def get_content(path):with open(path, 'r', encoding='utf-8', errors='ignore') as f:content = ''for l in f:l = l.strip()content += lreturn content# 定義高頻詞統(tǒng)計(jì)的函授,輸入為一個(gè)詞的數(shù)組 def get_TF(words, topK=10):tf_dic = {}for w in words:tf_dic[w] = tf_dic.get(w, 0) + 1return sorted(tf_dic.items(), key=lambda x: x[1], reverse=True)[:topK]if __name__ == '__main__':import globimport randomimport jiebafiles = glob.glob('../Desktop/1.txt')corpus = [get_content(x) for x in files]sample_inx = random.randint(0, len(corpus))split_words = list(jieba.cut(corpus[sample_inx]))print('樣本之一:' + corpus[sample_inx])print('樣本分詞效果:' + '/'.join(split_words))print('樣本的topk(10) 詞:' + str(get_TF(split_words)))輸出結(jié)果:
樣本之一:在蘋(píng)果最新獲批的一項(xiàng)技術(shù)專(zhuān)利中,展示了屏幕檢測(cè)光線(xiàn)的技術(shù)細(xì)節(jié)。該技術(shù)專(zhuān)利可能幫助蘋(píng)果將 Touch ID 指紋傳感器和 Face ID 面部識(shí)別傳感器整合到屏幕下方,從而取消目前 iPhone 機(jī)型中的劉海區(qū)域。在技術(shù)專(zhuān)利名稱(chēng)為“用于檢測(cè)電子設(shè)備顯示屏發(fā)光層所受光線(xiàn)的傳感系統(tǒng)”,簡(jiǎn)而言之,蘋(píng)果計(jì)劃在顯示屏下方嵌入一個(gè)光線(xiàn)檢測(cè)傳感器,該傳感器可用于 Face ID 以及 Touch ID。該公司分享了該技術(shù)的兩種潛在實(shí)現(xiàn)細(xì)節(jié)。在第一種情況下,顯示屏背后的光線(xiàn)傳感器可以組合出觸摸屏幕的物體的圖像。這暗示了Touch ID的回歸。除此之外,蘋(píng)果專(zhuān)利中還提到了使用環(huán)境光傳感器進(jìn)行操作。第二種實(shí)施方式將使用光電二極管或太陽(yáng)能電池陣列來(lái)組裝圖像的像素。此外,該系統(tǒng)將積累來(lái)自光電二極管的電信號(hào),以感知光的強(qiáng)度以及顏色。第二種實(shí)現(xiàn)方式指向Face ID,它可能會(huì)在未來(lái)的iPhone迭代中出現(xiàn)。需要注意的是,蘋(píng)果公司申請(qǐng)了很多專(zhuān)利,不一定所有的專(zhuān)利都能商用。然而,該專(zhuān)利確實(shí)讓人看到了該公司的未來(lái)前景和該技術(shù)的潛在引入。 樣本分詞效果:在/蘋(píng)果/最新/獲批/的/一項(xiàng)/技術(shù)/專(zhuān)利/中/,/展示/了/屏幕/檢測(cè)/光線(xiàn)/的/技術(shù)細(xì)節(jié)/。/該/技術(shù)/專(zhuān)利/可能/幫助/蘋(píng)果/將/ /Touch/ /ID/ /指紋/傳感器/和/ /Face/ /ID/ /面部/識(shí)別/傳感器/整合/到/屏幕/下方/,/從而/取消/目前/ /iPhone/ /機(jī)型/中/的/劉海/區(qū)域/。/在/技術(shù)/專(zhuān)利/名稱(chēng)/為/“/用于/檢測(cè)/電子設(shè)備/顯示屏/發(fā)光/層所受/光線(xiàn)/的/傳感/系統(tǒng)/”/,/簡(jiǎn)而言之/,/蘋(píng)果/計(jì)劃/在/顯示屏/下方/嵌入/一個(gè)/光線(xiàn)/檢測(cè)/傳感器/,/該/傳感器/可/用于/ /Face/ /ID/ /以及/ /Touch/ /ID/。/該/公司/分享/了/該/技術(shù)/的/兩種/潛在/實(shí)現(xiàn)/細(xì)節(jié)/。/在/第一種/情況/下/,/顯示屏/背后/的/光線(xiàn)/傳感器/可以/組合/出/觸摸/屏幕/的/物體/的/圖像/。/這/暗示/了/Touch/ /ID/的/回歸/。/除此之外/,/蘋(píng)果/專(zhuān)利/中/還/提到/了/使用/環(huán)境光/傳感器/進(jìn)行/操作/。/第二種/實(shí)施/方式/將/使用/光電/二極管/或/太陽(yáng)能/電池/陣列/來(lái)/組裝/圖像/的/像素/。/此外/,/該/系統(tǒng)/將/積累/來(lái)自/光電/二極管/的/電信號(hào)/,/以/感知/光/的/強(qiáng)度/以及/顏色/。/第二種/實(shí)現(xiàn)/方式/指向/Face/ /ID/,/它/可能/會(huì)/在/未來(lái)/的/iPhone/迭代/中/出現(xiàn)/。/需要/注意/的/是/,/蘋(píng)果公司/申請(qǐng)/了/很多/專(zhuān)利/,/不/一定/所有/的/專(zhuān)利/都/能/商用/。/然而/,/該/專(zhuān)利/確實(shí)/讓/人/看到/了/該/公司/的/未來(lái)/前景/和/該/技術(shù)/的/潛在/引入/。 樣本的topk(10) 詞:[('的', 17), (' ', 15), (',', 13), ('。', 12), ('該', 8), ('專(zhuān)利', 7), ('了', 6), ('ID', 6), ('傳感器', 6), ('在', 5)]通過(guò)上面的結(jié)果,發(fā)現(xiàn)諸如,“的”“,”“?!薄霸摗钡仍~占據(jù)著很高的位置,而這類(lèi)詞對(duì)文章焦點(diǎn)并沒(méi)有太大意義。
因此,我們可以自定義詞典,然后進(jìn)行優(yōu)化。
首先定義一個(gè)自定義停用詞庫(kù):
添加代碼:
def stop_words(path):with open(path, 'r', encoding='utf-8', errors='ignore') as f:return [l.strip() for l in f]修改主函數(shù):
if __name__ == '__main__':import globimport randomimport jiebafiles = glob.glob('../Desktop/1.txt')corpus = [get_content(x) for x in files]sample_inx = random.randint(0, len(corpus))split_words = [x for x in jieba.cut(corpus[sample_inx]) ifx not in stop_words('../Desktop/stop_words.utf8')]print('樣本之一:' + corpus[sample_inx])print('樣本分詞效果:' + '/'.join(split_words))print('樣本的topk(10) 詞:' + str(get_TF(split_words)))最終結(jié)果:
樣本的topk(10) 詞:[(' ', 15), ('專(zhuān)利', 7), ('ID', 6), ('傳感器', 6), ('技術(shù)', 5), ('蘋(píng)果', 4), ('光線(xiàn)', 4), ('屏幕', 3), ('檢測(cè)', 3), ('將', 3)]?
總結(jié)
以上是生活随笔為你收集整理的Day3-中文分词技术(常用分词技术介绍)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机科学与技术的职业需求,职业规划:计
- 下一篇: 【JAVAFX 构建中国地图2021最新