用深度学习做命名实体识别(附代码)

标签: BILSTM-CRF
作者: 炼己者


欢迎大家访问我的简书以及我的博客
本博客所有内容以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢!

基于CRF做命名实体识别系列
用CRF做命名实体识别(一)
用CRF做命名实体识别(二)
用CRF做命名实体识别(三)

一. 摘要

  • 之前用CRF做了命名实体识别,效果还可以,最高达到0.9293,当然这是自己用sklearn写的计算F1值,后来用conlleval.pl对CRF测试结果进行评价,得到的F1值是0.9362
  • 接下来基于BILSTM-CRF做命名实体识别,代码不是自己写的,用的github上的一个大佬写的,换了自己的数据集,得到最终的结果是0.92
  • 本文主要简单的介绍下BILSTM-CRF的原理,以及如何把大佬的数据集换成我们自己的数据集,进行训练。

二. 正文

如果你想细致地了解BILSTM,那你首先得去看RNN(循环神经网络),然后再看RNN的升级版本LSTM,最好才能过渡到BILSTM。了解完这些再去看CRF(条件随机场),CRF这边可又是一番天地了,等你了解完你的老板该炒你鱿鱼了。所以对于初学者我一向主张不择手段先把模型跑下来,跑出结果,然后才有信心去好好学习原理。在这里还是要好好感谢那位大佬。

1. BILSTM-CRF的原理简介

如果你不懂什么叫做BILSTM,CRF,没关系,你只要知道他们是命名实体识别里两个层就行,就像神经网络里的概念一样,层次结构。


BILSTM-CRF

如上图,这里面做了一件什么事情呢?

  • 输入是词向量,这个直接用word2vec训练就能得到
  • 输出是每个句子预测的标签

流程

词向量输入到 BILSTM层 ,然后输出值是这句话每个标签的预测分数,这些分数便是 CEF层 的输入,其实没有CRF层我们也可以训练 BILSTM,但是我们就不能保证每次预测的都是对的,因为它有可能胡来,比如第一个预测的是B-PER,下一个预测的是B-ORG,这就不符合自然语言的规则了,所以我们加入了CRF这一层,用来约束这些标签,它可以自动地去学习这些约束。
那么CRF是怎么学习这些约束的呢?
简单地说就是计算每个标签下一个标签地概率,概率大就有可能出现这样的标签,概率小就不会出现了。


2. 他山之石,可以攻玉

1). 保证代码运行正确

Chinese NER
大家点击去Clone下来就行
然后就是重点来了!!!
下载下来运行并不会那么顺利,会报错的

首先打开main.py文件,如果训练的话就是图中的两个True,如果测试的话就把图中的两个True改成False

flags = tf.app.flags
flags.DEFINE_boolean("clean",       True,      "clean train folder")
flags.DEFINE_boolean("train",       True,      "Wither train the model")
  • 错误1
    TypeError: slice indices must be integers or None or have an index method
    解决方案:遇到这个错误你就去data_utils.py文件里找到下面的代码,改一下即可
    def sort_and_pad(self, data, batch_size):
        num_batch = int(math.ceil(len(data) /batch_size))
        sorted_data = sorted(data, key=lambda x: len(x[0]))
        batch_data = list()
        for i in range(num_batch):
            batch_data.append(self.pad_data(sorted_data[i*int(batch_size) : (i+1)*int(batch_size)]))
        return batch_data
  • 错误2
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa3 in position 0: invalid start byte
    解决方案:这个是编码问题,遇到这个问题你就进到utils.py里,找到下面的代码,加上一句encoding = 'utf-8'就OK了。我印象中是这几处,如果还报这个错误就继续排查类似的即可
def test_ner(results, path):
    """
    Run perl script to evaluate model
    """
    output_file = os.path.join(path, "ner_predict.utf8")
    with open(output_file, "w", encoding='utf-8') as f:
        to_write = []
        for block in results:
            for line in block:
                to_write.append(line + "\n")
            to_write.append("\n")

        f.writelines(to_write)
    eval_lines = return_report(output_file)
    return eval_lines

def save_config(config, config_file):
    """
    Save configuration of the model
    parameters are stored in json format
    """
    with open(config_file, "w", encoding="utf8") as f:
        json.dump(config, f, ensure_ascii=False, indent=4)


def load_config(config_file):
    """
    Load configuration of the model
    parameters are stored in json format
    """
    with open(config_file, encoding="utf8") as f:
        return json.load(f)
  • 错误3
    NameError: name 'os' is not defined
    这个错误很奇怪,我是看到作者代码里有导入os的
    解决方案:import os

2). 更换数据集

打开下载下来的文件,data文件夹里面有三个文件,分别为验证,测试,训练数据集,你只需把你的数据集切分成这三份即可(比例自己定,我的是7:2:1)。

  • 标签必须得是BIO格式,总之你的标签要和它的一模一样。
  • 还有标识符,windows生成的数据集文件我们发现换行符都是\r\n,也就是在notpad++上打开的话,显示所有标识符后会发现CRLF,我们要把它改成LF。
    可以用替换的方法,直接把\r\n替换成\n,这样就满足条件了

3). 训练

这些操作之后你就可以运行main.py了

三. 总结与展望

最近一直在努力地理解这些个原理,争取早日攻克它们。大家工作的话一般项目会比较紧急,没有时间给你慢慢理解原理,然后再去写代码做项目。所以要学会用别人的代码,改造它们,让它为自己所用。最后很感谢github的那位大佬,真的很厉害。希望这篇博客能帮到大家,谢谢各位


以下是我所有文章的目录,大家如果感兴趣,也可以前往查看
👉戳右边:打开它,也许会看到很多对你有帮助的文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 一、meta标签的三个属性 title: 30字以内,简约且全面,避免重复,可以用主关键词+吸引用户词+品牌词,以...
    TTTXTTT阅读 348评论 0 1
  • 1.JDBC 作用:连接数据库并发送SQL语句,本身不具备操作数据库的能力。 流程:1)注册驱动; Class.f...
    sunnysans阅读 287评论 0 1
  • 原创教程:PC机安装黑苹果 主板bios与硬盘分区格式 选择安装方式初探 其实安装黑苹果机器这么多,现在的新手遇到...
    易江南从心出发阅读 1,184评论 0 2
  • 所有人都朝声音的方向看去,原来是饭馆的老板。 饭店老板胡不吃站在台阶上面,一脸凶相,俯视着众人,他圆脑袋,圆脖子,...
    小眼睛大鼻子阅读 221评论 0 1