1. 程式人生 > >NLP詞法分析(一):中文分詞

NLP詞法分析(一):中文分詞

##1.中文分詞介紹 中文分詞相較於英文分詞要難許多,因為英文字身就是由單詞與空格組成的,而中文則是由獨立的字組成的,但同時語義卻是有詞來表達的。因此對於中文的分析與研究,首先應尋找合適的方法進行分詞。現有的中文分詞技術主要分為規則分詞,統計分詞與規則加統計相結合的方式,接下來將分別介紹。 ###1.1規則分詞 規則分詞主要是通過構建詞典,對需要進行分詞的語句與詞典中的詞語進行匹配,從而實現切分,具體主要有正向最大匹配法,逆向最大匹配法,雙向最大匹配法。 ####1.1.1正向最大匹配法 正向最大匹配法實現的原理如下:假設分詞詞典中最長詞語的長度為 i, 那麼則選取需要進行分詞的語句中的前 i

個字,查詢是否匹配詞典中長度為i的詞。如果匹配,則進行切分;如果不匹配,則選取i-1個字查詢分詞詞典是否匹配,以此類推,直至成功切分。接著對於剩餘的欄位採取同樣的方法進行切分,直到最後完全切分。 比如我們現在要對“正向最大匹配法”進行分詞,而我們的分詞字典最長的詞語長度為4。首先選取前四個字“正向最大”,詞典中並無匹配,那麼接著選取前三個字“正向最”,依舊沒有,再選擇前兩個字“正向”,成功匹配,則進行切分,接著選取之後的四個字“最大匹配”,以此類推,繼續切分,直至切分完畢。 ####1.1.2逆向最大匹配法 逆向最大匹配法的原理與正向是基本一致的,只是逆向最大匹配法是從句尾開始進行匹配。由於漢語中偏正結構較多,一般逆向最大匹配法的結果準確度要稍高於正向最大匹配法 ####1.1.3雙向最大匹配法 雙向最大匹配法是在正向與逆向最大匹配法的基礎上對兩者結果進行比較,選取切分詞數較少的一個結果作為最終分詞。雙向最大匹配法在實際中運用更為廣 接下來,通過python實現雙向最大匹配法:

規則分詞在一般的分詞任務中已經能夠得到較好的結果了,但是其缺點是需要大量人力物力去維護與更新分詞詞典。同時,對於新詞,規則分詞很難能夠正確切割。相反,統計分詞法較好的解決的這個問題。

###1.2統計分詞 統計分詞的基本思想是基於統計的概念,如果相連的字在不同的地方出現的次數越多,則其越有可能為一個詞。因此我們可以利用出項概率來推測成詞的可能性,從而實現分詞。常見的統計分詞方法有隱含馬爾可夫(HMM)、條件隨機場(CRF)等。接下來我們首先建立統計分詞的語言模型,接著簡單介紹一下HMM

####1.2.1統計分詞語言模型 假設字串的長度為m,那麼對於這個字串的概率分佈可以描述為: P(w1,

w2,...,wm)P(w_1,w_2,...,w_m) 通過鏈式法則,我們可以計算其概率值: P(w1,w2,...,wm)=P(w1)P(w2w1)P(w3w2,w1)P(wiwi1,wi2,..,w1)P(wmwm1...w1)P(w_1,w_2,...,w_m)=P(w_1)P(w_2|w_1)P(w_3|w_2,w_1)···P(w_i|w_{i-1},w_{i-2},..,w_1) ···P(w_m|w_{m-1}...w_1) 由於實際計算中,上式非常複雜,一般採用n-gram模型進行簡化計算。n-gram模型即只考慮與字距離在n以內的文字對於這個字的影響。這樣條件概率P(wiwi1,wi2,..,w1)P(w_i|w_{i-1},w_{i-2},..,w_1)可以表示為: P(wiwi1,wi2,..,w1)=P(wiwi1,wi2,..,wi(n1))P(w_i|w_{i-1},w_{i-2},..,w_1)=P(w_i|w_{i-1},w_{i-2},..,w_{i-(n-1)}) 這樣,當n=1時,為unigram模型: P(wiwi1,wi2,..,w1)=P(wi)P(wi1)P(w1)P(w_i|w_{i-1},w_{i-2},..,w_1)=P(w_i)P(w_{i-1})···P(w_1) 即為每個字單獨的概率,但是unigram模型無法保留相鄰字之間的關係,所以用於分詞效果很不理想。當n=2,3時,模型可以保留一定的字之間的資訊,又不至於使得計算過為複雜。

