基于余弦相似度算法计算文本相似度
原理
在数学几何运算中,余弦定理用于计算两条边的夹角,余弦值越大,夹角越小。当夹角为0°时,两条边(x,y)完全重合。计算公式如下:
$$ cosθ = \frac{ x_{1}x_{2} + y_{1}y_{2} }{\sqrt{ x_{1}^{2} + y_{1}^{2} }\sqrt{ x_{2}^{2} + y_{2}^{2} }} $$
而对于多维图像(x,y,z...)三(甚至n)条边,计算公式如下:
$$ cos(θ) = \frac{a*b}{|a||b|} = \frac{ \sum \limits_{i=1}^{n}(x_{i} * y_{i})}{ \sqrt{ \sum \limits_{i=1}^{n}(x_{i})^{2}} \sqrt{ \sum \limits_{i=1}^{n}(y_{i})^{2} } } $$
同样对于计算两段文本,计算两段文本的相似度。将文本切割成若干个词向量,切词则交由NLP进行。而将每一个词向量看成数学几何运行中的边,最后则演变成计算多维余弦夹角。
文本切词
- 文本1:明天\不\下雨
- 文本2:明天\不\可能\下雨
文本词频统计
- 文本1词频:(明天=>1, 不=>1, 下雨=>1, 可能=>0)
- 文本2词频:(明天=>1, 不=>1, 下雨=>1, 可能=>1)
文本词向量
- 文本1词向量:(1,1,1,0)
- 文本2词向量:(1,1,1,1)
余弦计算
$$ cos(θ) = \frac{a*b}{|a||b|} = \frac{ \sum \limits_{i=1}^{n}(x_{i} * y_{i})}{ \sqrt{ \sum \limits_{i=1}^{n}(x_{i})^{2}} \sqrt{ \sum \limits_{i=1}^{n}(y_{i})^{2} } } = \frac{ 1×1+1×1+1×1+0×1 }{ \sqrt{1^{2}+1^{2}+1^{2}+0^{2}} \sqrt{1^{2}+1^{2}+1^{2}+1^{2}}} =0.87 $$
配置LAC切词
- CMakeLists.txt: 修改line:6中"paddle path"
- main.cpp: 修改line:9中"you model path"
编译运行
git clone https://github.com/icharle/cosine-similarity.git
cd cosine-similarity
cmake .
make && make install
# 运行(output/bin目录下即为二进制运行文件)
./output/bin/main