自然語言處理之詞性標註

2021-09-26 13:19:17 字數 3475 閱讀 3771

詞性標註作為nlp領域的一項基本任務,其與分詞任務同等重要,是很多任務的基礎,比如句法分析,命名實體識別等。命名實體識別在一定程度上也屬於標註任務,不過,難度相比一般的詞性標註而言,上公升了不少。對於詞性標註而言,不論是中文還是英文,其難點在於對於不同的語境,詞性的多變化;另一方面,隨著社會的發展,很多詞都會潛移默化的產生額外的詞性。相信這些現象,大家都有所感觸,也經常遇到這些情況,就不再舉例了。從技術來說,詞性標註也依賴於分詞,不同的分詞,對於結果的標註也會不同,比如「讀書」,如果分詞結果為「/讀/書/」,那顯然是「動詞+名詞」的序列結構;如果是「/讀書/」,則是「名詞」的單個詞性。因此在進行詞性標註任務時,一般都需要先將句子進行分詞,然後基於分詞的結果再進行詞性標註。

目前,詞性標註的方法也比較多,在ai領域,有很多詞性標註器,這些方法都已經嵌入到成型的自然語言處理工具包中,比如jieba軟體,hanlp,nltk等。然而,從自然語言的層面上來看待詞性標註問題,不同的語言,詞性標註的難度截然不同,比如英文和中文。對於英文而言,分詞不僅相比中文要簡單,而且詞性標註也相比中文要簡單,即使單獨通過詞的形態學來處理也可以獲得很高的標註準確率,這裡的詞的形態學指的是詞的結構,包括字首,字尾,時態等等,英文的時態豐富,字首、字尾具有明顯的區分標誌,甚至不用考慮上下文,就可以獲得很好的標註效果。而中文缺少形態變化,不能從詞的形態來識別詞性;另外乙個難點在於,對於不同的詞性標註器,其擁有屬於自己的一套標註符號集,也就是說,使用不同的標註器,標註的詞性可能相同,但是,符號不同,不統一,因為,詞類的劃分粒度和標記符號不同,目前還沒有乙個統一的標準,比如ldc標註語料中,將中文詞性劃分為33類,而北大語料庫則分為26類。詞類劃分標準和標記符號的不統一,以及分詞規範的含糊,都給詞性標註帶來了很大的困難。還有很多問題還未解決,因此,看似這些已經基本解決的nlp基礎問題,其實還需要投入很大的研究精力來挖掘潛在的價值。

詞性標註演算法從目前的使用情況來看,主要分為兩類,一種是基於規則的方法,主要指的是基於字串匹配的詞典查詢演算法;另外一種是基於資料驅動的方法,比如機器學習方法。首先,基於字串匹配的詞典查詢演算法,主要過程為:先對句子進行分詞,然後從詞典中查詢每個詞語的詞性,對其進行標註即可。這種方法非常簡單,但是無法解決一詞多詞性問題。而採用機器學習方法的詞性標註演算法,比如hmm,crf等方法具有非常好的效果。對於hmm,其包括3個量,初始狀態概率向量、狀態轉移概率矩陣、觀測概率矩陣。在具體的詞性標註問題上,觀測序列為分詞後的句子,狀態序列(或者標記序列、隱狀態序列都乙個意思)為經過標註後的詞性標註序列。而模型的3個量可以通過大量的語料計算得到。這樣,對於標註問題,很容易計算得到hmm模型引數,再結合分詞後的原句子序列,便將問題轉換為模型的**問題,即已知模型和觀測序列,來**標記序列(或者說狀態序列)。這是hmm的經典應用場景。

在工業界,比較常用的中文處理軟體包括jieba,hanlp等,在這裡,以jieba軟體為例,並對其原理進行剖析。jieba的詞性標註的結果,對於每個詞的詞性,採用和ictclas相容的標記法。使用方法如下:

# -*- coding:utf-8 -*-

import jieba.posseg as pseg

words = pseg.cut("我喜歡研究演算法")

for word, flag in words:

print("%s %s" % (word, flag))

執行後,結果如下:

