中文命名實體提取


命名實體識別(Named EntitiesRecognition,NER)是自然語言處理的一個基礎任務。其目的是識別語料中人名、地名、組織機構名等命名實體。

由於命名實體數量不斷增加,通常不可能在詞典中窮盡列出,且其構成方法具有各自的一些規律性,因而,通常把對這些詞的識別從詞匯形態處理(如漢語切分)任務中獨立處理,稱為命名實體識別。

命名實體識別技術是信息抽取、信息檢索、機器翻譯、問答系統等多種自然語言處理技術必不可少的組成部分。

常見的命名實體識別方法綜述

命名實體是命名實體識別的研究主體,一般包括三大類(實體類、時間類和數字類)和七小類(人名、地名、機構名、時間、日期、貨幣和百分比)命名實體。評判一個命名實體是否被正確識別包括兩個方面:實體的邊界是否正確和實體的類型是否標注正確。

命名實體識別的主要技術方法分為:基於規則和詞典的方法、基於統計的方法、二者混合的方法等。

1.基於規則和詞典的方法。

基於規則的方法多采用語言學專家手工構造規則模板,選用特征包括統計信息、標點符號、關鍵字、指示詞和方向詞、位置詞(如尾字)、中心詞等方法,以模式和字符串相匹配為主要手段,這類系統大多依賴於知識庫和詞典的建立。基於規則和詞典的方法是命名實體識別中最早使用的方法,一般而言,當提取的規則能比較精確地反映語言現象時,基於規則的方法性能要優於基於統計的方法。但是這些規則往往依賴於具體語言、領域和文本風格,編制過程耗時且難以涵蓋所有的語言現象,特別容易產生錯誤,系統可移植性不好,對於不同的系統需要語言學專家重新書寫規則。基於規則的方法的另外一個缺點是代價太大,存在系統建設周期長、移植性差而且需要建立不同領域知識庫作為輔助以提高系統識別能力等問題。

2.基於統計的方法。

基於統計機器學習的方法主要包括隱馬爾可夫模型(HiddenMarkovMode,HMM)、最大熵(MaxmiumEntropy,ME)、支持向量機(Support VectorMachine,SVM)、條件隨機場(ConditionalRandom Fields,CRF)等。

在基於統計的這四種學習方法中,最大熵模型結構緊湊,具有較好的通用性,主要缺點是訓練時間長復雜性高,有時甚至導致訓練代價難以承受,另外由於需要明確的歸一化計算,導致開銷比較大。而條件隨機場為命名實體識別提供了一個特征靈活、全局最優的標注框架,但同時存在收斂速度慢、訓練時間長的問題。一般說來,最大熵和支持向量機在正確率上要比隱馬爾可夫模型高一些,但隱馬爾可夫模型在訓練和識別時的速度要快一些,主要是由於在利用 Viterbi 算法求解命名實體類別序列時的效率較高。隱馬爾可夫模型更適用於一些對實時性有要求以及像信息檢索這樣需要處理大量文本的應用,如短文本命名實體識別。

基於統計的方法對特征選取的要求較高,需要從文本中選擇對該項任務有影響的各種特征,並將這些特征加入到特征向量中。依據特定命名實體識別所面臨的主要困難和所表現出的特性,考慮選擇能有效反映該類實體特性的特征集合。主要做法是通過對訓練語料所包含的語言信息進行統計和分析,從訓練語料中挖掘出特征。有關特征可以分為具體的單詞特征、上下文特征、詞典及詞性特征、停用詞特征、核心詞特征以及語義特征等。

基於統計的方法對語料庫的依賴也比較大,而可以用來建設和評估命名實體識別系統的大規模通用語料庫又比較少。

3.混合方法。

自然語言處理並不完全是一個隨機過程,單獨使用基於統計的方法使狀態搜索空間非常龐大,必須借助規則知識提前進行過濾修剪處理。目前幾乎沒有單純使用統計模型而不使用規則知識的命名實體識別系統,在很多情況下是使用混合方法:

  1. 統計學習方法之間或內部層疊融合。
  2. 規則、詞典和機器學習方法之間的融合,其核心是融合方法技術。在基於統計的學習方法中引入部分規則,將機器學習和人工知識結合起來。
  3. 將各類模型、算法結合起來,將前一級模型的結果作為下一級的訓練數據,並用這些訓練數據對模型進行訓練,得到下一級模型。

命名實體識別的一般流程

如下圖所示,一般的命名實體流程主要分為四個步驟:

  1. 對需要進行提取的文本語料進行分詞;
  2. 獲取需要識別的領域標簽,並對分詞結果進行標簽標注;
  3. 對標簽標注的分詞進行抽取;
  4. 將抽取的分詞組成需要的領域的命名實體。

enter image description here

動手實戰命名實體識別

下面通過 jieba 分詞包和 pyhanlp 來實戰命名實體識別和提取。

1.jieba 進行命名實體識別和提取。

第一步,引入 jieba 包:

import jieba
import jieba.analyse
import jieba.posseg as posg

第二步,使用 jieba 進行詞性切分,allowPOS 指定允許的詞性,這里選擇名詞 n 和地名 ns:

sentence = u'''上線三年就成功上市,拼多多上演了互聯網企業的上市奇跡,卻也放大平台上存在的諸多問題,拼多多在美國上市。'''
kw = jieba.analyse.extract_tags(sentence, topK=10, withWeight=True, allowPOS=('n', 'ns'))
for item in kw:
    print(item[0], item[1])

在這里,我們可以得到打印出來的結果:

上市 1.437080435586

上線 0.820694551317

奇跡 0.775434839431

互聯網 0.712189275429

平台 0.6244340485550001

企業 0.422177218495

美國 0.415659623166

問題 0.39635135730800003

可以看得出,上市和上線應該是動詞,這里給出的結果不是很准確。接下來,我們使用 textrank 算法來試試:

kw=jieba.analyse.textrank(sentence,topK=20,withWeight=True,allowPOS=('ns','n'))
for item in kw:
    print(item[0],item[1])

這次得到的結果如下,可見,兩次給出的結果還是不一樣的。

上市 1.0

奇跡 0.572687398431635

企業 0.5710407272273452

互聯網 0.5692560484441649

上線 0.23481844682115297

美國 0.23481844682115297

2.pyhanlp 進行命名實體識別和提取。

第一步,引入pyhanlp包:

from pyhanlp import *

第二步,進行詞性切分:

sentence = u'''上線三年就成功上市,拼多多上演了互聯網企業的上市奇跡,卻也放大平台上存在的諸多問題,拼多多在美國上市。'''
analyzer = PerceptronLexicalAnalyzer()
segs = analyzer.analyze(sentence)
arr = str(segs).split(" ")

第三步,定義一個函數,從得到的結果中,根據詞性獲取指定詞性的詞:

def get_result(arr):
    re_list = []
    ner = ['n', 'ns']
    for x in arr:
        temp = x.split("/")
        if (temp[1] in ner):
            re_list.append(temp[0])
    return re_list

第四步,我們獲取結果:

result = get_result(arr)
print(result)

得到的結果如下,可見比 jieba 更准確:

['互聯網', '企業', '奇跡', '平台', '問題', '美國']

總結

本文對命名實體識別的方法進行了總結,並給出一般的處理流程,最后通過簡單的 jieba 分詞和 pyhanlp 分詞根據詞性獲取實體對象,后續大家也可以嘗試通過哈工大和斯坦福的包來處理。

參考文獻

  1. 命名實體識別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM