zoukankan      html  css  js  c++  java
  • 工具分享: 中文实体标注工具

    发现了一款比较方便标注的工具https://github.com/jiesutd/SUTDAnnotator ,使用python2编写的界面,相对比较轻量,适合个人使用。但如果是团体使用的,还是web界面的会比较好。
     
    运行Annotator_backup.py得到如下界面:open导入文件,选中要标注的词语,按下已设定好的快捷键A-V,即可完成对应的标注
                
     修改添加上自己所需的实体名:在对应的快捷键的右边输入实体名,按下remap按钮即可重新分配快捷键对应的实体名
     导出结果:export
                        
                        
     
     
    其他更详细的操作参照github中的描述
     
    将标注好的ann文件转成常用的训练样本的格式,以下有python3实现
     
     
    import re
    
    # txt2ner_train_data turn label str into ner trainable data
    # s :labeled str  eg.'我来到[@1999年#YEAR*]的[@上海#LOC*]的[@东华大学#SCHOOL*]'
    # save_path: ner_trainable_txt name
    def str2ner_train_data(s,save_path):
        ner_data = []
        result_1 = re.finditer(r'[@', s)
        result_2 = re.finditer(r'*]', s)
        begin = []
        end = []
        for each in result_1:
            begin.append(each.start())
        for each in result_2:
            end.append(each.end())
        assert len(begin) == len(end)
        i = 0
        j = 0
        while i < len(s):
            if i not in begin:
                ner_data.append([s[i], 0])
                i = i + 1
            else:
                ann = s[i + 2:end[j] - 2]
                entity, ner = ann.rsplit('#')
                if (len(entity) == 1):
                    ner_data.append([entity, 'S-' + ner])
                else:
                    if (len(entity) == 2):
                        ner_data.append([entity[0], 'B-' + ner])
                        ner_data.append([entity[1], 'E-' + ner])
                    else:
                        ner_data.append([entity[0], 'B-' + ner])
                        for n in range(1, len(entity) - 1):
                            ner_data.append([entity[n], 'I-' + ner])
                        ner_data.append([entity[-1], 'E-' + ner])
    
                i = end[j]
                j = j + 1
    
        f = open(save_path, 'w', encoding='utf-8')
        for each in ner_data:
            f.write(each[0] + ' ' + str(each[1]))
            f.write('
    ')
        f.close()
    # txt2ner_train_data turn label str into ner trainable data
    # file_path :labeled multi lines' txt  eg.'我来到[@1999年#YEAR*]的[@上海#LOC*]的[@东华大学#SCHOOL*]'
    # save_path: ner_trainable_txt name
    def txt2ner_train_data(file_path,save_path):
        fr=open(file_path,'r',encoding='utf-8')
        lines=fr.readlines()
        s=''
        for line in lines:
            line=line.replace('
    ','')
            line=line.replace(' ','')
            s=s+line
        fr.close()
        str2ner_train_data(s, save_path)
    
    if(__name__=='__main__'):
        s = '我来到[@1999年#YEAR*]的[@上海#LOC*]的[@东华大学#SCHOOL*]'
        save_path = 's.txt'
        str2ner_train_data(s, save_path)
        file_path='D:\codes\python_codes\SUTDAnnotator-master\demotext\ChineseDemo.txt.ann'
        txt2ner_train_data(file_path,'s1.txt')
    

      

     
     
     

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    Java 理论与实践: 正确使用 Volatile 变量
    Zookeeper 原理
    Java中GC的工作原理
    Redis 5种数据结构使用及注意事项
    Redis 支持的5种数据结构
    浅谈JavaScript词法分析步骤
    四句话总结JavaScript作用域
    Web模板引擎本质前奏
    python【第十三篇】可以写一个堡垒机了
    python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy
  • 原文地址:https://www.cnblogs.com/combfish/p/7830807.html
Copyright © 2011-2022 走看看