面向Web文本语义挖掘的SKR/MetaMap输出概念共现分析系统的开发尝试,本文主要内容关键词为:语义论文,文本论文,概念论文,系统论文,Web论文,此文献不代表本站观点,内容供学术参考,文章仅供参考阅读下载。
【分类号】G250
1 关于概念共现分析与SKR/MetaMap
根据心理学的邻近关系法则,曾经在一起感受过的对象往往在想像中也联系在一起,当想起它们中的某一个的时候,其他的对象也会以曾经同时出现时的顺序想起。可以推论,两个词之间的联系可以用同时感知到两词的相对频率来衡量,词之间的联系强度决定了用语过程中词汇的选择:只有存在关联的那些词汇才能被想起、说出或写下[1]。只要该假设成立,运用文本中词语的普遍共现现象预测词汇的关联就是可行的。从这个方法论出发,可以利用共现分析研究词汇之间的关联度,挖掘词汇之间的内在联系[2]。当然,这种方法存在着不足。目前的文本处理基本上都是依据一定的词语库分词后,简单地统计自然词汇的出现频率来作为文本分类的基础。自然词汇之间往往存在着多种复杂的关系,如同义、近义、反义、属类(或上下位,即大概念和小概念)等等。因此,人们已经考虑到运用知识本体来解决自然语言处理问题[3]。
语义知识表达(Semantic Knowledge Representation,SKR)是基于一体化医学语言系统(Unified Medical Language System,UMLS)进行自然语言处理、提取文献中概念的系列在线工具。其中MetaMap是SKR系统的核心组件,如图1所示。
SKR/MetaMap进行的分析是语义层次的分析。语义层次要分析词典中词汇的含义,也要分析来自句子上下文中的意思。语义学认为,许多语词的含义不止一个,但是我们能通过句子的其它词来确定其相应含义。有些词的含义完全依赖于上下文。这个层次的处理包括多义词的语义辨识(去除歧义),为查询词加上所有同义词的查询扩展等。词汇扩展可以从词汇源(如UMLS知识库)中获取。这里的难点是扩展的词汇要与查询词隐含的用户真实需求相一致[5]。语义层次处理的另一用途是产生语义向量来表达查询和文献,但这要求为语义向量中的每个词汇确定明确的含义和语义类别。SKR/MetaMap即实现了以上要求,其中词汇的明确含义(概念)来源于 UMLS组成部分中的超级叙词表,语义类别(语义类型)来源于UMLS组成部分中的语义网络。MetaMap运用了符号学方法、自然语言处理方法和计算机语言学方法[6]。
图1 SKR程序模块构成[4]
2 系统目的及意义
经SKR/MetaMap分析后的输出结果信息含量较大。例如:一篇200词左右的文摘,经SKR/MetaMap分析后,其输出结果多达40页左右,对于需要处理大量文献的研究者而言,这会在很大程度上增加他们在信息获取、信息判断过程中的时间及精力。所以对于目的明确的研究者而言,需要对此结果进行再次分析。本系统着眼于概念的共现现象,即:从MetaMap输出中识别、提取出 MetaMapping概念词,每个概念词再赋予反映其特征的属性,实现概念词共现矩阵,期望共现分析的实现能够提高 SKR/MetaMap输出的可读性及对共现分析的可用性,为挖掘蕴含于文献中的知识提供数据源。
3 系统设计
3.1 系统任务分析
以PubMed的文献记录MEDLINE输出格式为例,该库一般提供文献题录和摘要。MetaMap对原始文本逐句处理,生成以句为单位的文献解析结果输出文本,每一句以这样的格式开头:“Processing 16680375.ti.1:Analysis of the Resveratrol-binding Protein using Phage-displayed Random Peptide Library.”说明这些文字出现在编号为 16680375的文献的ti(标题)字段的第1句话中。我们拟统计Processing后面到冒号之间的部分,即文章ID,该句出现的字段和该句在该字段中的句序。
处理文本格式的文献记录集,统计出其中每篇文献的文本文档经过MetaMap解析后所得的MetaMapping后的每个词出现的位置,即标记其ID号、字段标识和在每个段落(字段)中出现的句序以及语义类型,形成如下数据表,如表1。
根据上面的统计结果形成关于概念词的共现矩阵,并提供对概念共句、概念共字段、概念共篇的强度的人工赋权提问/窗口,计算所有词汇两两共现的强度。系统初步开发尝试以简单的线性公式计算:共句频次*共句权值+共字段频次*共字段权值+共篇频次*共篇权值。对于共篇频次,如果每次运行只处理一个MetaMap文档,那么对于任何两两的概念其共篇频次为零。如果文档批量运行,那么词汇的共篇频次非零。本系统对文本处理的结果以文本格式为例形成如下数据:
0(1*1)6(1*2)6(1*3)6(1*4)6(1*5)
6(2*1)0(2*2)6(2*3)6(2*4)6(2*5)
6(3*1)6(3*2)0(3*3)6(3*4)6(3*5)
6(4*1)6(4*2)6(4*3)0(4*4)6(4*5)
6(5*1)6(5*2)6(5*3)6(5*4)0(5*5)
矩阵中每个元素都是两两单词共同出现的强度,这个强度值是通过上面的强度线性公式得到的,括号中的数字表示前面的强度值是哪两个单词的共现强度,如6(1 *2)中表示对应在矩阵的第一行第二列的两个单词的共现强度是6,数字表示矩阵的行数,*后面的数字表示矩阵的列数。对于单词本身在矩阵中赋值为0,反映在强度矩阵中就是在矩阵的对角线位置为0。以矩阵形式输出如表2所示,其中W表示概念。
3.2 系统总体设计
根据系统分析要求和可利用的资源对系统进行宏观、总体上的设计和规划,即将系统划分成模块;确定每个模块的功能;确定模块的调用关系;确定模块间的接口等。
本系统主要完成4个功能:
(1)对MetaMap处理后的数据文本的读入。
(2)对读入的文本数据进行统计,统计出MetaMapping后的概念信息(包括概念词,该概念词所在文章的ID号,概念词出现的位置,用其所在字段和句序表示,概念词所在位置的语义类型,如果同一个概念词在一篇文章中不同位置出现多次,则一并记录该概念词在其它地方出现的信息,包括出现位置和所在位置的语义类型)。
(3)将统计后的词汇形成一个词汇共现矩阵,这个共现矩阵就是反映统计出的词汇两两出现强度的矩阵。
(4)对处理结果的输出显示,将统计出的单词、系统统计处理过程中的中间结果、计算的词汇共现的强度矩阵输出到文本文件,输出结果的文件分别为:文件名_WordFre,文件名_ Processing,文件名_Matrix。
本系统对MetaMap处理后的结果进行统计处理,处理后获得的信息中,概念词是基本的统计信息单元,针对概念词设计一个概念词类,包括的概念词信息有概念词本身、所在文章的ID、出现的位置(位置用概念词所在字段和句序标识)、概念词在所出现位置的语义类型。由于同一个概念词可能出现在文章的不同位置,因此,出现多次的概念词其出现位置和所在位置的语义类型可能有多条,针对概念词的出现位置及所在位置的语义类型设计一个概念词基本信息类,用于存储概念词的出现位置和所在位置的语义类型。在概念词类中就包括概念词本身、所在文章的ID和至少一个概念词基本信息类对象,对于概念词在不同位置出现多次的,概念词类中将存储多条概念词基本信息类对象。概念词类用于存储统计处理后的概念信息是整个系统的主要数据存储结构。
在统计处理功能中,设计一个统计管理类,用于存储概念词类对象,进行概念统计和形成的。
系统的类结构设计如图2所示。
图2 系统类结构设计
系统模块结构如图3所示。
3.3 概念词基本信息类设计
概念词基本信息类包含的数据为:概念词所在字段、概念词所在句序、概念词的语义类型。基于这个类的方法有获得和设置概念词所在字段,获得和设置概念词所在句序,获得和设置概念词的语义类型,提供该类对象初始化时设置概念词所在字段,概念词所在句序,概念词的语义类型的操作。这个类主要是用来存储概念词的位置信息。对于每一个概念词,可能在很多位置出现,就会对应产生很多概念词基本信息类对象用于存储概念词的位置信息。这个类主要是为概念词类提供支持的,每一个概念词类对象至少包含一个概念词基本信息类对象。
图3 系统模块结构
3.4 概念词信息类设计
概念词信息类包含的数据为:概念词本身、概念词所在文章的ID、概念词的位置,概念词的位置用概念词基本信息类的对象来存储。基于这个类的方法有获得和设置概念词,获得和设置概念词所在文章ID,获得和设置概念词基本信息类对象的指针。概念词信息类存储着统计中概念词的完整的信息。通过对概念词完整信息的记录,为系统对概念词进行其它处理奠定了基础。这个类的主要作用就是负责存储完整的概念词信息,为其它操作提供数据基础。
3.5 统计管理类设计
统计管理类包含的数据是:概念词信息类的对象,所有的统计处理都是基于概念词信息类对象提供的数据。基于这个类的方法有:对所处理的文本进行读入并把需要统计的概念词信息存储到概念词信息类的对象中,对处理结果的显示,形成概念词的共现矩阵,对处理结果按一定格式输出到文本。这个类的所有操作都是在概念词信息类对象基础上完成的,是整个系统的关键,负责完成系统的主要功能。
4 系统实现
系统开发环境:Microsoft Visual C++6.0(简称VC++ 6.0)及其标准模板库STL(Sandard Template Library)[7-9]。
4.1 系统主程序流程(如图4)
在Windows Server 2000平台上,利用Microsoft Visual C++6.0作为开发工具,应用面向对象程序设计方法实现本系统。
图4 系统主程序流程图
4.2 概念词基本信息统计及存储实现
概念词基本信息类上的方法则是通过设计相应的函数实现的,针对类上的每个方法设计一个成员函数。在对所处理的文本进行分析处理时存储需要统计的概念词的字段、句序和语义类型的字符串,具体实现过程如下:
当分析得到一个概念词的字段、句序和语义类型时,开辟出相应大小的内存空间存储这些信息,最后将这些信息存入到一个概念词基本信息类对象中。实现记录概念词基本信息的伪代码如下:读入一段字符串,格式如Processing 16680375.ti.1:读取文本指针pNext指向Processing后的空格位置,并循环读取直到遇到冒号退出循环。设置记录点号数目的变量并初始化为零iStorageF=0.以点号为标记,取得读取文本指针在第一个点号的位置,(*pNext)= =’.’.点号数目记录变量加1,iStorageF++.如果iStorageF ==1,则开辟出4个字符大小的内存空间,并将空间首地址赋给pField,pFicld=new charL[4].对新开辟的空间初始化,memset(pField,0,4).将点号后面的两个字符拷贝给新开辟的空间,strncpy(pField,pNext+1,2).当读取指针指向第二个点号的位置时,点号数目记录变量加1,iStorageF ++。如果iStorageF==2,则开辟出4个字符大小的内存空间,并将空间首地址赋给pSentenceNum,pSentenceNum= new char[4].对新开辟的空间初始化,memset(pSentenceNum,0,4).将点号后面的字符拷贝给新开辟的空间,strcpy(pSentenceNum,pNext+1).以上代码完成对概念词基本信息中概念词所在字段及句序的分析和存储。在两个如Processing 16680375.ti.1之间,统计概念词的语义类型。
以下完成对概念词语义类型的分析与存储:定义一个数组,用于存储统计标记,char StandM[13]=“Meta Mapping”;开辟一块内存用于存储以M开头的字符串, char*pGetStrM=new char[13];设置一个统计字符个数的变量count_m,并初始化为0;读取一个字符存入字符变量cTemp中,并判断这个字符是不是大写的M,cTemp= =M′;如果不是大写的M,则继续读取下一个字符;如果是大写的M,则读取包括M在内的12个字符,存入pGetStrM中;判断pGetStrM与StandM是否相同,strcmp(pGetStrM,StandM);如果不相同,则将读取文本的指针回退到 M的下一个字符位置,继续向下读取字符;如果相同,则读取Meta Mapping与小于号<或Meta Mapping与Meta Mapping之间的字符串,用count_m记录读取的字符个数,并将这个字符串存入临时开辟的空间pTempM中, char*pTempM=new char[count_m];定义一个字符型指针并指向pTempM指向的空间首地址:char*pMove= pTempM;利用pMove指针的循环移动对由pTempM标记的字符串进行分析,分别获得两个中括号的位置,char* pFront=strchr(pMove,‘[’),char*pLast=strchr (pMove,‘]’);开辟一块内存空间用于存储概念词的语义类型,char*pTypeWord=new char[pLast-pFront];对新开辟的空间初始化,memset(pTypeWord,0,pLast pFront);将概念词的语义类型存储到pTypeWord标记的空间中,strncpy(pTypeWord,pMove,pLast-pFront);将分析得来的概念词的基本信息存入一个概念词基本信息类的对象中,并用一个概念词基本信息类类型的指针记录其存储空间的首地址:CWordlnf*pCreateWordInf= new CWordInf(pField,pSentenceNum,pTypeWord)。
4.3 概念词信息统计与存储实现
概念词信息类存储数据结构的设计如下:用于存储概念词字符串本身的存储空间的首地址,char*pWord;用于存储概念词所在文章ID字符串的存储空间的首地址,char*pId;用指向概念词基本信息类类型的vector容器的指针存储一个指向vector容器的存储空间的首地址,vector<CWordInf*>*pvWordInf。
关于vector容器:概念词信息中概念词本身及概念词所在文章的ID在进行概念词基本信息分析时一并存入开辟的相应内存空间中。对于所统计的概念词如果是第一次出现,则在存储概念词的基本信息时,建立一个 vector<CWordInf*>类型的容器,用于存储概念词的基本信息,并记录这个容器的存储空间的首地址,vector< CWordInf*>*pCreate=new vector<CWordInf*> ();所统计的概念词如果已经出现过,则在存储概念词基本信息时,直接将概念词基本信息插入到属于该概念词信息的vector<CWordInf*>类型的容器中即可。对于每一个概念词信息,将其基本信息存储在概念词基本信息类型容器中后,再将标记这个容器的存储空间的首地址pv和记录概念词本身、记录概念词所在文章编号的存储空间的首地址信息pConWord,pDocId一并存储到一个概念词信息类的对象CAnalysisMetaMapR中:CAnalysisMetaMapR*pCreateMetaMapR=new CAnalysisMetaMapR (pConWord,pDocId,pv)。
4.4 统计管理与实现
存储概念词信息类的对象,统计管理类存储数据结构设计为:vector<CAnalysisMetaMapR*>MetaMapR。
定义一个概念词信息类类型的vector容器,用于存储概念词信息类对象。用vector容器存储数据,容器本身提供很多统计处理功能,可以直接使用获得所需要的统计处理结果。统计管理类主要完成对待处理文本的读入设计的读入成员函数ReadFileIn(char*pFileName),函数参数是待处理的文件名,对处理结果的显示而设计的显示处理结果函数DisplayResults(),对于概念词两两出现的频率矩阵的实现设计函数AppearMatrix(char* pFileName,int iSen,int iPara,int iDoc),函数参数分别是处理的文本的文件名,共句权值,共段权值和共篇权值。将统计结果按一定格式输出到文本函数ResultsToTxt (char*pFileName),参数是待处理的文本的文件名。在统计管理类基础上实现系统的各种功能。
在开发中采用人为的检查和VC开发环境提供的调试分析工具对系统进行静态测试。系统还进行了白盒测试和黑盒测试。白盒测试是根据程序的内部逻辑来设计测试用例,常用的技术是逻辑覆盖。在开发过程中对每个模块都采用了白盒测试。黑盒测试是根据规格说明所规定的功能来设计测试用例,它不考虑程序的内部结构和处理过程。本系统通过选取若干MetaMap分析后的输出结果进行黑盒测试。
5 研究方向
今后本研究将实现的目标:
(1)由于目前本系统在设计和实现的过程中所用到的 SKR/MetaMap分析后的输出结果都是使用默认参数进行分析的,而在默认参数情况下,虽然能满足大部分用户的需求,但是对于有特殊需求的研究者而言,还需要今后对本系统进行不断的完善更新,所以下一步研究将考虑各种参数的设置情况。
(2)共现结果输出中拟进一步将共句、共字段、共篇的结果分别输出,另外,由于简单线性公式必然存在有同内涵计算重叠现象,系统应进一步加入多种共现强度算法。
(3)将系统处理后的输出文件格式多样化,逐步实现便于其他分析软件应用的文件格式。
(4)集成分析功能如统计学或人工神经网络等分析算法,实现集成化分析流程。
收稿日期:2006-10-16
收修改稿日期:2006-12-06
标签:语义分析论文; 文本分类论文; char函数论文; 信息存储论文; 文本分析论文; 空间分析论文; web技术论文; 矩阵管理论文; 类型系统论文; 对象存储论文; char论文; vector论文;