# 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
```

上述命令可以加上 --upgrade 参数完成更新操作。

## 进阶篇 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)