主頁 >  其他 > HanLP《自然語言處理入門》筆記--3.二元語法與中文分詞

HanLP《自然語言處理入門》筆記--3.二元語法與中文分詞

2020-09-16 01:50:49 其他

筆記轉載于GitHub專案:https://github.com/NLP-LOVE/Introduction-NLP

3. 二元語法與中文分詞

上一章中我們實作了塊兒不準的詞典分詞,詞典分詞無法消歧,給定兩種分詞結果“商品 和服 務”以及“商品 和 服務”,詞典分詞不知道哪種更加合理,

我們人類確知道第二種更加合理,只因為我們從小到大接觸的都是第二種分詞,出現的次數多,所以我們判定第二種是正確地選擇,這就是利用了統計自然語言處理,統計自然語言處理的核心話題之一,就是如何利用統計手法對語言建模,這一章講的就是二元語法的統計語言模型,

3.1 語言模型

  1. 什么是語言模型

    模型指的是對事物的數學抽象,那么語言模型指的就是對語言現象的數學抽象,準確的講,給定一個句子 w,語言模型就是計算句子的出現概率 p(w) 的模型,而統計的物件就是人工標注而成的語料庫,

    假設構建如下的小型語料庫:

    商品 和 服務
    商品 和服 物美價廉
    服務 和 貨幣
    

    每個句子出現的概率都是 1/3,這就是語言模型,然而 p(w) 的計算非常難:句子數量無窮無盡,無法列舉,即便是大型語料庫,也只能“列舉”有限的數百萬個句子,實際遇到的句子大部分都在語料庫之外,意味著它們的概率都被當作0,這種現象被稱為資料稀疏

    句子幾乎不重復,單詞卻一直在重復使用,于是我們把句子表示為單詞串列 \(w=w_1w_2...w_k\) ,每個 \(w_t,t\in[1,k]\) 都是一個單詞,然后定義語言模型:

    \[\begin{aligned} p(\boldsymbol{w}) &=p\left(w_{1} w_{2} \cdots w_{k}\right) \\ &=p\left(w_{1} | w_{0}\right) \times p\left(w_{2} | w_{0} w_{1}\right) \times \cdots \times p\left(w_{k+1} | w_{0} w_{1} w_{2} \dots w_{k}\right) \\ &=\prod_{t=1}^{k+1} p\left(w_{t} | w_{0} w_{1} \cdots w_{t-1}\right) \end{aligned} \]

    其中,\(w_0=BOS\) (Begin Of Sentence,有時用<s>),\(w_{k+1}=EOS (End Of Sentence,有時也用</s>)\),是用來標記句子收尾的兩個特殊“單詞”,在NLP領域的文獻和代碼中經常出現,

    然而隨著句子長度的增大,語言模型會遇到如下兩個問題,

    • 資料稀疏,指的是長度越大的句子越難出現,可能統計不到頻次,導致 \(p(w_k|w_1w_2...w_{k-1})=0\),比如 p(商品 和 貨幣)=0,
    • 計算代價大,k 越大,需要存盤的 p 就越多,即便用上字典樹索引,依然代價不菲,
  2. 馬爾可夫鏈與二元語法

    為了解決以上兩個問題,需要使用馬爾可夫假設來簡化語言模型,給定時間線上有一串事件順序發生,假設每個事件的發生概率只取決于前一個事件,那么這串事件構成的因果鏈被稱作馬爾可夫鏈

    在語言模型中,第 t 個事件指的是 \(w_t\) 作為第 t 個單詞出現,也就是說,每個單詞出現的概率只取決于前一個單詞:

    \[p(w_t|w_0w_1...w_{t-1})=p(w_t|w_{t-1}) \]

    基于此假設,式子一下子變短了不少,此時的語言模型稱為二元語法模型

    \[\begin{aligned} p(\boldsymbol{w}) &=p\left(w_{1} w_{2} \cdots w_{k}\right) \\ &=p\left(w_{1} | w_{0}\right) \times p\left(w_{2} | w_{1}\right) \times \cdots \times p\left(w_{k+1} | w_{k}\right) \\ &=\prod_{t=1}^{k+1} p\left(w_{t} | w_{t-1}\right) \end{aligned} \]

    由于語料庫中二元連續的重復程度要高于整個句子的重要程度,所以緩解了資料稀疏的問題,另外二元連續的總數量遠遠小于句子的數量,存盤和查詢也得到了解決,

  3. n元語法

    利用類似的思路,可以得到n元語法的定義:每個單詞的概率僅取決于該單詞之前的 n 個單詞:

    \[p(w)=\prod_{t=1}^{k+n-1} p\left(w_{t} | w_{t-n+1} \dots w_{t-1}\right) \]

    特別地,當 n=1 時的 n 元語法稱為一元語法 ( unigram);當 n=3 時的 n 元語法稱為三元語法(tigam); n≥4時資料稀疏和計算代價又變得顯著起來,實際工程中幾乎不使用,

  4. 資料稀疏與平滑策略

    對于 n 元語法模型,n 越大,資料稀疏問題越嚴峻,比如上述語料庫中“商品 貨幣”的頻次就為0,一個自然而然的解決方案就是利用低階 n 元語法平滑高階 n 元語法,所謂平滑,就是字面上的意思:使 n 元語法頻次的折線平滑為曲線,最簡單的一種是線性插值法:

    \[p\left(w_{t} | w_{t-1}\right)=\lambda p_{\mathrm{ML}}\left(w_{t} | w_{t-1}\right)+(1-\lambda) p\left(w_{t}\right) \]

    其中,\(\lambda\in(0,1)\) 為常數平滑因子,通俗理解,線性插值就是劫富濟貧的稅賦制度,其中的 λ 就是個人所得稅的稅率,\(p_{ML}(w_t|w_{t-1})\) 是稅前所得,\(p(w_t)\) 是社會福利, 通過繳稅,高收人(高概率)二元語法的一部分收人 (概率)被移動到社會福利中,而零收入(語料庫統計不到頻次)的一元語法能夠從社會福利中取得點低保金, 不至于餓死,低保金的額度與二元語法掙錢潛力成正比:二元語法中第二個詞詞頻越高,它未來被統計到的概率也應該越高,因此它應該多拿一點,

    類似地,一元語法也可以通過線性插值來平滑:

    \[p\left(w_{t}\right)=\lambda p_{\mathrm{ML}}\left(w_{t}\right)+(1-\lambda) \frac{1}{N} \]

    其中,N 是語料庫總詞頻,

