Cosine Similarity Algorithm

1 原理

这个算法的原型是

比方说我们有两个数据已经完成了向量化${\vec{a},\vec{b} \in R^{ n }}$

$$ \cos \theta = \frac{\vec{a}\cdot\vec{b}}{\parallel{\vec{a}}\parallel \parallel{\vec{b}}\parallel} $$

$\cos{\theta}$越接近$1$就表明,两个向量相似程度越高,因为把模长除掉了,这样既可以排除模长的影响

2 实践

2.1 高程作业:个人物品管理系统

链接在SCAU-CS/high-level-programming at master · TrialNeo/SCAU-CS 当时要做一个根据物品名称的模糊搜索功能,也作为一个创新点,所以就选择了当前的算法。 比如说有下面这些 物品存储库 里面有这些

  • 《c语言从入门到精通》
  • 《c语言零基础到入门》
  • 《c语言从精通到放弃》 搜索python入门

2.1.1 向量化

很自然的我们要对这些东西进行向量化,因为是作业限制,不能用token之类的库,所以想法是把一个一个词分隔开,例如:

先进行词分割

$$ 《c语言从入门到精通》\implies \{ 《,c,语,言,从,入,门,到,精,通,》 \} $$$$ python入门 \implies \{ p,y,t,h,o,n,入,门 \} $$

然后合并

$$ \begin{aligned} \{《,c,语,言,从,入,门,到,精,通,》,p,y,t,h,o,n \} \\ \end{aligned} $$$$ \begin{align} 《c语言从入门到精通》\implies \{1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0 \} \\ python入门\implies \{ 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 \} \end{align} $$

然后利用#1 原理,进行计算

不过这样有个问题,向量化这一部分做的不好,有些空间还是可以改进一下的。

比如说不要做一个合并操作,直接拿第一段 存起来的文本 来做vector space

这样就可以优化成

$$ \vec{V}= \{《,c,语,言,从,入,门,到,精,通,》 \} $$

$$ \begin{align} 《c语言从入门到精通》 & \implies \{1,1,1,1,1,1,1,1,1,1,1 \} \\ python入门 & \implies \{ 0,0,0,0,0,1,1,0,0,0 \} \end{align} $$

2.1.2 一个比较好笑的bug

记录一下,当时写的时候一个比较好笑的bug

待搜索还是

  • 《c语言从入门到精通》
  • 《c语言零基础到入门》
  • 《c语言从精通到放弃》

搜索文本是:香蕉雪梨水果苹果菠萝火龙果哈密瓜地稍瓜沙果构桃乌梅木瓜椰子诺丽果诺曼底登录 可以说两段文本一点关系都没有,但是还是有相似度。原因是写写惯了其他语言,然后直接拿下标去取字符以为取出来的是汉字

就是

1
char * str = "香蕉雪梨水果苹果菠萝火龙果哈密瓜地稍瓜沙果构桃乌梅木瓜椰子诺丽果诺曼底登录";

还以为str[1] == "香",实际上汉字utf-8编码之下占4个字节,这会闹了大笑话

使用 Hugo 构建
主题 StackTrial 设计