在這裡介紹一下CoreNLP進行自然語言處理一些知識。

功能列表

工具以及對各種語言的支持如下表(英文和中文支持的最好),分別對應:分詞,斷句,定詞性,詞元化,分辨命名實體,語法分析,情感分析,同義詞分辨等。

NER

什麼是命名實體識別(NER)?

命名實體識別(NER)是自然語言處理(NLP)中的基本任務之一。NLP的一般流程如下:

句法分析是NLP任務的核心,NER是句法分析的基礎。NER任務用於識別文本中的人名(PER)、地名(LOC)等具有特定意義的實體。非實體用O來表示。我們以人名來舉例:

(IOB是塊標記的一種表示。B-表示開始,I-表示內部,O-表示外部)

首先明確的是NER是個分類任務,具體稱為序列標註任務,即文本中不同的實體對應不同的標籤,人名-PER,地名-LOC,等等,相似的序列標註任務還有詞性標註、語義角色標註。傳統的解決此類問題的方法,包括:

(1) 基於規則的方法。根據語言學上預定義的規則。但是由於語言結構本身的不確定性,規則的制定上難度較大。

(2) 基於統計學的方法。利用統計學找出文本中存在的規律。主要有隱馬爾可夫(HMM)、條件隨機場(CRF)模型和Viterbi演算法。文末會簡要介紹比較流行的CRF模型。(3) 神經網路。因為文本的上下文依賴性,LSTM這種能夠存儲上下文信息的序列模型是較好的選擇(本文側重於CRF,LSTM的基本知識可參考《深度學習在機器翻譯中的應用》)。

LSTM+CRF模型語言文本的特殊之處在於其具有一定的結構,主謂賓定狀補,狀語後置,非限制性定語從句等等。這些結構的存在代表著每個單詞的前後是有著一定的詞性限制的。比如:

我現在回家 //這是常見的(主+狀+謂+賓)結構的句子

我今天家 //這樣的文本就不能稱為一個句子,少了必要的語法結構

LSTM網路是整體思路同樣是先對給定的訓練樣本進行學習,確定模型中的參數,再利用該模型對測試樣本進行預測得到最後的輸出。由於測試輸出的準確性現階段達不到100%,這就意味著,肯定存在一部分錯誤的輸出,這些輸出里很可能就包含類似於上述第二句話這種不符合語法規則的文本。因此,這就是為什麼要將CRF模型引入進來的原因。

**條件隨機場(CRF)**是一種統計方法。其用於文本序列標註的優點就是上文所說的對於輸出變數可以進行約束,使其符合一定的語法規則。常見的神經網路對訓練樣本的學習,只考慮訓練樣本的輸入,並不考慮訓練樣本的輸出之間的關係。附:條件隨機場(CRF)原理

要完全搞懂CRF的原理,可以參考李航的《統計學習方法》的第11章。這裡作簡要說明。CRF的基礎是馬爾可夫隨機場,或者稱為概率無向圖。

延伸

概率無向圖:用無向圖表示隨機變數的概率分布。

上圖就是滿足局部馬爾可夫性的概率無向圖。每個結點都代表著一個隨機變數,邊代表著隨機變數之間的關係。

局部馬爾可夫性: P(Yu|Yv)=P(Yu|Yv,Yw)簡單理解,因為Yu和Yw之間沒有邊連接,則在給定隨機變數Yv條件下的Yu的概率,跟多加了一個Yw無關。

CRF的理解

CRF可以理解為在給定隨機變數X的條件下,隨機變數Y的馬爾可夫隨機場。其中,線性鏈CRF(一種特殊的CRF)可以用於序列標註問題。CRF模型在訓練時,給定訓練序列樣本集(X,Y),通過極大似然估計、梯度下降等方法確定CRF模型的參數;預測時,給定輸入序列X,根據模型,求出P(Y|X)最大的序列y(這裡注意,LSTM輸出的是一個個獨立的類別,CRF輸出的是最優的類別序列,也就是CRF全局的優化要更好一些)。