3.2 中文分詞語料庫

語言模型只是一個函式的骨架,函式的引數需要在語料庫上統計才能得到,為了滿足實際工程需要,一個質量高、分量足的語料庫必不可少,以下是常用的語料庫:

  • 《人民日報》語料庫 PKU
  • 微軟亞洲研究院語料庫 MSR
  • 香港城市大學 CITYU(繁體)
  • 臺灣中央研究院 AS(繁體)
語料庫 字符數 詞語種數 總詞頻 平均詞長
PKU 183萬 6萬 111萬 1.6
MSR 405萬 9萬 237萬 1.7
AS 837萬 14萬 545萬 1.5
CITYU 240萬 7萬 146萬 1.7

一般采用MSR作為分詞語料的首選,有以下原因:

  • 標注一致性上MSR要優于PKU,
  • 切分顆粒度上MSR要優于PKU,MSR的機構名稱不予切分,而PKU拆開,
  • MSR中姓名作為一個整體,更符合習慣,
  • MSR量級是PKU的兩倍,

3.3 訓練與預測

訓練指的是統計二元語法頻次以及一元語法頻次,有了頻次,通過極大似然估計以及平滑策略,我們就可以估計任意句子的概率分布,即得到了語言模型,這里以二元語法為例:

這里我們選用上面自己構造的小型語料庫:data/dictionnary/my_cws_corpus.txt

代碼請見:code/ch03/ngram_segment.py

