社保领域知识图谱构建练手小实验(2)——社保领域概念提取算法的训练语料准备

社保领域概念提取算法

分词和词性标注是后续实体识别、关系抽取等步骤的关键基础。在这一过程中准确识别出领域概念格外重要。

“社保领域概念大多数为一些由基本概念的组合而来的长词,而这些词一般是不会出现在分词工具的词典中,这种词被称作未登录词
解决这种问题有两种主流方法:
一种是基于有监督机器学习的领域概念提取算法。这种方法需要人工对数据进行标注,利用隐马尔科夫和条件随机场等模型根据上下文来识别未登录词[49],但是这种模型缺少对领域的自适应能力[50],并且需要大量的人工参与,制约了这种方法的实用性。
所以本文采用另一种常用方法基于统计的无监督方法,并根据领域特点进行了改进。”
社保领域知识图谱构建练手小实验(2)——社保领域概念提取算法的训练语料准备_第1张图片
1、利用词性及词性搭配规则进行候选概念的选取。
2、对选取的候选概念计算其不同的统计量特征,根据统计结果进行评分并筛选得到最终结果。
社保领域知识图谱构建练手小实验(2)——社保领域概念提取算法的训练语料准备_第2张图片

训练语料

1762篇养老服务领域文献的关键词
《社会福利词典》中377个词条,对当代欧美国家社会福利的理论与实践及其各种学术观点做了精炼的概括和解析。(词典暂不启用,与文献摘要数据不太相关。)

训练语料处理

# encoding: UTF-8
# 删除重复关键词,整理格式为每行一个关键词

import shutil

def keywords_extract(fi):
    
    """
    提取关键词
    """
    
    fo = open("D:/textAnalysis/project/knowledgeGraph/data/data_9920_keywords_1.txt","w",encoding="utf-8")

    wflag =False                #写标记
    newline = []                #创建一个新的列表
    
    for line in fi :            #按行读入文件,此时line的type是str
        if "K1" not in line:
            wflag = False
        if "K1" in line:     #检验是否到了要写入的内容
            wflag = True
        if wflag == True:
            K = list(line)
            for i in K :       #写入需要内容
                newline.append(i)

    strlist = "".join(newline)      #合并列表元素
    newlines = str(strlist)         #list转化成str

    fo.write(newlines)

    fo.close()
    fi.close()


def keywords_clean(fi):

    """
    关键词格式处理
    """

    fo = open("D:/textAnalysis/project/knowledgeGraph/data/data_9920_keywords_2.txt","w",encoding="utf-8")
    newlines = []
    
    date = fi.readlines()
    
    #文本读入后用换行符替换;
    for line in date:
        line = line.replace('\n','')
        newlines.append(line)
    
    for i in range(len(newlines)):
        s = str(newlines[i]).replace('[','').replace(']','')#去除[],这两行按数据不同,可以选择
        s = s.replace("'",'').replace(',','').replace(';','\n').replace(' ','')   # 去除列表中展现出的格式

        fo.write(s)

    fo.close()


def keywords_final():
    
    """
    删除txt文件中重复的关键词
    """

    readPath='D:/textAnalysis/project/knowledgeGraph/data/data_9920_keywords_2.txt'
    writePath='D:/textAnalysis/project/knowledgeGraph/data/data_9920_keywords.txt'
    lines_seen=set()
    outfiile=open(writePath,'a+',encoding='utf-8')
    f=open(readPath,'r',encoding='utf-8')
    for line in f:    
        if line not in lines_seen:        
            outfiile.write(line)        
            lines_seen.add(line)    


if __name__ == '__main__':

    fi = open("D:/textAnalysis/project/KnowledgeGraph/data/download_9920.txt","r",encoding="utf-8")
    fi_2 = open("D:/textAnalysis/project/knowledgeGraph/data/data_9920_keywords_1.txt","r",encoding="utf-8")
    fi_3 = open("D:/textAnalysis/project/knowledgeGraph/data/data_9920_keywords_2.txt","r",encoding="utf-8")
    
    keywords_extract(fi)
    keywords_clean(fi_2)
    keywords_final()

经过处理后,得到了3074个不重复的文献关键词,作为本次领域概念提取训练语料。

备注:
论文复现仍然主要依据《社保领域知识图谱构建及应用研究_李佳恒》。

你可能感兴趣的:(自然语言处理,python,数据清洗)