crownpku / Information-Extraction-Chinese

Chinese Named Entity Recognition with IDCNN/biLSTM+CRF, and Relation Extraction with biGRU+2ATT 中文实体识别与关系提取
2.22k stars 814 forks source link

python3.6 python main.py --ckpt_path=ckpt_IDCNN #86

Open weilongheal opened 6 years ago

weilongheal commented 6 years ago

在进行NER的测试时,在控制台输入值后,没有输出,怎么解决呢?但是读取test.txt的方法测试是有输出的; 还有就是input在3.5的时候有BUG,最好使用3.6;

forconz commented 6 years ago

我用的3.6,正常运行的

你这边进行NER测试,是测试什么?最好截图说一下

forconz commented 6 years ago

python main.py --ckpt_path=ckpt_IDCNN 请输入测试句子:近日,腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议。 {'string': '近日,腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议。', 'entities': [{'word': '特斯拉', 'start': 14, 'end': 17, 'type': 'LOC'}]}

特斯拉应该是ORG,不是LOC。 腾讯没有被识别出来。

我现在只知道怎么用,不知道如何改善这个库。 这个库效率很高。

我这边能采集,并做实体标注,可以生成类似{'string': '近日,腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议。', 'entities': [{'word': '特斯拉', 'start': 14, 'end': 17, 'type': 'LOC'}]}这样的语料,但是实体标注后的语料,如何变成这个库用的训练文本,就不知道怎么做了。

crownpku commented 6 years ago

@forconz 参考data文件夹中训练数据的格式,把你采集和标注好的数据放进去,重新训练模型就好了。

weilongheal commented 6 years ago

是RE关系抽取的时候测试有问题,就像作者说的一个BUG,

请输入中文句子,格式为 "name1 name2 sentence":张三 李四 张三喜欢李四. Traceback (most recent call last): File "test_GRU.py", line 348, in tf.app.run() File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/platform/app.py", line 126, in run _sys.exit(main(argv)) File "test_GRU.py", line 226, in main print(line) File "/usr/lib/python3.6/codecs.py", line 376, in write data, consumed = self.encode(object, self.errors) UnicodeEncodeError: 'utf-8' codec can't encode characters in position 0-5: surrogates not allowed

forconz commented 6 years ago

@crownpku 我知道data文件夹下的数据格式,这种格式有没有标注工具,你可以下载https://prodi.gy/assets/data/reddit_product.jsonl 看一下,我能标注成{"text":"This was taken during the Easter celebrations at Real de Catorce, MX.","spans":[{"start":66,"end":68,"text":"MX","rank":0,"label":"PRODUCT","score":0.9525150387,"source":"core_web_sm","input_hash":19964311,"answer":"reject"}],这种比较省事,直接用工具标注即可。

但是如何转换成Data文件夹下的格式?

20180918182156 像这样的工具标注出来的实体标注,如何转换格式呢?

forconz commented 6 years ago

@crownpku 我采集的是自媒体的文本,然后先拿这个 crownpku/Information-Extraction-Chinese 源代码跑一次,跑的结果不对的,重新去标注下。我现在就是这个标注后的结果,如何转换成BIOES标注方式.

weilongheal commented 6 years ago