####1.2.2HMM模型 HMM即隱含馬爾可夫模型,其基本思想為,將字在構造詞的過程中所承擔的角色歸為4類:B(begin),M(middle),E(end),S(single),接著,句子的分詞任務便可以轉化成對對句子中每個字進行標註角色的任務。在介紹HMM分詞之前,首先需要介紹隱含馬爾可夫過程。 ####隱含馬爾可夫過程 一般來說,馬爾可夫假設為:對於某一個隨機過程,假設其存在n個狀態S,那麼對於某個特定的狀態SiS_i,其概率分佈只與前一個狀態Si1S_{i-1}有關。即: P(SiS1,S2,...Si1)=P(SiSi1P(S_i|S_1,S_2,...S_{i-1})=P(S_i|S_{i-1} 而符合馬爾可夫假設的過程即為馬爾可夫過程,也叫做馬爾可夫鏈,一般的馬爾可夫連結串列示如下: 在這裡插入圖片描述 上圖中,每個圓代表一個狀態,而線代表狀態的轉移與其概率。 而隱含馬爾可夫過程是馬爾可夫過程的擴充套件。在隱含馬爾可夫過程中,不同時刻的狀態SiS_i是不可見的,所以無法通過觀測SiS_i來推測不同狀態的概率分佈。但是其在每個狀態時會輸出一個特定的特徵σi\sigma_i,並且這個特徵σi\sigma_i的概率分佈與且僅與當前的狀態有關。這就是隱含馬爾可夫過程: 在這裡插入圖片描述 上圖中,x代表狀態,y代表對應特徵。 ####HMM分詞 瞭解了隱含馬爾可夫過程,便可以介紹HMM分詞模型了。通過上述內容我們可以很容易的發現HMM分詞是典型的隱含馬爾可夫過程。其中B\M\E\S代表不同的狀態,而句子中每個字則代表其不同狀態所產生的特徵。而我們的任務則是根據概率分佈推測句子中每一個字背後的狀態,從而達到分詞。 通過數學模型推導過程如下: 假設用λ=λ1λ2...λn\lambda=\lambda_1\lambda_2...\lambda_n表示句子與其中每一個字。而用σ=σ1σ2...σn\sigma=\sigma_1\sigma_2...\sigma_n表示對應的狀態。則分詞任務可以描述成: maxP=maxP(σλ)=P(σ1σ2...σnλ1λ2...λn)max P=max P(\sigma|\lambda)=P(\sigma_1\sigma_2...\sigma_n|\lambda_1\lambda_2...\lambda_n) 通過貝葉斯公式可以得到: P(σλ)=P(λσ)P(σ)P(λ)P(\sigma|\lambda)=\frac{P(\lambda|\sigma)P(\sigma)}{P(\lambda)} 對於P(λ)P(\lambda),其只與分詞時使用的訓練集有關,是個常數。則我們的模型可以轉化為求: maxP(λσ)P(σ)max P(\lambda|\sigma)P(\sigma) 根據隱含馬爾可夫過程的假設 P(λσ)=P(λ1σ1)P(λ2σ2)P(λnσn)P(\lambda|\sigma)=P(\lambda_1|\sigma_1)P(\lambda_2|\sigma_2)···P(\lambda_n|\sigma_n) 同時,對於P(σ)P(\sigma): P(σ)=P(σ1)P(σ2σ1)P(σnσ1,σ2...σn1)P(\sigma)=P(\sigma_1)P(\sigma_2|\sigma_1)···P(\sigma_n|\sigma_1,\sigma_2...\sigma_{n-1})

相關推薦

NLP詞法分析中文

##1.中文分詞介紹 中文分詞相較於英文分詞要難許多,因為英文字身就是由單詞與空格組成的,而中文則是由獨立的字組成的,但同時語義卻是有詞來表達的。因此對於中文的分析與研究,首先應尋找合適的方法進行分詞。現有的中文分詞技術主要分為規則分詞,統計分詞與規則加統計相結

Elasticsearch外掛ik

在Elasticsearch的對於中文的檢索,ik效果最好也是使用最火的一款中文分詞外掛。支援自定義詞庫和動態修改詞庫。對於一般情況的的中文檢索,ik分詞是一個很好的選擇。 安裝 版本號要跟Elasticsearch版本對應。 手動安裝: 1.在plugins

python自然語言處理中文預處理、統計詞頻

一個小的嘗試。。資料來源資料集 一共200條關於手機的中文評論,以XML格式儲存。分詞工具 python-jieba預處理包括去停用詞、去標點符號和數字去停用詞:使用的是他人總結的 停用詞表去標點符號和數字:用正則表示式。原本打算的是中文標點符號從網上覆制,英文標點符號用st

Python自然語言處理實戰3中文技術

3.1、中文分詞簡介       在英文中,單詞本身就是“詞”的表達,一篇英文文章就是“單詞”加分隔符(空格)來表示的,而在漢語中,詞以字為基本單位的,但是一篇文章的語義表達卻仍然是以詞來劃分的。       自中文自動分詞被提出以來,歷經將近30年的探索,提出了很多方法,可

webpack官方文檔分析安裝

目錄 單獨 https div script version clas .com 我們 一:安裝 1、首先要安裝Node.js->node.js下載 2、本地安裝   要安裝最新版本或特定版本,運行如下: npm install --save-dev webpack

用Python預測某某國際平臺概率分析這個到底是什麽,是什麽樣的規則?

