實體識別-0

實體識別的領域是建筑領域,處理的文本是《地鐵設計規范》,2014 年 3 月 1 日開始施行的。
參考的基準代碼是https://github.com/Determined22/zh-NER-TF,該源碼設計的模型,參考的論文是這兩篇,Bidirectional LSTM-CRF Models for Sequence Tagging
Neural Architectures for Named Entity Recognition
(注:但是目前寫這一篇時,尚未將代碼和論文模型進行比對)
現將所更改的一些內容,進行記錄。
1.因為我的實體類別粗粒度分為6類,細粒度分為18類,因此默認寫死的tag2lable顯得不太靈活

tag2label.png

并且對應于字編號,我將這一變量更名為tag2id,同時因為字編號的使用方式是寫入文件,由使用方進行讀取使用,所以tag2id也寫入文件,分開兩個文件寫(TODO:可以寫入同一個文件,參考ChineseNER這個代碼的寫法)
代碼位置:data.py/vocab_build

def vocab_build(vocab_dir, corpus_path, min_count):
    """

    :param vocab_dir:
    :param corpus_path:
    :param min_count:
    :return:
    """
    data = read_corpus(corpus_path)
    # word2id篩選掉不滿足字頻的字,將其他字進行編號,并把英文用<ENG>,數字用<NUM>,然后再給未來沒有在字典中的字留一個<UNK>
    # 用<UNK>來代替,把不滿足統一句子長度的句子用<PAD>進行填充,形成這樣子的一個字典;其中<PAD>編號為0,<UNK>為最大編號
    # word2id = {'<PAD>': 0, '': , '': , .. '<ENG>': , '': , ..  '<NUM>': , '': , ..  '<UNK>': }
    word2id = {}
    tag2id = {}
    tag_id = 0
    for sent_, tag_ in data:
        for word in sent_:
            if word.isdigit():
                word = '<NUM>'
            # A-Z, a-z
            elif ('\u0041' <= word <='\u005a') or ('\u0061' <= word <='\u007a'):
                word = '<ENG>'
            if word not in word2id:
                word2id[word] = [len(word2id)+1, 1]
            else:
                word2id[word][1] += 1

        for tag in tag_:
            if tag not in tag2id:
                tag2id[tag] = tag_id
                tag_id += 1
    low_freq_words = []
    for word, [word_id, word_freq] in word2id.items(): # 其實這個word_id真的沒用到,表示字加入字典時的序號
        if word_freq < min_count and word != '<NUM>' and word != '<ENG>':
            low_freq_words.append(word)
    for word in low_freq_words:
        del word2id[word]

    # 后面修改一下按照字頻去編號,這個也是參考https://github.com/zjy-ucas/ChineseNER
    new_id = 1
    for word in word2id.keys():
        word2id[word] = new_id
        new_id += 1
    word2id['<UNK>'] = new_id # 查找表中沒有對應的自嵌入,被替換成UNK,使用UNK對應的嵌入
    word2id['<PAD>'] = 0 # 為了保證每個batch句子長度一致,用PAD對應嵌入填充句子

    # print(len(word2id))
    word_vocab_path = os.path.join(vocab_dir, 'word2id.pkl')
    with open(word_vocab_path, 'wb') as fw:
        pickle.dump(word2id, fw) # 將對象寫入打開的文件中,二進制;反序列化load()

    tag_vocab_path = os.path.join(vocab_dir, 'tag2id.pkl')
    with open(tag_vocab_path, 'wb') as fw:
        pickle.dump(tag2id, fw)

2.適應tag2id和word2id的使用方式
原有main.py中,只讀取word2id,因為tag2id是寫死的,如下圖


讀取word2id.png

改為


i讀取word2id和tag2id.png

對應這個參數是文件夾,因此,將data.py/read_dictionary修改如下
def read_dictionary(vocab_dir):
    """
    讀取字典文件
    :param vocab_path:
    :return:
    """
    word_vocab_path = os.path.join(vocab_dir, 'word2id.pkl')
    with open(word_vocab_path, 'rb') as fr:
        word2id = pickle.load(fr)
    print('vocab_size:', len(word2id))
    tag_vocab_path = os.path.join(vocab_dir, 'tag2id.pkl')
    with open(tag_vocab_path, 'rb') as fr:
        tag2id = pickle.load(fr)
    print('vocab_size:', len(tag2id))
    return word2id, tag2id

3.在這個預處理得到字編號的過程中,將不滿足字頻的字進行了刪除,具體邏輯在data.py/vocab_build,字頻限制使用min_count這個變量,對了,在開始訓練前,需要先得到字編號和標簽編號,因此首先需要在data.py中,我首先設置的詞頻是3,這個后面也可以作為要調的一個參數

if __name__ == '__main__':
    '''
    vocab_dir = 'data_path/rail_data18'
    corpus_path = 'data_path/rail_data18/train_data'
    '''
    vocab_dir = 'data_path/rail_data6'
    corpus_path = 'data_path/rail_data6/train_data'
    min_count = 3
    vocab_build(vocab_dir, corpus_path, min_count)
    word2id, tag2id = read_dictionary(vocab_dir)
    print(word2id)
    print(tag2id)

4.將結果寫入部分,進行了改動,源碼中是unicode了,改為不進行編碼

not encode.png

5.main.py中將訓練數據的默認路徑進行修改,如圖
數據文件默認位置.png

源代碼中是將測試數據用作驗證用,但我有構造出驗證數據,因此使用驗證數據進行驗證
dev_test1.png

dev_test2.png

6.添加perl語言的解析環境
windows
activeperl官網下載安裝,命令行perl -v檢查安裝成功,但是需要重啟電腦才能被識別到
linux
檢查是否已經安裝:perl -v,沒有直接用rpm安裝就可以了
7.將數據集放入相應的位置,就可以跑起來代碼了
訓練命令:python main.py --mode=train
測試命令:python main.py --mode=test --demo_model=1608281271(后面那個數字為訓練的模型)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容