|
@@ -1,3 +1,108 @@
|
|
|
# sim-dict
|
|
|
|
|
|
-短文本相似度
|
|
|
+## 简介 Introduction
|
|
|
+
|
|
|
+sim-dict 是一个计算文本相似度的模块,支持词语、短文本、长文本相似度计算;对中文字符提供包含语义的相似度计算,非中文字符只支持字符层面的相似度计算。
|
|
|
+
|
|
|
+## 快速上手 Getting Started
|
|
|
+
|
|
|
+```python
|
|
|
+>>> from sim.text_sim import get_similarity
|
|
|
+>>> get_similarity('环境算法实现', '温度控制策略')
|
|
|
+0.7166666666666667
|
|
|
+```
|
|
|
+
|
|
|
+## 入门 Basics
|
|
|
+
|
|
|
+### 环境准备 Prerequisite
|
|
|
+
|
|
|
+建议使用 [virtualenv](https://virtualenv.pypa.io/en/latest/) 创建虚拟环境作为开发和生产环境,virtualenv 是用来为应用创建一套“隔离”的 Python 运行环境的工具。
|
|
|
+
|
|
|
+首先,用 pip 安装 virtualenv
|
|
|
+
|
|
|
+```bash
|
|
|
+$ pip3 install virtualenv
|
|
|
+```
|
|
|
+
|
|
|
+假如我们要开发一个新的项目,需要一套独立的 Python 运行环境,可以这么做:
|
|
|
+
|
|
|
+第一步,创建目录:
|
|
|
+
|
|
|
+```bash
|
|
|
+~ mkdir myproject
|
|
|
+~ cd myproject
|
|
|
+```
|
|
|
+
|
|
|
+第二步,创建一个独立的 Python 运行环境,命名为 venv:
|
|
|
+
|
|
|
+```bash
|
|
|
+~/myproject virtualenv -p /usr/bin/python venv
|
|
|
+Running virtualenv with interpreter /usr/bin/python
|
|
|
+Already using interpreter /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
|
|
|
+New python executable in /Users/highing/code/python/test/venv/bin/python
|
|
|
+Installing setuptools, pip, wheel...
|
|
|
+done.
|
|
|
+```
|
|
|
+
|
|
|
+参数 p 用来指定创建环境使用的 Python 解释器的路径,比如我们要使用 Python 3.8 版本的虚拟环境,可以用版本为 3.8 的解释器路径来替
|
|
|
+代 -p 后边的参数,这样创建的环境也就是 Python 3.8 了
|
|
|
+
|
|
|
+命令 virtualenv 就可以创建一个独立的 Python 运行环境,新建的 Python 环境就被放到当前目录下的 venv 目录。我们可以通过 source 命令进入环境
|
|
|
+
|
|
|
+```bash
|
|
|
+~/myproject source venv/bin/activate
|
|
|
+(venv) ~/myproject
|
|
|
+```
|
|
|
+
|
|
|
+### 安装 Installation
|
|
|
+
|
|
|
+sim-dict 目前已经被打包放在公司的[私服仓库](http://dev.dp.sagacloud.cn:8082/#admin/repository/repositories)了,我们可以在创建好的虚拟环境安装它
|
|
|
+
|
|
|
+```bash
|
|
|
+(venv) ~/myproject pip install short-text-sim -i http://dev.dp.sagacloud.cn:8082/repository/saga-pypi-group/simple --trusted-host dev.dp.sagacloud.cn
|
|
|
+```
|
|
|
+
|
|
|
+## 进阶篇 Advanced
|
|
|
+
|
|
|
+在 sim-dict 实现的文本相似度计算方法中,大概分为分词、词相似度计算、文本相似度计算三个步骤。
|
|
|
+
|
|
|
+### 关于词林
|
|
|
+
|
|
|
+[「同义词词林」](https://baike.baidu.com/item/%E5%90%8C%E4%B9%89%E8%AF%8D%E8%AF%8D%E6%9E%97)是梅家驹等人与 1983 年词林编撰完成的,后经哈工大更新扩展,sim-dict 是在扩展版基础上实现的。
|
|
|
+词林根据词语的含义、类型、词性将所收录的汉语词分为了 12 大类,从大到小一共五层,第五层成为原子词群,意为不可再分,每个原子词群都有一个五层结构的编码,比如 Aa01C02=。
|
|
|
+
|
|
|
+### 词相似度计算
|
|
|
+
|
|
|
+根据词林建立一个「词——编码」的哈希表,通过这样的哈希表,就可以查询词的编码。获取两个待计算相似度词的编码,对比两个编码,根据匹配程度计算相似度。编码具有五个层级,
|
|
|
+从大到小匹配得分分别为 3,3,2,1,1,总分为 10 分,匹配累计得分与总分的比值即为相似度。
|
|
|
+
|
|
|
+### 文本相似度计算
|
|
|
+
|
|
|
+ 将两个待计算相似度的文本进行分词操作,我们这里用的分词工具是[结巴分词](https://github.com/fxsjy/jieba)。根据分词结构计算词相似度,得到如下的词相似度矩阵
|
|
|
+ 分别获取该矩阵每行、每列的最大值的均值,计算这两个平均值的均值,即为这两个文本的相似度。
|
|
|
+
|
|
|
+ - | 环境 | 算法 | 实现
|
|
|
+ ----| ----| --- | ---
|
|
|
+ 温度 | 0.4 | 0.3 | 0.2
|
|
|
+ 控制 | 0.1 | 0.3 | 0.4
|
|
|
+ 策略 | 0.4 | 0.6 | 0.2
|
|
|
+
|
|
|
+### 更新词林
|
|
|
+
|
|
|
+往词林是添加新词(词林未收录的词)没有明确统一的方法,主要基于个人对于词林对理解,下边是我们常用的思路。
|
|
|
+
|
|
|
+对于一个新词,尝试列举它的同义词、近义词,如果它的同/近义词在词林里,那么将该新词直接放在它的同/近义词所在的原子词群即可,这样通过词林计算二者相似度的时候即可得到最高的分数,
|
|
|
+与我们认为的二者是同义/近义是相符的。
|
|
|
+
|
|
|
+如果无法列举该词合适的同/近义词,或者该词的同/近义词未被词林收录,我们要尝试总结该词的类型、词性、词义,并根据词林分类的逻辑,将其放入合适的词群或者建立新的词群和与之对应的编码。
|
|
|
+比如“空调主机”要放在第一大类“物”里,第二大类“机具”里,第三类“机器 工具 泵”里……
|
|
|
+
|
|
|
+如果该词是多义的,对于每一个词义,按照上述逻辑分别执行添词操作即可。
|
|
|
+
|
|
|
+由于基于词林方法的性质,即通过人的理解将词分类,并以此为基础进行词、句相似度的计算,所以目前来说无法通过机器自动完成新词添加操作,这也是这种方法维护最为繁琐的地方。
|
|
|
+
|
|
|
+## 附录 Appendix
|
|
|
+
|
|
|
+[基于同义词词林的词语相似度计算方法](http://gb.oversea.cnki.net/KCMS/detail/detail.aspx?filename=CCYD201006010&dbcode=CJFD&dbname=CJFD2010)
|
|
|
+
|
|
|
+[Final_word_Similarity](https://github.com/yaleimeng/Final_word_Similarity)
|