请输入测试句子:近日,腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议。 {'string': '\udce8\udcbf\udc91\udce6\udc97\udca5\udcef\udcbc\udc8c\udce8\udc85\udcbe\udce8\udcae\udcaf\udce4\udcbb\udca5\udce8\udcbf\udc9118\udce4\udcba\udcbf\udce7\udcbe\udc8e\udce5\udc85\udc83\udce5\udc85\udca5\udce8\udc82\udca1\udce7\udc89\udcb9\udce6\udc96\udcaf\udce6\udc8b\udc89\udce6\udc88\udc90\udce7\udcac\udcac\udce4\udcba\udc94\udce5\udca4\udca7\udce8\udc82\udca1\udce4\udcb8\udc9c\udce7\udc9a\udc84\udce6\udcb6\udc88\udce6\udc81\udcaf\udce5\udcbc\udc95\udce5\udc8f\udc91\udce4\udcba\udc86\udce5\udca4\udc96\udce7\udc95\udc8c\udce5\udca4\udca7\udce9\udc87\udc8f\udce7\udc8c\udc9c\udce6\udcb5\udc8b\udce5\udc92\udc8c\udce7\udc83\udcad\udce8\udcae\udcae\udce3\udc80\udc82', 'entities': [{'word': '\udce8\udcbf\udc91', 'start': 0, 'end': 3, 'type': 'PER'}, {'word': '\udcbe\udc8e\udce5', 'start': 27, 'end': 30, 'type': 'PER'}, {'word': '\udc83\udce5', 'start': 31, 'end': 33, 'type': 'PER'}, {'word': '\udca5\udce8\udc82', 'start': 34, 'end': 37, 'type': 'PER'}, {'word': '\udce7\udc89\udcb9', 'start': 38, 'end': 41, 'type': 'PER'}, {'word': '\udc96\udcaf\udce6', 'start': 42, 'end': 45, 'type': 'PER'}, {'word': '\udc89\udce6\udc88', 'start': 46, 'end': 49, 'type': 'PER'}, {'word': '\udce7\udcac\udcac', 'start': 50, 'end': 53, 'type': 'PER'}, {'word': '\udce4\udcba\udc94', 'start': 53, 'end': 56, 'type': 'PER'}, {'word': '\udce5\udca4', 'start': 56, 'end': 58, 'type': 'PER'}, {'word': '\udca7\udce8', 'start': 58, 'end': 60, 'type': 'PER'}, {'word': '\udc82\udca1', 'start': 60, 'end': 62, 'type': 'PER'}, {'word': '\udce4\udcb8', 'start': 62, 'end': 64, 'type': 'PER'}, {'word': '\udc9c\udce7', 'start': 64, 'end': 66, 'type': 'PER'}, {'word': '\udc9a\udc84', 'start': 66, 'end': 68, 'type': 'PER'}, {'word': '\udce6\udcb6', 'start': 68, 'end': 70, 'type': 'PER'}, {'word': '\udc88\udce6', 'start': 70, 'end': 72, 'type': 'PER'}, {'word': '\udc81\udcaf', 'start': 72, 'end': 74, 'type': 'PER'}, {'word': '\udce5\udcbc', 'start': 74, 'end': 76, 'type': 'PER'}, {'word': '\udc95\udce5', 'start': 76, 'end': 78, 'type': 'PER'}, {'word': '\udc8f\udc91', 'start': 78, 'end': 80, 'type': 'PER'}, {'word': '\udce4\udcba', 'start': 80, 'end': 82, 'type': 'PER'}, {'word': '\udc86\udce5', 'start': 82, 'end': 84, 'type': 'PER'}, {'word': '\udca4\udc96', 'start': 84, 'end': 86, 'type': 'PER'}, {'word': '\udce7\udc95', 'start': 86, 'end': 88, 'type': 'PER'}, {'word': '\udc8c\udce5', 'start': 88, 'end': 90, 'type': 'PER'}, {'word': '\udca4\udca7', 'start': 90, 'end': 92, 'type': 'PER'}, {'word': '\udce9\udc87', 'start': 92, 'end': 94, 'type': 'PER'}, {'word': '\udc8f\udce7', 'start': 94, 'end': 96, 'type': 'PER'}, {'word': '\udc8c\udc9c', 'start': 96, 'end': 98, 'type': 'PER'}, {'word': '\udce6\udcb5', 'start': 98, 'end': 100, 'type': 'PER'}, {'word': '\udc8b\udce5', 'start': 100, 'end': 102, 'type': 'PER'}, {'word': '\udc92', 'start': 102, 'end': 103, 'type': 'PER'}, {'word': '\udc8c', 'start': 103, 'end': 104, 'type': 'PER'}, {'word': '\udce7', 'start': 104, 'end': 105, 'type': 'PER'}, {'word': '\udc83', 'start': 105, 'end': 106, 'type': 'PER'}, {'word': '\udcad', 'start': 106, 'end': 107, 'type': 'PER'}, {'word': '\udce8', 'start': 107, 'end': 108, 'type': 'PER'}, {'word': '\udcae', 'start': 108, 'end': 109, 'type': 'PER'}, {'word': '\udcae', 'start': 109, 'end': 110, 'type': 'PER'}, {'word': '\udce3', 'start': 110, 'end': 111, 'type': 'PER'}, {'word': '\udc80', 'start': 111, 'end': 112, 'type': 'PER'}, {'word': '\udc82', 'start': 112, 'end': 113, 'type': 'PER'}]}

