同义词相似度可以怎样计算

标签: dev | 发表时间:2018-06-29 00:00 | 作者:
出处:http://itindex.net/relian

前言

词语的相似性的计算方法有很多,比如字面相似度计算方法、基于语义词典的计算方法、基于统计的相似度(向量空间模型)计算方法和基于神经网络的相似度计算方法。

本篇文章讲讲基于词林的语义相似性。

词林

《同义词词林》是上世纪80年代出版的对汉语词汇进行语义分类的义类词典,共收录64223条词目。随后发展,哈尔滨工业大学信息检索实验室对其进行修正完善,《哈工大社会计算与信息检索研究中心同义词词林扩展版》。

格式

举个例子一般的格式如下,一共包含了五个级别和一个标记位,看下面第一行从左到右,A为一级、a为二级、01为三级、A为四级、02为五级、=为标记位。标记位主要是用于区分常规同义词、相关词和只有词语本身,分别用 = # @三个符号表示。其中 = 表示常规同义词,# 表示相关词,@ 则表示独立性质,既没有同义词也没有相关词。

  Aa01A02= 人类 生人 全人类   
Aa01B03# 良民 顺民
Aa01D01@ 角色
Aa02A08= 奴 妾 妾身 民女


编码位 1 2 34 5 67 8
类别级别 一级 二级 三级 四级 五级 标记位
类别含义 大类 中类 小类 词群 原子词群 词语关系

词语相似度

词林的格式可以看成是一共有6个级,那么可以给每个级分配一定的权重,比如分配为 1.2, 1.2, 1.0, 1.0, 0.8, 0.4,总和为5.6。那么计算相似度时其实就是先获取两个单词对应的编码,然后再逐一对比编码每个级是否相等,将所有相等的级的权重加起来,除以总和得到的值即为相似性值。实现如下:

  public static double sumWeight(String code1, String code2) {   
        double weight = 0.0;
        for (int i = 1; i <= 6; i++) {
            String c1 = getLevelCode(code1, i);
            String c2 = getLevelCode(code2, i);
            if (c1.equals(c2)) {
                weight += WEIGHT[i - 1];
            } else {
                break;
            }
        }
        return weight;
    }

public static String getLevelCode(String code, int level) {
        switch (level) {
        case 1:
            return code.substring(0, 1);
        case 2:
            return code.substring(1, 2);
        case 3:
            return code.substring(2, 4);
        case 4:
            return code.substring(4, 5);
        case 5:
            return code.substring(5, 7);
        case 6:
            return code.substring(7);
        }
        return "";
    }

另外,由于每个词可能有多个编码,所以处理时取最高相似值的那个。

  public double getSimilarity(String s1, String s2) {   
        if (s1 == null && s2 == null) {
            return 1.0;
        } else if (s1 == null || s2 == null) {
            return 0.0;
        } else if (s1.equalsIgnoreCase(s2)) {
            return 1.0;
        }
        Set<String> codeSet1 = CilinDictionary.getInstance().getCilinCoding(s1);
        Set<String> codeSet2 = CilinDictionary.getInstance().getCilinCoding(s2);
        if (codeSet1 == null || codeSet2 == null) {
            return 0.0;
        }
        double similarity = 0.0;
        for (String code1 : codeSet1) {
            for (String code2 : codeSet2) {
                double s = sumWeight(code1, code2) / TOTAL_WEIGHT;
                logger.debug(code1 + "-" + code2 + "-" + sumWeight(code1, code2));
                if (similarity < s)
                    similarity = s;
            }
        }
        return similarity;
    }

测试

  public void test() {   
        String s1 = "中国人";
        String s2 = "炎黄子孙";
        CilinSimilarity cs = new CilinSimilarity();
        System.out.println(cs.getSimilarity(s1, s2));
        s1 = "汽车";
        s2 = "摩托";
        System.out.println(cs.getSimilarity(s1, s2));
        s1 = "人";
        s2 = "动物";
        System.out.println(cs.getSimilarity(s1, s2));
        s1 = "猫";
        s2 = "狗";
        System.out.println(cs.getSimilarity(s1, s2));
        s1 = "今天";
        s2 = "明天";
        System.out.println(cs.getSimilarity(s1, s2));
    }
   1.0000000000000002   
 0.4285714285714286
 0.0
 0.4285714285714286
 0.7857142857142858

github

https://github.com/sea-boat/TextAnalyzer/blob/master/src/main/java/com/seaboat/text/analyzer/similarity/CilinSimilarity.java

相关 [同义词 相似 计算] 推荐:

同义词相似度可以怎样计算

- - IT瘾-dev
词语的相似性的计算方法有很多,比如字面相似度计算方法、基于语义词典的计算方法、基于统计的相似度(向量空间模型)计算方法和基于神经网络的相似度计算方法. 本篇文章讲讲基于词林的语义相似性. 《同义词词林》是上世纪80年代出版的对汉语词汇进行语义分类的义类词典,共收录64223条词目. 随后发展,哈尔滨工业大学信息检索实验室对其进行修正完善,《哈工大社会计算与信息检索研究中心同义词词林扩展版》.