線性鏈條件隨機場(可以比較一下與上面LSTM+CRF網路圖的區別與聯繫)

為何CRF可以表示輸出序列內各元素(Y1,Y2,…,Yi,Yi+1)之間的聯繫?這裡就是要聯繫到馬爾可夫性。這也就是為什麼CRF的基礎是馬爾可夫隨機場。CRF如何求解P(Y|X),有具體的數學公式,這裡就不詳細列出了。

首先關於命名主題識別:

#encoding="utf-8"
from stanfordcorenlp import StanfordCoreNLP
import os

if os.path.exists(D:\stanford_nlp\stanford-corenlp-full-2018-10-05):
print("corenlp exists")
else:
print("corenlp not exists")
nlp=StanfordCoreNLP(D:\stanford_nlp\stanford-corenlp-full-2018-10-05,lang=zh)
sentence = 王明是清華大學的一個研究生
#print (nlp.word_tokenize(sentence)) #分詞
#print (nlp.pos_tag(sentence)) #詞性
print (nlp.ner(sentence)) #NER

#print (nlp.parse(sentence)) #語法分析
#print (nlp.dependency_parse(sentence)) #語法依賴關係

[(『王明』, 『PERSON』), (『是』, 『O』), (『清華』, 『ORGANIZATION』), (『大學』, 『ORGANIZATION』), (『的』, 『O』), (『一』, 『NUMBER』), (『個』, 『O』), (『研究生』, 『O』)]

如果將命名實體拼接在在一起可以使用

res = nlp.ner(sentence)
tag = 0
name =
labels = []
for i in range(len(res)):
if res[i][1] != ORGANIZATION:
if tag != 0:
labels.append(name)
name =
tag = 0
else:
tag = 1
name += res[i][0]

print(res)
print(labels)

計算機語言學家羅賓森總結了依存語法的四條定理:

  • 一個句子中存在一個成分稱之為根(root),這個成分不依賴於其它成分; 其它成分直接依存於某一成分;
  • 任何一個成分都不能依存與兩個或兩個以上的成分;
  • 如果A成分直接依存於B成分,而C成分在句中位於A和B之間,那麼C或者直接依存於B,或者直接依存於A和B之間的某一成分;
  • 中心成分左右兩面的其它成分相互不發生關係。

使用斯坦福句法分析器做依存句法分析可以輸出句子的依存關係,Stanford parser基本上是一個辭彙化的概率上下文無關語法分析器,同時也使用了依存分析。

下面是對分析的結果中一些符號的解釋:

ROOT:要處理文本的語句
IP:簡單從句
NP:名詞短語
VP:動詞短語
PU:斷句符,通常是句號、問號、感嘆號等標點符號
LCP:方位詞短語
PP:介詞短語
CP:由『的』構成的表示修飾性關係的短語
DNP:由『的』構成的表示所屬關係的短語
ADVP:副詞短語
ADJP:形容詞短語
DP:限定詞短語
QP:量詞短語
NN:常用名詞
NR:固有名詞
NT:時間名詞
PN:代詞
VV:動詞
VC:是
CC:表示連詞
VE:有
VA:表語形容詞
AS:內容標記(如:了)
VRD:動補複合詞
CD: 表示基數詞
DT: determiner 表示限定詞
EX: existential there 存在句
FW: foreign word 外來詞
IN: preposition or conjunction, subordinating 介詞或從屬連詞
JJ: adjective or numeral, ordinal 形容詞或序數詞
JJR: adjective, comparative 形容詞比較級
JJS: adjective, superlative 形容詞最高級
LS: list item marker 列表標識
MD: modal auxiliary 情態助動詞
PDT: pre-determiner 前位限定詞
POS: genitive marker 所有格標記
PRP: pronoun, personal 人稱代詞
RB: adverb 副詞
RBR: adverb, comparative 副詞比較級
RBS: adverb, superlative 副詞最高級
RP: particle 小品詞
SYM: symbol 符號
TO:」to」 as preposition or infinitive marker 作為介詞或不定式標記
WDT: WH-determiner WH限定詞
WP: WH-pronoun WH代詞
WP$: WH-pronoun, possessive WH所有格代詞
WRB:Wh-adverb WH副詞

