自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

NLP入門干貨:手把手教你3種中文規(guī)則分詞方法

人工智能 語(yǔ)音識(shí)別
本文將講解中文自然語(yǔ)言處理的第一項(xiàng)核心技術(shù)——中文分詞技術(shù),它是中文自然語(yǔ)言處理非常關(guān)鍵和核心的部分。

在自然語(yǔ)言理解中,詞(token)是最小的能夠獨(dú)立活動(dòng)的有意義的語(yǔ)言成分。將詞確定下來(lái)是理解自然語(yǔ)言的第一步,只有跨越了這一步,中文才能像英文那樣過(guò)渡到短語(yǔ)劃分、概念抽取以及主題分析,以至自然語(yǔ)言理解,最終達(dá)到智能計(jì)算的最高境界。因此,每個(gè)NLP工作者都應(yīng)掌握分詞技術(shù)。

1. 分詞的概念和分類

“詞”這個(gè)概念一直是漢語(yǔ)言學(xué)界糾纏不清而又揮之不去的問(wèn)題。“詞是什么”(詞的抽象定義)和“什么是詞”(詞的具體界定)這兩個(gè)基本問(wèn)題迄今為止也未能有一個(gè)權(quán)威、明確的表述,當(dāng)今更是沒(méi)有一份令大家公認(rèn)的詞表。

問(wèn)題的主要難點(diǎn)在于漢語(yǔ)結(jié)構(gòu)與印歐體系語(yǔ)種差異甚大,對(duì)詞的構(gòu)成邊界很難進(jìn)行界定。比如在英語(yǔ)中,單詞本身就是“詞”的表達(dá),一篇英文文章的格式就是“單詞”加分隔符(空格)。

而在漢語(yǔ)中,詞以字為基本單位,但是一篇文章的語(yǔ)義表達(dá)卻仍然是以詞來(lái)劃分。因此,需要針對(duì)中文漢字,將其按照一定的方式進(jìn)行組織,分成不同的詞。

中文分詞是讓計(jì)算機(jī)自動(dòng)識(shí)別出句子中的詞,然后在詞間加入邊界標(biāo)記符。這個(gè)過(guò)程看似簡(jiǎn)單,然而實(shí)踐起來(lái)要復(fù)雜得多,主要困難在于分詞歧義。

下面以NLP分詞的經(jīng)典場(chǎng)景為例進(jìn)行說(shuō)明,短語(yǔ)“結(jié)婚的和尚未結(jié)婚的”,應(yīng)該分詞為“結(jié)婚/的/和/尚未/結(jié)婚/的”,還是“結(jié)婚/的/和尚/未/結(jié)婚/的”呢?對(duì)于這個(gè)問(wèn)題,機(jī)器很難處理。此外,像未登錄詞、分詞粒度粗細(xì)等都是影響分詞效果的重要因素。

自中文自動(dòng)分詞被提出以來(lái),歷經(jīng)近30年的探索,先后出現(xiàn)了很多分詞方法,可主要?dú)w納為規(guī)則分詞、統(tǒng)計(jì)分詞和混合分詞(規(guī)則+統(tǒng)計(jì))這3個(gè)流派。最近這幾年又興起了以深度學(xué)習(xí)的方式進(jìn)行分詞,比如BILSTM+CRF。

規(guī)則分詞是最早興起的方法,主要通過(guò)人工設(shè)立詞庫(kù),按照一定方式進(jìn)行匹配切分,其實(shí)現(xiàn)簡(jiǎn)單高效,但對(duì)沒(méi)有錄入詞庫(kù)的新詞很難進(jìn)行處理。

隨后統(tǒng)計(jì)機(jī)器學(xué)習(xí)技術(shù)興起,應(yīng)用于分詞任務(wù)上就有了統(tǒng)計(jì)分詞方法。該方法能夠較好地應(yīng)對(duì)新詞發(fā)現(xiàn)等特殊場(chǎng)景。然而在實(shí)踐中,單純的統(tǒng)計(jì)分詞也有其缺陷:太過(guò)依賴語(yǔ)料的質(zhì)量。因此實(shí)踐中多是采用規(guī)則分詞和統(tǒng)計(jì)分詞這兩種方法的結(jié)合,即混合分詞。

[[349010]]

2. 規(guī)則分詞

基于規(guī)則的分詞是一種機(jī)械分詞方法,需要不斷維護(hù)和更新詞典,在切分語(yǔ)句時(shí),將語(yǔ)句的每個(gè)字符串與詞表中的每個(gè)詞進(jìn)行逐一匹配,找到則切分,找不到則不予切分。

按照匹配劃分,主要有正向最大匹配、逆向最大匹配以及雙向最大匹配這3種切分方法。

1. 正向最大匹配

正向最大匹配(Maximum Match)通常簡(jiǎn)稱為MM法,其執(zhí)行過(guò)程如下所示。

  • 從左向右取待切分漢語(yǔ)句的m個(gè)字符作為匹配字段,m為機(jī)器詞典中最長(zhǎng)詞條的字符數(shù)。
  • 查找機(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)江大橋”和“大橋”3個(gè)詞。

現(xiàn)采用正向最大匹配對(duì)句子“南京市長(zhǎng)江大橋”進(jìn)行分詞,那么首先從句子中取出前5個(gè)字“南京市長(zhǎng)江”,發(fā)現(xiàn)詞典中沒(méi)有該詞,于是縮小長(zhǎng)度,取前4個(gè)字“南京市長(zhǎng)”,詞典中存在該詞,于是該詞被確認(rèn)切分。

再將剩下的“江大橋”按照同樣方式切分,得到“江”“大橋”,最終分為“南京市長(zhǎng)”“江”“大橋”3個(gè)詞。顯然,這種結(jié)果不是我們所希望的。正向最大匹配法示例代碼如下。

  1. class MM(object): 
  2.     def __init__(self): 
  3.         self.window_size = 3 
  4.  
  5.     def cut(self,text): 
  6.         result=[] 
  7.         index=0 
  8.         text_length = len(text) 
  9.         dic = ['研究','研究生','生命','起源'] 
  10.         while text_length > index: 
  11.             for size in range(self.window_size+index,index,-1):#4,0,-1 
  12.                 piece = text[index:size] 
  13.                 if piece in dic: 
  14.                     index = size-1 
  15.                     break 
  16.             indexindex = index + 1 
  17.             result.append(piece) 
  18.         return result 

分詞的結(jié)果如下所示,這個(gè)結(jié)果并不能讓人滿意。

  1. text = '研究生命的起源' 
  2. tokenizer = MM() 
  3. print(tokenizer.cut(text)) 

輸出結(jié)果如下所示。

  1. ['研究生', '命', '的', '起源'] 

2. 逆向最大匹配

逆向最大匹配簡(jiǎn)稱為RMM法。RMM法的基本原理與MM法大致相同,不同的是分詞切分的方向與MM法相反。

逆向最大匹配法從被處理文檔的末端開始匹配掃描,每次取最末端的m個(gè)字符(m為詞典中最長(zhǎng)詞數(shù))作為匹配字段,若匹配失敗,則去掉匹配字段最前面的一個(gè)字,繼續(xù)匹配。相應(yīng)地,它使用的分詞詞典是逆序詞典,其中的每個(gè)詞條都將按逆序方式存放。

在實(shí)際處理時(shí),先將文檔進(jìn)行倒排處理,生成逆序文檔。然后,根據(jù)逆序詞典,對(duì)逆序文檔用正向最大匹配法處理即可。

由于漢語(yǔ)中偏正結(jié)構(gòu)較多,若從后向前匹配,可以適當(dāng)提高精確度。所以,逆向最大匹配法比正向最大匹配法的誤差要小。

統(tǒng)計(jì)結(jié)果表明,單純使用正向最大匹配的錯(cuò)誤率為1/169,單純使用逆向最大匹配的錯(cuò)誤率為1/245。比如之前的“南京市長(zhǎng)江大橋”,按照逆向最大匹配,最終得到“南京市”“長(zhǎng)江大橋”的分詞結(jié)果。

當(dāng)然,如此切分并不代表完全正確,可能有個(gè)叫“江大橋”的“南京市長(zhǎng)”也說(shuō)不定。逆向最大匹配法示例代碼如下。

  1. class RMM(object): 
  2.     def __init__(self): 
  3.         self.window_size = 3 
  4.  
  5.     def cut(self, text): 
  6.         result = [] 
  7.         index = len(text) 
  8.         dic = ['研究', '研究生', '生命', '命', '的', '起源'] 
  9.         while index > 0: 
  10.             for size in range(index-self.window_size ,index): 
  11.                 piece = text[size:index] 
  12.                 if piece in dic: 
  13.                     index = size + 1 
  14.                     break 
  15.             indexindex = index - 1 
  16.             result.append(piece) 
  17.         result.reverse() 
  18.         return result 

分詞的結(jié)果如下所示,這個(gè)結(jié)果就很準(zhǔn)確了。

  1. text = '研究生命的起源' 
  2. tokenizer = RMM() 
  3. print(tokenizer.cut(text)) 

輸出結(jié)果如下所示。

  1. ['研究', '生命', '的', '起源'] 

3. 雙向最大匹配

雙向最大匹配法是將正向最大匹配法得到的分詞結(jié)果和逆向最大匹配法得到的結(jié)果進(jìn)行比較,然后按照最大匹配原則,選取詞數(shù)切分最少的作為結(jié)果。