URL相似度计算的思考

- - IT技术博客大学习
在做一些web相关的工作的时候,我们往往可能需要做一些对url的处理,其中包括对相似的url的识别和处理. 这就需要计算两个url的相似度. 那么怎么进行url相似度的计算的. 我首先想到的是把一个url看作是一个字符串,这样就简化成两个字符串相似度的计算. 字符串相似度计算有很多已经比较成熟的算法,比如“ 编辑距离算法”,该算法描述了两个字符串之间转换需要的最小的编辑次数;还有一些其他的比如“ 最长公共字串”等方法.

词向量加权计算相似度

- - 编程语言 - ITeye博客
基于词向量的几种计算文本相似度方法 :.    1)使用词向量求平均计算相似度.    2)词向量tfidf加权求平均计算相似度.    3)词向量加权-PCA计算相似度. # 将所有词向量的woed2vec向量相加到句向量. # 计算每个词向量的权重,并将词向量加到句向量. return sentenceSet # ===============word2vec词向量+tfidf================== def sentenceByW2VTfidf(corpus_tfidf, token2id, sentenceList, model, embeddingSize):.

同义词反馈机制

- - IT技术博客大学习
标签:   反馈   同义词.     由于搜索算法本身的局限性,对于用户的语义、意图等理解不够,而基于用户行为的点击调权,作为对传统搜索算法的补充,在搜索中扮演着重要的作用. 尽管用户行为已经被证明在搜索中的效果,但是一直只是停留在query-url层面,或者ngram-url层面[1],没有深入反馈到检索算法中的基础策略,比如:同义词、紧密度、省略等,这些策略影响了url与query之间的关系.

oracle同义词与dblink

- - 数据库 - ITeye博客
           Oracle同义词(synonyms).         从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系. 这种映射关系体现在同个数据库中通过表别名进行访问,也体现在访问远程数据库中某张表,这时候就需要创建dblink.         同义词创建权限       .

相似度计算常用方法综述

- - 搜索研发部官方博客
       相似度计算用于衡量对象之间的相似程度,在数据挖掘、自然语言处理中是一个基础性计算. 其中的关键技术主要是两个部分,对象的特征表示,特征集合之间的相似关系. 在信息检索、网页判重、推荐系统等,都涉及到对象之间或者对象和对象集合的相似性的计算. 而针对不同的应用场景,受限于数据规模、时空开销等的限制,相似度计算方法的选择又会有所区别和不同.

如何计算两个文档的相似度(一)

- - 我爱自然语言处理
前几天,我发布了一个和在线教育相关的网站: 课程图谱,这个网站的目的通过对公开课的导航、推荐和点评等功能方便大家找到感兴趣的公开课,特别是目前最火的Coursera,Udacity等公开课平台上的课程. 在发布之前,遇到的一个问题是如何找到两个相关的公开课,最早的计划是通过用户对课程的关注和用户对用户的关注来做推荐,譬如“你关注的朋友也关注这些课程”,但是问题是网站发布之前,我还没有积累用户关注的数据.

如何计算两个文档的相似度(三)

- - 我爱自然语言处理
上一节我们用了一个简单的例子过了一遍 gensim的用法,这一节我们将用 课程图谱的实际数据来做一些验证和改进,同时会用到 NLTK来对课程的英文数据做预处理. 为了方便大家一起来做验证,这里准备了一份Coursera的课程数据,可以在这里下载: coursera_corpus,总共379个课程,每行包括3部分内容:课程名\t课程简介\t课程详情, 已经清除了其中的html tag, 下面所示的例子仅仅是其中的课程名:.

海量数据相似度计算之simhash短文本查找

- - ITeye博客
在前一篇文章 《 海量数据相似度计算之simhash和海明距离》 介绍了simhash的原理,大家应该感觉到了算法的魅力. 但是随着业务的增长 simhash的数据也会暴增,如果一天100w,10天就1000w了. 我们如果插入一条数据就要去比较1000w次的simhash,计算量还是蛮大,普通PC 比较1000w次海明距离需要 300ms ,和5000w数据比较需要1.8 s.

如何计算两个文档的相似度(二)

- - 我爱自然语言处理
上一节我们介绍了一些背景知识以及 gensim , 相信很多同学已经尝试过了. 这一节将从gensim最基本的安装讲起,然后举一个非常简单的例子用以说明如何使用gensim,下一节再介绍其在 课程图谱上的应用. 二、gensim的安装和使用. gensim依赖 NumPy和 SciPy这两大Python科学计算工具包,一种简单的安装方法是pip install,但是国内因为网络的缘故常常失败.