步驟如下:

  • 加載語料庫檔案并進行詞頻統計,

  • 對詞頻檔案生成詞網

    詞網指的是句子中所有一元語法構成的網狀結構,是HanLP工程上的概念,比如“商品和服務”這個句子,我們將句子中所有單詞找出來,起始位置(offset)相同的單詞寫作一行:

    0:[ ]
    1:[商品]
    2:[]
    3:[和,和服]
    4:[服務]
    5:[務]
    6:[ ]
    

    其中收尾(行0和行6)分別對應起始和末尾,詞網必須保證從起點出發的所有路徑都會連通到鐘點房,

    詞網有一個極佳的性質:那就是第 i 行的詞語 w 與第 i+len(w) 行的所有詞語相連都能構成二元語法,

  • 詞圖上的維特比演算法

    上述詞圖每條邊以二元語法的概率作為距離,那么中文分詞任務轉換為有向無環圖上的最長路徑問題,再通過將浮點數乘法轉化為負對數之間的加法,相應的最長路徑轉化為負對數的最短路徑,使用維特比演算法求解,

    這里僅作一下簡述,詳細程序參考書本第三章,

該模型代碼輸入是句子“貨幣和服務”,得到結果如下:

[' ', '貨幣', '和', '服務', ' ']

結果正確,可見我們的二元語法模型具備一定的泛化能力,

3.4 HanLP分詞與用戶詞典的集成

詞典往往廉價易得,資源豐富,利用統計模型的消歧能力,輔以用戶詞典處理新詞,是提高分詞器準確率的有效方式,HanLP支持 2 檔用戶詞典優先級:

  • 低優先級:分詞器首先在不考慮用戶詞典的情況下由統計模型預測分詞結果,最后將該結果按照用戶詞典合并,默認低優先級,
  • 高優先級:分詞器優先考慮用戶詞典,但具體實作由分詞器子類自行決定,

HanLP分詞器簡潔版

from pyhanlp import *

ViterbiSegment = SafeJClass('com.hankcs.hanlp.seg.Viterbi.ViterbiSegment')

segment = ViterbiSegment()
sentence = "社會搖擺簡稱社會搖"
segment.enableCustomDictionary(False)
print("不掛載詞典:", segment.seg(sentence))
CustomDictionary.insert("社會搖", "nz 100")
segment.enableCustomDictionary(True)
print("低優先級詞典:", segment.seg(sentence))
segment.enableCustomDictionaryForcing(True)
print("高優先級詞典:", segment.seg(sentence))

輸出:

不掛載詞典: [社會/n, 搖擺/v, 簡稱/v, 社會/n, 搖/v]
低優先級詞典: [社會/n, 搖擺/v, 簡稱/v, 社會搖/nz]
高優先級詞典: [社會搖/nz, 擺/v, 簡稱/v, 社會搖/nz]

可見,用戶詞典的高優先級未必是件好事,HanLP中的用戶詞典默認低優先級,做專案時請讀者在理解上述說明的情況下根據實際需求自行開啟高優先級,

3.5 二元語法與詞典分詞比較

按照NLP任務的一般流程,我們已經完成了語料標注和模型訓練,現在來比較一下二元語法和詞典分詞的評測:

演算法 P R F1 R(oov) R(IV)
最長匹配 89.41 94.64 91.95 2.58 97.14
二元語法 92.38 96.70 94.49 2.58 99.26

相較于詞典分詞,二元語法在精確度、召回率及IV召回率上全面勝出,最終F1值提高了 2.5%,成績的提高主要受惠于消歧能力的提高,然而 OOV 召回依然是 n 元語法模型的硬傷,我們需要更強大的語言模型,

3.6 GitHub專案

HanLP何晗--《自然語言處理入門》筆記:

https://github.com/NLP-LOVE/Introduction-NLP

專案持續更新中......

目錄


章節
第 1 章:新手上路
第 2 章:詞典分詞
第 3 章:二元語法與中文分詞
第 4 章:隱馬爾可夫模型與序列標注
第 5 章:感知機分類與序列標注
第 6 章:條件隨機場與序列標注
第 7 章:詞性標注
第 8 章:命名物體識別
第 9 章:資訊抽取
第 10 章:文本聚類
第 11 章:文本分類
第 12 章:依存句法分析
第 13 章:深度學習與自然語言處理

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/51653.html

標籤:其他

上一篇:HanLP《自然語言處理入門》筆記--2.詞典分詞

下一篇:冬日曙光——回溯CNN的誕生

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more