知識(shí)圖譜-LSTM+CRF知識(shí)抽取實(shí)戰(zhàn)

一、引言

本文的idea主要來源于LSTM+CRF的命名實(shí)體識(shí)別西剥,在命名實(shí)體識(shí)別中,可以通過BIO或者BIOSE等標(biāo)注進(jìn)行人名亿汞、地名瞭空、機(jī)構(gòu)名或者其他專有名詞的識(shí)別,那么把三元組的主語疗我、謂語咆畏、賓語(也可理解為:實(shí)體-關(guān)系-實(shí)體)三個(gè)部分當(dāng)成三個(gè)需要識(shí)別的專有名詞,也就可以實(shí)現(xiàn)三元組的抽取了吴裤,基于此想法旧找,具體實(shí)踐看看效果。

二麦牺、實(shí)踐簡(jiǎn)介

1钮蛛、數(shù)據(jù)來源

本文主要基于歷史文章中的人物關(guān)系抽取鞭缭,數(shù)據(jù)來源于http://www.lishixinzhi.comhttp://www.uuqgs.com/

2、預(yù)測(cè)類別(7個(gè))

主語開頭:B-SUBJECT
主語非開頭:I-SUBJECT
謂語開頭:B-PREDICATE
謂語非開頭:I-PREDICATE
賓語開頭:B-OBJECT
賓語非開頭:I-OBJECT
其他:O

3魏颓、框架

keras

4岭辣、模型結(jié)構(gòu)

