日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Day3-中文分词技术(常用分词技术介绍)

發(fā)布時(shí)間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Day3-中文分词技术(常用分词技术介绍) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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 = '研究生命的起源真牛皮車呀'tokenizer = MM()print(tokenizer.cut(text))

輸出結(jié)果:

['研究生----', '命----', '的----', '起源----', '真----', '牛皮----', '車----', '呀----']

如此可看結(jié)果并不能讓人很滿意。

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 = '研究生命的起源真牛皮車呀'tokenizer = RMM()print(tokenizer.cut(text))

輸出:

['研究----', '生命----', '的----', '起源----', '真----', '牛皮----', '車----', '呀----']

這樣的話,輸出結(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),速度非常快,但是不能解決歧義。
  • 搜索引擎模式:在精確模式的基礎(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é)果:

樣本之一:在蘋果最新獲批的一項(xiàng)技術(shù)專利中,展示了屏幕檢測(cè)光線的技術(shù)細(xì)節(jié)。該技術(shù)專利可能幫助蘋果將 Touch ID 指紋傳感器和 Face ID 面部識(shí)別傳感器整合到屏幕下方,從而取消目前 iPhone 機(jī)型中的劉海區(qū)域。在技術(shù)專利名稱為“用于檢測(cè)電子設(shè)備顯示屏發(fā)光層所受光線的傳感系統(tǒng)”,簡(jiǎn)而言之,蘋果計(jì)劃在顯示屏下方嵌入一個(gè)光線檢測(cè)傳感器,該傳感器可用于 Face ID 以及 Touch ID。該公司分享了該技術(shù)的兩種潛在實(shí)現(xiàn)細(xì)節(jié)。在第一種情況下,顯示屏背后的光線傳感器可以組合出觸摸屏幕的物體的圖像。這暗示了Touch ID的回歸。除此之外,蘋果專利中還提到了使用環(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)。需要注意的是,蘋果公司申請(qǐng)了很多專利,不一定所有的專利都能商用。然而,該專利確實(shí)讓人看到了該公司的未來(lái)前景和該技術(shù)的潛在引入。 樣本分詞效果:在/蘋果/最新/獲批/的/一項(xiàng)/技術(shù)/專利/中/,/展示/了/屏幕/檢測(cè)/光線/的/技術(shù)細(xì)節(jié)/。/該/技術(shù)/專利/可能/幫助/蘋果/將/ /Touch/ /ID/ /指紋/傳感器/和/ /Face/ /ID/ /面部/識(shí)別/傳感器/整合/到/屏幕/下方/,/從而/取消/目前/ /iPhone/ /機(jī)型/中/的/劉海/區(qū)域/。/在/技術(shù)/專利/名稱/為/“/用于/檢測(cè)/電子設(shè)備/顯示屏/發(fā)光/層所受/光線/的/傳感/系統(tǒng)/”/,/簡(jiǎn)而言之/,/蘋果/計(jì)劃/在/顯示屏/下方/嵌入/一個(gè)/光線/檢測(cè)/傳感器/,/該/傳感器/可/用于/ /Face/ /ID/ /以及/ /Touch/ /ID/。/該/公司/分享/了/該/技術(shù)/的/兩種/潛在/實(shí)現(xiàn)/細(xì)節(jié)/。/在/第一種/情況/下/,/顯示屏/背后/的/光線/傳感器/可以/組合/出/觸摸/屏幕/的/物體/的/圖像/。/這/暗示/了/Touch/ /ID/的/回歸/。/除此之外/,/蘋果/專利/中/還/提到/了/使用/環(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)/。/需要/注意/的/是/,/蘋果公司/申請(qǐng)/了/很多/專利/,/不/一定/所有/的/專利/都/能/商用/。/然而/,/該/專利/確實(shí)/讓/人/看到/了/該/公司/的/未來(lái)/前景/和/該/技術(shù)/的/潛在/引入/。 樣本的topk(10) 詞:[('的', 17), (' ', 15), (',', 13), ('。', 12), ('該', 8), ('專利', 7), ('了', 6), ('ID', 6), ('傳感器', 6), ('在', 5)]

通過(guò)上面的結(jié)果,發(fā)現(xiàn)諸如,“的”“,”“。”“該”等詞占據(jù)著很高的位置,而這類詞對(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), ('專利', 7), ('ID', 6), ('傳感器', 6), ('技術(shù)', 5), ('蘋果', 4), ('光線', 4), ('屏幕', 3), ('檢測(cè)', 3), ('將', 3)]

?

總結(jié)

以上是生活随笔為你收集整理的Day3-中文分词技术(常用分词技术介绍)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。