为什么我的输出是这样呢?

weilongheal commented 6 years ago

不用input的话,可以正常输出: {'string': '香港的房价已经到达历史巅峰,乌溪沙地铁站上盖由新鸿基地产公司开发的银湖天峰,现在的尺价已经超过一万五千港币。', 'entities': [{'word': '香港', 'start': 0, 'end': 2, 'type': 'LOC'}, {'word': '乌溪沙地铁站', 'start': 14, 'end': 20, 'type': 'LOC'}, {'word': '新鸿基地产公司', 'start': 23, 'end': 30, 'type': 'ORG'}, {'word': '银湖', 'start': 33, 'end': 35, 'type': 'LOC'}]}

感觉python3的input很多坑,

forconz commented 6 years ago

@weilongheal 我在windows下显示正常,你可能在linux下 你解码就正常显示了,

\u开头表示的是Unicode编码 解决办法: print(path.decode("raw_unicode_escape")) 1529917422_969892

编码的问题,应该是这么解决

forconz commented 6 years ago

@crownpku 你用什么工具标注?手工标注搞死人的

forconz commented 6 years ago

@crownpku

参考data文件夹中训练数据的格式,把你采集和标注好的数据放进去,重新训练模型就好了。

帮忙看看我的思路对不对:

腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议 需要识别出机构:腾讯,特斯拉 特斯拉不能显示为LOC

1、用这个工具 https://github.com/jiesutd/YEDDA 做标注,比如对特斯拉,对腾讯进行ORG标注。

2、YEDDA工具导出类似 https://github.com/shiyybua/NER/blob/master/resource/target.txt 这种格式,这种格式是BIO标注方式?帮在线打开确认下标注方式。

3、然后再用这个代码: Convert BIO to BIOES 转换成BIOES标注方式.

3、训练 train with IDCNN+CRF (default)

python3 main.py --train=True --clean=True --model_type=idcnn

4、python main.py --ckpt_path=ckpt_IDCNN 再次输入:腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议 看看实体识别结果。

您看这个思路对吗?

weilongheal commented 6 years ago

@forconz 你好我用的是linux,昨天验证过我的编码格式是UTF-8,尝试解码再编码成UTF-8,但是未成功,

你说的那个是str.decode()成固定编码是吗.但是python3没有这个方法, 你们的标记工具我得好好看看,

weilongheal commented 6 years ago

@forconz @crownpku 你好,请问下我们这个基于字符级别的NER,字向量是如何生成的呢?词向量可以用Word2vector,glove,

forconz commented 6 years ago

@weilongheal 😰,我也在发愁这个问题,搞不定,我就没继续往下搞了。

我现在做中文标注,做语料,都不知道怎么搞

weilongheal commented 6 years ago

@forconz 你好,我是这么想的,基于字符级别的向量的生成和基于词的向量如Word2vec是一样,我们的输入数据由句子的词改为单个字符,训练过程还是一样的; 你是手工标注语料吗?

crownpku commented 6 years ago