下面對pseg.cut()的原理進行一波分析:

1.準備工作:首先檢查詞典是否初始化好,如果沒有則先初始化詞典,比如上面的「紅色字型」顯示。將句子的編碼解碼為unicode編碼格式。根據正規表示式進行匹配,將輸入文字切分成乙個個的句子。

2.遍歷句子組成的列表,對每乙個句子進行單獨分詞和詞性標註。

3.如果句子中含有未登入詞,使用hmm進行處理。

jieba分詞的主程式原始碼如下:

def cut(self, sentence, cut_all=false, hmm=true):

'''本函式的主要作用是將句子切分成詞

引數:- sentence: 要被切分的句子,必須是unicode編碼,如果是其他編碼,必須要解碼為unicode

- cut_all: 選擇的切分方法,是採用全模式還是精確模式。對於全模式,是為了把句子中所有的可能

成詞的詞語都切分出來,速度快,但是不能解決歧義。而精確模式,試圖將句子進行

最精確的切分,一般是我們最想要的結果,適合文字分析。

- hmm: 是否使用hmm,一般對於含有未登入詞的句子的分詞,採用hmm會獲得更好的分詞效果

'''sentence = strdecode(sentence) # 將句子解碼為unicode編碼

# 模式選擇,對於不同的模式,選擇不同的正規表示式物件

if cut_all:

re_han = re_han_cut_all

re_skip = re_skip_cut_all

else:

re_han = re_han_default

re_skip = re_skip_default

# 設定不同模式下的cut_block的分詞方法

if cut_all:

cut_block = self.__cut_all

elif hmm:

cut_block = self.__cut_dag

else:

cut_block = self.__cut_dag_no_hmm

blocks = re_han.split(sentence)

# 先採用正規表示式進行粗切分,通過yield返回詞語生成器,生成器的好處是可以節約記憶體

for blk in blocks:

if not blk:

continue

if re_han.match(blk):

for word in cut_block(blk):

yield word

else:

tmp = re_skip.split(blk)

for x in tmp:

if re_skip.match(x):

yield x

elif not cut_all:

for xx in x:

yield xx

else:

yield x

分詞之後,便可以進行詞性標註了,這裡主要介紹如何使用hmm來對未登入詞進行處理。通過大規模的語料計算,可以計算得到hmm的引數,然後結合模型的**演算法,將觀測序列(分詞之後的句子)轉換為標註序列(狀態序列)。這樣便完成了未登入詞的詞性標註。

最後,做個總結。jieba作為乙個高效的nlp軟體包,它可以在分詞的同時完成詞性標註,因此標註的速度是非常快的。而且,在整個過程中,通過字典查詢的方法識別詞的詞性,通過hmm模型來完成對未登入詞的詞性標註,從而達到對整個句子的分詞和詞性標註。但是,字典查詢的方式無法解決一詞多詞性的問題,因此,在精度上還是有所欠缺的。關於jieba軟體的更多細節,請參見官方原始碼

自然語言處理基礎技術之詞性標註實戰

安裝 pip install jieba 國內源安裝更快 pip install jieba i 先導包 jieba.posseg.dt 為預設詞性標註分詞器 標註句子分詞後每個詞的詞性,採用和 ictclas 相容的標記法。jieba貌似不能處理英文,後面會介紹處理英文的 import jieba...

自然語言處理 詞性標註(北大,賓州)

詞性標註在中文領域暫無統一的標註標準,最常見較為主流的是北大和賓州詞性標註集。詞性編碼 詞性名稱 註解ag 形語素形容詞語素。形容詞 為a,語素 為g前面置以a a形容詞 取英語形容詞adjective的第1個字母 ad副形詞 直接作狀語的形容詞。形容詞 a和副詞 d並在一起 an名形詞 具有名詞功...

自然語言處理系列二十一》詞性標註》詞性標註原理

分布式機器學習實戰 人工智慧科學與技術叢書 陳敬雷編著 清華大學出版社 總結詞性標註 part of speech tagging,pos tagging 也被稱為語法標註 grammatical tagging 或詞類消疑 word category disambiguation 是語料庫語言學 ...