更多詞性參見附錄

print (nlp.parse(sentence))

輸出:

(ROOT(IP

(NP (NR 王明))

(VP (VC 是)(NP(DNP(NP (NR 清華) (NN 大學))(DEG 的))(QP (CD 一)(CLP (M 個)))(NP (NN 研究生))))))對應圖表為

語法依存關係

print (nlp.dependency_parse(sentence))

[(『ROOT』, 0, 8), (『nsubj』, 8, 1), (『cop』, 8, 2), (『compound:nn』, 4, 3), (『nmod:assmod』, 8, 4), (『case』, 4, 5), (『nummod』, 8, 6), (『mark:clf』, 6, 7)]

對應如下圖

附錄:

關係表示

bbrev: abbreviation modifier,縮寫
acomp: adjectival complement,形容詞的補充;
advcl : adverbial clause modifier,狀語從句修飾詞
advmod: adverbial modifier狀語
agent: agent,代理,一般有by的時候會出現這個
amod: adjectival modifier形容詞
appos: appositional modifier,同位詞
attr: attributive,屬性
aux: auxiliary,非主要動詞和助詞,如BE,HAVE SHOULD/COULD等到
auxpass: passive auxiliary 被動詞
cc: coordination,並列關係,一般取第一個詞
ccomp: clausal complement從句補充
complm: complementizer,引導從句的詞好重聚中的主要動詞
conj : conjunct,連接兩個並列的詞。
cop: copula。系動詞(如be,seem,appear等),(命題主詞與謂詞間的)連繫
csubj : clausal subject,從主關係
csubjpass: clausal passive subject 主從被動關係
dep: dependent依賴關係
det: determiner決定詞,如冠詞等
dobj : direct object直接賓語
expl: expletive,主要是抓取there
infmod: infinitival modifier,動詞不定式
iobj : indirect object,非直接賓語,也就是所以的間接賓語;
mark: marker,主要出現在有「that」 or 「whether」「because」, 「when」,
mwe: multi-word expression,多個詞的表示
neg: negation modifier否定詞
nn: noun compound modifier名片語合形式
npadvmod: noun phrase as adverbial modifier名詞作狀語
nsubj : nominal subject,名詞主語
nsubjpass: passive nominal subject,被動的名詞主語
num: numeric modifier,數值修飾
number: element of compound number,組合數字
parataxis: parataxis: parataxis,並列關係
partmod: participial modifier動詞形式的修飾
pcomp: prepositional complement,介詞補充
pobj : object of a preposition,介詞的賓語
poss: possession modifier,所有形式,所有格,所屬
possessive: possessive modifier,這個表示所有者和那個』S的關係
preconj : preconjunct,常常是出現在 「either」, 「both」, 「neither」的情況下
predet: predeterminer,前綴決定,常常是表示所有
prep: prepositional modifier
prepc: prepositional clausal modifier
prt: phrasal verb particle,動詞短語
punct: punctuation,這個很少見,但是保留下來了,結果當中不會出現這個
purpcl : purpose clause modifier,目的從句
quantmod: quantifier phrase modifier,數量短語
rcmod: relative clause modifier相關關係
ref : referent,指示物,指代
rel : relative
root: root,最重要的詞,從它開始,根節點
tmod: temporal modifier
xcomp: open clausal complement
xsubj : controlling subject 掌控者

中心語為謂詞

