中草药代码 2009-07-29
为了不被wordnet的API所限制,为了不用每次都拿着文档一个一个单位的比对,为了某某某的相似度计算不再计算的头昏眼花,为了我自己之后可能会用到wordnet。In a word,在如此强大的需求之下,我终于决定把wordnet的数据库文件解析出来,按照自己定义的模式保存在数据库中。——在这个过程中,第一次真实得感受到了传统关系数据库的局限性,不知道被热捧的XML数据库发展到什么程度了。
废话一堆,言归正传。接下来,首先将分别说一下总体的思路和wordnet数据库数据表模式的结构和关系,接着依照数据库生成的过程简单解析各张表格的结构,最后部分大概说说目前的使用以及可能的使用,包括一些纯属个人兴趣,和研究或项目没有任何关系的古怪想法。
1、总体思路和数据表模式
wordnet的数据文件分为两类:索引文件*.index和数据文件*.data。其中索引文件主要指定了某一个(字符串)单词所属的同义词集的集合,而数据文件其实是对每一个同义词集的详细解析,包括该同义词集包含的(字符串)单词,对应的周边关系和该同义词集的概念解析。
很自然的,考虑到了直接将一个数据文件映射到一个或者多个数据表上去。就是说数据文件和数据库表之间维护着单映射关系。由此,基于wordnet数据文件的结构分析,数据库的总体模式由四张表组成。分别为:索引文件*.index解析成index_term表,数据文件*.data由三张表组成,这里称之为一张主表加两张附表,主表synset主要保留了同义词集包含的词语和它自身的解析,另外两个表项relation_cnt和verb_frame_cnt分别标记该同义词集的关系数和动词组合结构数。为了最简化数据表的关系,主表和附表都是使用同义词集标记synset_id进行关联。
最终,数据表之间的模式关系可以参见下图一所示:
图一、数据库表模式关系图
2、数据库表格解析
index_term表保存了每一个(字符串)词语,以及所有所属同义词集的标记号。这里出现了刚才提到的问题,也就是关系数据库无法有效的表示这种大小可扩展的表项,在程序中synset表项可以使用一个不定长数组来表示,但是在数据库中就比较麻烦了。当然,设置好分割标记,将数组转换成字符串然后建立全文索引也是可以的,理论上来说是这样,但是这样保存的东西使用起来非常麻烦,而且也不直观。
synset表保存了一个同义词集的固有属性,表项中的index_word也是这么个问题。注意其中的relation_cnt项和verb_frame_cnt项,分别标记关系数量和动词组合结构数量。
这里假设分别要了解一个(字符串)词语和一个同义词集的相关信息,应该如何利用数据库最快的获取。
a)、(字符串)词语:首先以该词语w为查询条件在index_term表中获取它对应的所有同义词集的标记号,设为{id},——如果所属同义词集不只一个,那么根据具体情况决定是否要将w绑定到某一个id上。这样,这个问题就转化成获取某一个同义词集的相关信息,具体见a)部分;
b)、同义词集:给定一个同义词集,用它的标记号id作为查询条件在synset表中获取属于该同义词集的所有(字符串)词语。——(字符串)词语和同义词集之间是多对多的关系。如果relation_cnt项和verb_frame_cnt项不为0,说明该同义词集具有相关同义词集和动词组合结构(只有动词的这一项才可能不为0),分别以标记号id到relation表和verb_frame表查找出对应的关系对和组合结构。
注:verb_frame表,目前想不到会有什么用,只是为了边面以后重复解析,所以解析出来了,里面有些内容没有仔细去研究。先忽略之,等以后要用到的时候再去完善。
3、一些应用,包括但不限于,未完待续…
a)、概念相似度的计算:应该说,这个是最无聊,最笨蛋,最缺乏创意的应用,不得不承认,也是用的最多的,——我们都是笨蛋。这个就不说了,或者让某某来解释一下。下文是我们最终讨论的大致算法,和最后编程实现有一些偏差,供参考。
WORDNET相似度计算算法
1、使用关系:
同义关系,is-a关系,part-of关系
2、概念之间以同义集关系进行跳转。
如果两概念之间为同义集关系,则直接计算,
否则同义集之间的关系跳转使用is-a关系和part-of关系
3、概念深度的计算考虑三种选择:
一是单关系单向从根结点开始扫描;
二是两关系(is-a关系和part-of关系)单向从根结点开始扫描;
注意事项:
1、待测试的概念对可以指定所属同义集,也可不指定,此时用所有包含该概念的同义集集合作为待测概念;
2、深度计算是从根节点单向扫描,知道获得待测的两个概念为止;
——之后的想法都比较简单,大都还停留在思考阶段
b)、如果两个概念之间有多条路径,会发生什么?
c)、不同的路径模式之间有什么关系,比如单关系路径,混合关系路径?
d)、我们是不是可以开发一套单词记忆软件,基于同义词集的单词记忆,基于关系的联想记忆?
……