@forconz @crownpku 你好,请问下我们这个基于字符级别的NER,字向量是如何生成的呢?词向量可以用Word2vector,glove,

data下面有提前训练好的中文字向量。如果要自己训练,只要把单位由词改为单个中文字就好了。

forconz commented 6 years ago

@weilongheal 是啊,我知道怎么用这个开源代码, 但是不知道怎么改进,开源代码都识别不了天猫这个机构,发愁...我这边擅长开发采集系统和信息管理系统,我用这个开源代码抽取机构等信息。说实话,这个代码非常棒,效率非常高,我就是想改进下,不知道怎么入手...

forconz commented 6 years ago

@crownpku 就是想自己训练,不知道怎么入手,就算买本书都不知道买什么书... 关于文本训练的关键词都搜过了,对具体怎么做训练,都说的很简略。

如果是按data下面的结构准备语料,理论上是可以的,但实际上用的中文标注结果,实际上跟本开源代码跑出来的结构有些类似,就是标记哪些字符串是机构,哪些字符串是人名,但是这个json格式的标注,如何转换成data下面的训练结果,就不知道怎么搞了。

另外一种思路,就是用这个工具 https://github.com/jiesutd/YEDDA 做标注,貌似BIO标注方式(但是我不确定),然后用代码调用转换成BIOES标注方式,不知道这个思路对不对,没人帮解答,苦恼中...

帮忙看看我的思路对不对:

腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议 需要识别出机构:腾讯,特斯拉 特斯拉不能显示为LOC

1、用这个工具 https://github.com/jiesutd/YEDDA 做标注,比如对特斯拉,对腾讯进行ORG标注。

2、YEDDA工具导出类似 https://github.com/shiyybua/NER/blob/master/resource/target.txt 这种格式,这种格式是BIO标注方式?帮在线打开确认下标注方式。

3、然后再用这个代码: Convert BIO to BIOES 转换成BIOES标注方式.

3、训练 train with IDCNN+CRF (default)

python3 main.py --train=True --clean=True --model_type=idcnn

4、python main.py --ckpt_path=ckpt_IDCNN 再次输入:腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议 看看实体识别结果。

您看这个思路对吗?

forconz commented 5 years ago

@crownpku ???

Feny321 commented 3 years ago

@crownpku 就是想自己训练,不知道怎么入手,就算买本书都不知道买什么书... 关于文本训练的关键词都搜过了,对具体怎么做训练,都说的很简略。

如果是按data下面的结构准备语料,理论上是可以的,但实际上用的中文标注结果,实际上跟本开源代码跑出来的结构有些类似,就是标记哪些字符串是机构,哪些字符串是人名,但是这个json格式的标注,如何转换成data下面的训练结果,就不知道怎么搞了。

另外一种思路,就是用这个工具 https://github.com/jiesutd/YEDDA 做标注,貌似BIO标注方式(但是我不确定),然后用代码调用转换成BIOES标注方式,不知道这个思路对不对,没人帮解答,苦恼中...

帮忙看看我的思路对不对:

腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议 需要识别出机构:腾讯,特斯拉 特斯拉不能显示为LOC

1、用这个工具 https://github.com/jiesutd/YEDDA 做标注,比如对特斯拉,对腾讯进行ORG标注。

2、YEDDA工具导出类似 https://github.com/shiyybua/NER/blob/master/resource/target.txt 这种格式,这种格式是BIO标注方式?帮在线打开确认下标注方式。

3、然后再用这个代码: Convert BIO to BIOES 转换成BIOES标注方式.

3、训练 train with IDCNN+CRF (default)

python3 main.py --train=True --clean=True --model_type=idcnn

4、python main.py --ckpt_path=ckpt_IDCNN 再次输入:腾讯以近18亿美元入股特斯拉成第五大股东的消息引发了外界大量猜测和热议 看看实体识别结果。

您看这个思路对吗?

这个方法可以实现么,我现在想训练自己的数据,怎么整呢?