subj — 主語
nsubj — 名詞性主語(nominal subject) (同步,建設)
top — 主題(topic) (是,建築)
npsubj — 被動型主語(nominal passive subject),專指由「被」引導的被動句中的主語,一般是謂詞語義上的受事 (稱作,鎳)
csubj — 從句主語(clausal subject),中文不存在
xsubj — x主語,一般是一個主語下面含多個從句 (完善,有些)
中心語為謂詞或介詞
obj — 賓語
dobj — 直接賓語 (頒布,文件)
iobj — 間接賓語(indirect object),基本不存在
range — 間接賓語為數量詞,又稱為與格 (成交,元)
pobj — 介詞賓語 (根據,要求)
lobj — 時間介詞 (來,近年)
中心語為謂詞
comp — 補語
ccomp — 從句補語,一般由兩個動詞構成,中心語引導後一個動詞所在的從句(IP) (出現,納入)
xcomp — x從句補語(xclausal complement),不存在
acomp — 形容詞補語(adjectival complement)
tcomp — 時間補語(temporal complement) (遇到,以前)
lccomp — 位置補語(localizer complement) (占,以上)

中心語為名詞

mod — 修飾語(modifier)
pass — 被動修飾(passive)
tmod — 時間修飾(temporal modifier)
rcmod — 關係從句修飾(relative clause modifier) (問題,遇到)
numod — 數量修飾(numeric modifier) (規定,若干)
ornmod — 序數修飾(numeric modifier)
clf — 類別修飾(classifier modifier) (文件,件)
nmod — 複合名詞修飾(noun compound modifier) (浦東,上海) amod — 形容詞修飾(adjetive modifier) (情況,新)
advmod — 副詞修飾(adverbial modifier) (做到,基本)
vmod — 動詞修飾(verb modifier,participle modifier)
prnmod — 插入詞修飾(parenthetical modifier)
neg — 不定修飾(negative modifier) (遇到,不)
det — 限定詞修飾(determiner modifier) (活動,這些) possm — 所屬標記(possessive marker),NP
poss — 所屬修飾(possessive modifier),NP
dvpm — DVP標記(dvp marker),DVP (簡單,的)
dvpmod — DVP修飾(dvp modifier),DVP (採取,簡單)
assm — 關聯標記(associative marker),DNP (開發,的)
assmod — 關聯修飾(associative modifier),NP|QP (教訓,特區) prep — 介詞修飾(prepositional modifier) NP|VP|IP(採取,對) clmod — 從句修飾(clause modifier) (因為,開始)
plmod — 介詞性地點修飾(prepositional localizer modifier) (在,上) asp — 時態標詞(aspect marker) (做到,了)
partmod– 分詞修飾(participial modifier) 不存在

中心語為實詞

conj — 聯合(conjunct)
cop — 系動(copula) 雙指助動詞????
cc — 連接(coordination),指中心詞與連詞 (開發,與)

其它

attr — 屬性關係 (是,工程)
cordmod– 並列聯合動詞(coordinated verb compound) (頒布,實行) mmod — 情態動詞(modal verb) (得到,能)
ba — 把字關係
tclaus — 時間從句 (以後,積累)
— semantic dependent
cpm — 補語化成分(complementizer),一般指「的」引導的CP (振興,的)

以上錯誤之處,還請批評留言指正。

此模型添加自定義詞比較麻煩,不建議使用

作者:零壹講師鏈接:imooc.com/article/26822來源:慕課網本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作


推薦閱讀:

接手別人的代碼,死的心有嗎?

普通的程序員和大神級的程序員有什麼區別?

網上黑程序員的現實依據是什麼?程序員真的那麼悲慘嗎?

有哪些視頻堪稱有毒?

暴露真實IP真的沒關係嗎?

有哪些程序員特有的習慣?

月薪3萬的程序員都避開了哪些坑?

和程序猿談戀愛是一種怎樣的體驗?


推薦閱讀:
相关文章