據(jù)Sun M.S.和Benjamin K.T.研究表明,對(duì)于中文中90.0%左右的句子,正向最大匹配和逆向最大匹配的切分結(jié)果完全重合且正確,只有大概9.0%的句子采用兩種切分方法得到的結(jié)果不一樣,但其中必有一個(gè)是正確的(歧義檢測(cè)成功),只有不到1.0%的句子,或者正向最大匹配和逆向最大匹配的切分結(jié)果雖重合卻都是錯(cuò)的,或者正向最大匹配和逆向最大匹配的切分結(jié)果不同但兩個(gè)都不對(duì)(歧義檢測(cè)失敗)。這正是雙向最大匹配法在實(shí)用中文信息處理系統(tǒng)中得以廣泛使用的原因所在。

前面列舉的“南京市長(zhǎng)江大橋”采用雙向最大匹配法進(jìn)行切分,中間產(chǎn)生“南京市/ 江/ 大橋”和“南京市/ 長(zhǎng)江大橋”兩種結(jié)果,最終選取詞數(shù)較少的“南京市/ 長(zhǎng)江大橋”這一結(jié)果。

雙向最大匹配的規(guī)則如下所示。

(1) 如果正反向分詞結(jié)果詞數(shù)不同,則取分詞數(shù)量較少的那個(gè)結(jié)果(上例:“南京市/江/大橋”的分詞數(shù)量為3,而“南京市/長(zhǎng)江大橋”的分詞數(shù)量為2,所以返回分詞數(shù)量為2的結(jié)果)。

(2) 如果分詞結(jié)果詞數(shù)相同,則:

  • 分詞結(jié)果相同,就說(shuō)明沒(méi)有歧義,可返回任意一個(gè)結(jié)果。
  • 分詞結(jié)果不同,返回其中單字較少的那個(gè)。比如前文示例代碼中,正向最大匹配返回的結(jié)果為“['研究生', '命', '的', '起源']”,其中單字個(gè)數(shù)為2個(gè);而逆向最大匹配返回的結(jié)果為“['研究', '生命', '的', '起源']”,其中單字個(gè)數(shù)為1。所以返回的是逆向最大匹配的結(jié)果。

參考代碼如下所示。

  1. #統(tǒng)計(jì)單字成詞的個(gè)數(shù) 
  2. def count_singlechar(word_list): 
  3.     return sum(1 for word in word_list if len(word) == 1) 
  4.  
  5. def bidirectional_segment(text): 
  6.     mm = MM() 
  7. rmm = RMM() 
  8.     f = mm.cut(text) 
  9.     b = rmm.cut(text) 
  10.     if (len(f) < len(b)): 
  11.         return f 
  12.     elif (len(f) > len(b)): 
  13.         return b 
  14.     else: 
  15.         if (count_singlechar(f) >= count_singlechar(b)): 
  16.             return b 
  17.         else: 
  18.             return f 

最后我們驗(yàn)證一下效果。

  1. print(bidirectional_segment('研究生命的起源')) 

輸出結(jié)果為:

  1. ['研究', '生命', '的', '起源'] 

基于規(guī)則的分詞一般都較為簡(jiǎn)單高效,但是詞典的維護(hù)面臨很龐大的工作量。在網(wǎng)絡(luò)發(fā)達(dá)的今天,網(wǎng)絡(luò)新詞層出不窮,很難通過(guò)詞典覆蓋所有詞。另外,詞典分詞也無(wú)法區(qū)分歧義以及無(wú)法召回新詞。

在實(shí)際項(xiàng)目中,我們是否會(huì)考慮使用規(guī)則分詞?

雖然使用規(guī)則分詞的分詞準(zhǔn)確率看上去非常高,但是規(guī)則分詞有幾個(gè)特別大的問(wèn)題:

  • 不斷維護(hù)詞典是非常煩瑣的,新詞總是層出不窮,人工維護(hù)費(fèi)時(shí)費(fèi)力;
  • 隨著詞典中條目數(shù)的增加,執(zhí)行效率變得越來(lái)越低;
  • 無(wú)法解決歧義問(wèn)題。

 

責(zé)任編輯:趙寧寧 來(lái)源: 華章科技
相關(guān)推薦

2018-03-23 20:45:23

機(jī)器學(xué)習(xí)NLP文本數(shù)據(jù)

2019-10-22 14:30:11

機(jī)器學(xué)習(xí)人工智能計(jì)算機(jī)

2017-12-01 05:01:35

WiFi干擾無(wú)線網(wǎng)絡(luò)

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機(jī)

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2009-07-03 17:15:31

jsp上傳文件

2018-05-16 13:50:30

Python網(wǎng)絡(luò)爬蟲Scrapy

2021-06-29 12:27:19

Spring BootCAS 登錄

2021-02-26 11:54:38

MyBatis 插件接口

2011-02-22 13:46:27

微軟SQL.NET

2021-12-28 08:38:26

Linux 中斷喚醒系統(tǒng)Linux 系統(tǒng)

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2022-03-14 14:47:21

HarmonyOS操作系統(tǒng)鴻蒙

2022-06-30 08:13:44

PythonWeb編程語(yǔ)言

2009-08-14 09:12:37

Windows 7光盤AIK

2020-04-14 10:20:12

MySQL數(shù)據(jù)庫(kù)死鎖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)