.... pan 又是 參與 其中 其他 nbsp 中國古代 合計 這個到底是什麽? 想必大家都玩過體彩,福彩,甚至6禾踩(懂了就行),以隨機的方式依次羅列出6個(或者7個,或者8個)的數字的集合,參與者可根據已經預訂的數字進行匹配,匹配正確3個以上是什麽什麽樣的獎勵,匹

轉載Docker源碼分析Docker架構

但是 server engine 設計實現 傳統 microsoft {} 操作 libc 原文地址: http://www.infoq.com/cn/articles/docker-source-code-analysis-part1 作者:孫宏亮 1 背景 1.1 D

Vue原始碼分析入口檔案

Vue原始碼分析(一):入口檔案   首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。 git clone https://github.com/vuejs/vue.git   這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具

Spring Cloud Eureka原理分析註冊過程-服務端

Eureka的官方文件和Spring Cloud Eureka文件都有很多含糊的地方,其他資料也不多,只有讀讀原始碼維持生活這樣子…… 本文將不會詳細介紹每個細節,而是講述一些關鍵的地方,便於查閱。 一些好的參考資料 對讓人一臉懵逼的region和zone的解釋 攜程對Eureka機制的剖析

Cat原始碼分析Client端

前言 cat的Client端所做的工作就是收集埋點資訊,將埋點資訊處理成messageTree,放到傳送佇列中,在啟動另一個執行緒,非同步消費佇列,進行訊息的傳送。 本文涉及到三個內容: 客戶端初始化:做了哪些準備工作 message的建立過程 客戶端的傳

bigdata資料分析Java環境配置

Java環境 1.下載jdk(用FileZilla工具連線伺服器後上傳到需要安裝的目錄) 在 /opt/deploy 下新建 java 資料夾:  # mkdir / opt/deploy /java   解壓命令:tar zxvf 壓縮包名稱 (例如:tar zxvf jdk-8u191-

Spark2.3.2原始碼解析 6. SparkContext原始碼分析 SparkEnv

    SparkContext 是通往 Spark 叢集的唯一入口,可以用來在 Spark 叢集中建立 RDDs 、 累加器( Accumulators )和廣播變數( Broadcast Variables ) 。 SparkContext 也是整個 Spark 應用程式(

第三章 - 有窮自動機與詞法分析

使用自動機和正則表示式判斷字串是否合法。 構造詞法分析器的方法可以分為人工方法和自動化方法。 3.1.1 詞法分析器的功能 ①每當程式設計師敲擊鍵盤上一個鍵時,自動向計算機輸入一個相應的8位二進位制碼,這種碼稱為ASCII碼。程式在計算機中被表示為ASCII碼序列,通常稱為源程式檔案。 ②翻譯時的最小

Rxjava2原始碼分析Flowable的建立和基本使用過程分析

本文用於記錄一下自己學習Rxjava2原始碼的過程。首先是最簡單的一個使用方法(未做執行緒切換),用來學習Flowable的建立和使用。Flowable .create(new FlowableOnSubscribe<Object>() {

(Stanford CS224d) Deep Learning and NLP課程筆記Deep NLP

Stanford大學在2015年開設了一門Deep Learning for Natural Language Processing的課程,廣受好評。並在2016年春季再次開課。我將開始這門課程的學習,並做好每節課的課程筆記放在部落格上。爭取做到每週一更吧。 本文是第一篇。 NLP簡介 NLP,全名Natu

RxJava2原始碼分析基本流程分析

前言:到現在這個階段,網上關於RxJava2原始碼分析的文章已經滿天飛了,我寫這篇文章的目的並不是說我會分析的比他們好,比他們透徹,這篇文章的目的只是單純的記錄自己分析RxJava2原始碼的成功及收穫。 概述   對於一個程式設計人的技術成長,一般會經歷三個階段,首先是學會使用開源庫,然後是知道

Docker原始碼分析Docker架構

1 背景 1.1 Docker簡介 Docker是Docker公司開源的一個基於輕量級虛擬化技術的容器引擎專案,整個專案基於Go語言開發,並遵從Apache 2.0協議。目前,Docker可以在容器內部快速自動化部署應用,並可以通過核心虛擬化技術(namespaces及c

Live555分析VS2008編譯

背景: RTSP(Real Time Streaming Protocol)實時流媒體協議: RFC 2326 The Real Time Streaming Protocol, or RTSP, is an application-level protocol for c

Netlink 核心實現分析建立

Netlink 是一種IPC(Inter Process Commumicate)機制,它是一種用於核心與使用者空間通訊的機制,同時它也以用於程序間通訊(Netlink 更多用於核心通訊,程序之間通訊更多使用Unix域套接字)。在一般情況下,使用者態和核心態通訊會使用傳統的

ThreadPoolExecutor原始碼分析重要成員變數

        ThreadPoolExecutor是一個通過使用可能幾個池執行緒之一來執行每個提交任務的ExecutorService,這些執行緒池通常通過Executors工廠方法進行配置。        ThreadPoolExecutor中的執行緒池處理了兩個不同的問