实体识别-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阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容