本次抽取本質(zhì)上還是基于LSTM的一個(gè)分類問題,至于CRF層甸饱,完全是為了保證序列的輸出嚴(yán)格性沦童,因?yàn)镃RF對(duì)于預(yù)測(cè)序列有較強(qiáng)的的限制性,比如B-PRESON后面只能為I-PERSON或者O之類的限制叹话。

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_1 (Embedding)      (None, 91, 100)           60000     
_________________________________________________________________
bidirectional_1 (Bidirection (None, 91, 100)           60400     
_________________________________________________________________
time_distributed_1 (TimeDist (None, 91, 7)             707       
_________________________________________________________________
crf_1 (CRF)                  (None, 91, 7)             119       
=================================================================
Total params: 121,226
Trainable params: 61,226
Non-trainable params: 60,000

5偷遗、項(xiàng)目流程

    # 獲取詞典映射
    word2id, tag2id, id2word, id2tag = getWordAndTagId('train.txt')
    # 獲取句子和標(biāo)注
    sentences, tags = getSentencesAndTags('train.txt')
    # 將句子和標(biāo)注轉(zhuǎn)換為id
    sentencesIds, tagsIds = sentencesAndTags2id(sentences, tags,word2id, tag2id)
    # 將句子和標(biāo)注進(jìn)行填充,確保輸入維度一致
    sentencesIds = pad_sequences(sentencesIds, padding='post')
    tagsIds = pad_sequences(tagsIds, padding='post')
    print(sentencesIds.shape)
    print(tagsIds.shape)
    # 載入模型
    model = model(len(word2id),100,sentencesIds.shape[1],len(tag2id))
   # 訓(xùn)練
    history = model.fit(sentencesIds, tagsIds.reshape([len(tagsIds),-1,1]), epochs=500)

三驼壶、數(shù)據(jù)標(biāo)注

關(guān)于訓(xùn)練數(shù)據(jù)鹦肿,未找到合適的標(biāo)注數(shù)據(jù),只能自己標(biāo)注了辅柴,如下:

長 B-SUBJECT
孫 I-SUBJECT
無 I-SUBJECT
忌 I-SUBJECT
看 O
到 O
外 B-PREDICATE
甥 I-PREDICATE
承 B-OBJECT
乾 I-OBJECT
、 O
李 B-OBJECT
泰 I-OBJECT
都 O
完 O
了 O
瞭吃。 O

唐 B-SUBJECT
玄 I-SUBJECT
宗 I-SUBJECT
有 O
兩 O
個(gè) O
同 O
母 O
妹 B-PREDICATE
妹 I-PREDICATE
: O
金 B-OBJECT
仙 I-OBJECT
公 I-OBJECT
主 I-OBJECT
和 O
玉 B-OBJECT
真 I-OBJECT
公 I-OBJECT
主 I-OBJECT
碌嘀。 O

...此處省略n多

李 B-SUBJECT
文 I-SUBJECT
有 O
兩 O
個(gè) O
妹 B-PREDICATE
妹 I-PREDICATE
, O
一 O
個(gè) O
叫 O
宇 B-OBJECT
宇 I-OBJECT
歪架, O
一 O
個(gè) O
叫 O
佳 B-OBJECT
佳 I-OBJECT
股冗。 O

四、實(shí)戰(zhàn)

1和蚪、數(shù)據(jù)預(yù)處理

1.1 詞典映射

主要是低頻詞過濾,字與id的映射(word2id)止状、預(yù)測(cè)類別與id的映射(lable2id),具體實(shí)現(xiàn)方式各有不同攒霹,不做重點(diǎn)講解怯疤,但要特別注意未登錄詞的處理:

 word_size = len(words)
 word2id = {count[0]: index for index, count in enumerate(words,start=1)}  
 id2word = {index: count[0] for index, count in enumerate(words,start=1)}
 tag2id = {count[0]: index for index, count in enumerate(tags)}
 id2tag = {index: count[0] for index, count in enumerate(tags)}
 #  填充詞
 word2id['<PAD>'] = 0
#  未登錄詞
 word2id['<UNK>'] = word_size + 1

1.2 從訓(xùn)練文件中獲取句子和標(biāo)簽

def getSentencesAndTags(filePath):
    '''
    從文件里面獲取句子和標(biāo)注
    :param filePath:
    :return:
    '''
    with open(filePath,encoding='utf-8') as file:
        wordsAndtags=[line.split() for line in file]
        sentences=[]
        tags=[]
        sentence=[]
        tag=[]
        for wordAndTag in wordsAndtags:
            if len(wordAndTag)==2:
                sentence.append(wordAndTag[0])
                tag.append(wordAndTag[1])
            else:
                sentences.append(sentence)
                tags.append(tag)
                sentence=[]
                tag = []
    return sentences,tags

1.3 輸入文本轉(zhuǎn)id

將輸入的文本,通過詞典催束,轉(zhuǎn)換成數(shù)字序列:

def sentencesAndTags2id(sentences,tags,word2id, tag2id):
    '''
    將句子和標(biāo)注轉(zhuǎn)換為id
    :param sentences:
    :param tags:
    :param word2id:
    :param tag2id:
    :return:
    '''
    sentencesIds = [[word2id.get(char,len(word2id)) for char in sentence] for sentence in sentences]
    tagsIds = [[tag2id[char] for char in tag] for tag in tags]
    return sentencesIds,tagsIds

1.4 數(shù)據(jù)填充

為了保證數(shù)據(jù)的維度一致集峦,進(jìn)行句子填充

from keras_preprocessing.sequence import pad_sequences
sentencesIds = pad_sequences(sentencesIds, padding='post')
tagsIds = pad_sequences(tagsIds, padding='post')

2、模型構(gòu)建

def model(vocabSize,embeddingDim,inputLength,tagSize):
    model = Sequential()
    model.add(Embedding(vocabSize + 1,embeddingDim,input_length=inputLength,mask_zero=True))
    model.add(Bidirectional(LSTM(50, return_sequences=True)))
    model.add(TimeDistributed(Dense(tagSize)))
    crf_layer = CRF(tagSize, sparse_target=True)
    model.add(crf_layer)
    model.compile('adam', loss=crf_layer.loss_function, metrics=[crf_layer.accuracy])
    model.summary()
    return model

3抠刺、測(cè)試

通過簡(jiǎn)單的測(cè)試結(jié)果如下:


image.png

比較簡(jiǎn)單的句子上都能取得比較好的成果塔淤,但是由于訓(xùn)練數(shù)據(jù)不夠,還是會(huì)出現(xiàn)無法抽取到結(jié)果或者抽取錯(cuò)誤的情況速妖,比如:


image.png

4高蜂、總結(jié)

本文主要針對(duì)歷史故事的人物關(guān)系進(jìn)行抽取,從數(shù)據(jù)獲取罕容,到數(shù)據(jù)標(biāo)注备恤,到模型訓(xùn)練稿饰。由于時(shí)間和人力關(guān)系,很多方面都采取了簡(jiǎn)單模式烘跺,比如數(shù)據(jù)標(biāo)注湘纵,數(shù)據(jù)量遠(yuǎn)遠(yuǎn)沒有達(dá)到一個(gè)量級(jí),比如測(cè)試環(huán)節(jié)滤淳,主要還是通過人為觀察抽取結(jié)果來驗(yàn)證是否準(zhǔn)確梧喷,無法達(dá)到工業(yè)級(jí)別。但對(duì)于三元組的抽取脖咐,可以作為一種參考和借鑒铺敌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屁擅,隨后出現(xiàn)的幾起案子偿凭,更是在濱河造成了極大的恐慌,老刑警劉巖派歌,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弯囊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡胶果,警方通過查閱死者的電腦和手機(jī)匾嘱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來早抠,“玉大人霎烙,你說我怎么就攤上這事∪锪” “怎么了悬垃?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甘苍。 經(jīng)常有香客問我尝蠕,道長,這世上最難降的妖魔是什么载庭? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任趟佃,我火速辦了婚禮,結(jié)果婚禮上昧捷,老公的妹妹穿的比我還像新娘闲昭。我一直安慰自己,他們只是感情好靡挥,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布序矩。 她就那樣靜靜地躺著,像睡著了一般跋破。 火紅的嫁衣襯著肌膚如雪簸淀。 梳的紋絲不亂的頭發(fā)上瓶蝴,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音租幕,去河邊找鬼舷手。 笑死,一個(gè)胖子當(dāng)著我的面吹牛劲绪,可吹牛的內(nèi)容都是我干的男窟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼贾富,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼歉眷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颤枪,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤汗捡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后畏纲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扇住,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年盗胀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了台囱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡读整,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咱娶,到底是詐尸還是另有隱情米间,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布膘侮,位于F島的核電站屈糊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琼了。R本人自食惡果不足惜逻锐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雕薪。 院中可真熱鬧昧诱,春花似錦、人聲如沸所袁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燥爷。三九已至蜈亩,卻和暖如春懦窘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稚配。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工畅涂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人道川。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓午衰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愤惰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苇经,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容