Casf基于矩阵进行余弦相似度计算的项目
本人自己做的一个玩意,地址https://github.com/SaltFishYe/Casf
基于scala语言开发,sparkSQL实现运算逻辑。
通过输入向量元素,对向量间的余弦相似度进行计算,可计算稀疏矩阵和满元素的矩阵。
余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1。
从一个二维图形比较容易理解,https://blog.csdn.net/allenjiao/article/details/83828021,此文有详细二位推到过程。
从二维平面扩展到多维向量空间,最后的余弦相似度可表示为,此图来自百度百科:
这里不对数学原理详细介绍。
假设存在向量a,b,c
a=(1,2,3,4,5,6),b=(2,3,5,7,8,1),c=(2,5,1,7,9,6)
我们可以把这三个向量组成一个矩阵:
可见,每一个元素可由两个两个元素标示,如b向量的第二个元素值为3,即可通过(b,2)形式表示,这里当做横轴值2和纵轴值b表示,上面表格的横轴仅仅是通过位置序列来作为标示,我们同样可以用其他东西标识,如下图:
在Casf中仅仅需要输入(y,x,e)形式的元素值,便可自动扩展矩阵,并可对任意维度的矩阵进行计算,并且Casf是通过构造的矩阵模型进行计算
Casf中提供一个class
case class MatrixElement(y: String, x: String, value: BigInt)
用来描述矩阵元素,并且仅仅通过输入Dataset[MatrixElement] 便可生成矩阵模型。
使用方式如下:
首先创建矩阵内部运算结构
val analyse = MatrixCosineAnalyse(sparkSession, axis = "y")
axis参数表示选择进行运算的向量是纵轴还是横纵,可选y,x,默认y,再通过运算模型返回举证模型
val matrixModel = analyse.simpleMatrixModel(words1.unionAll(words2).unionAll(words3),isSparse = false)
isSparse参数表示是否时稀疏矩阵,上诉已说明,只需要通过一个一个的向量输入即可生成矩阵模型,并且根据输入的元素可以自动扩展矩阵模型,若是输入的元素并没有完整填充成一个矩阵,如下图所示:
黄色单元格中的问号表示生成的矩阵模型缺少的元素,按照一般的相似度运算,比如纵轴的a,b两向量计算时,会忽略横轴x,n的元素,只对双方都含有的元素进行运算,
isSparse为true时表示稀疏矩阵,只对两向量间共同的元素进行运算,为false时表示将双方不同有的元素做0处理。
通过以下代码可返回所有向量两两间的相似度和指定向量两两间的相似度:
allSimilarityValue: Dataset[SimilarityValue]
similarity(vectorList: Array[String]): Dataset[SimilarityValue]
SimilarityValue含有三个属性,vector1,vector2,value,前两个属性表示是哪两个向量进行的相似度计算,value表示相似值
一下是计算文本相似度的案例,此案例代码在Casf中:
1 val article1: Dataset[String] = sparkSession.read 2 .textFile("src/test/data/不辜负党的期望人民期待民族重托.txt") 3 val article2: Dataset[String] = sparkSession.read 4 .textFile("src/test/data/在信息强国的道路上阔步前行.txt") 5 val article3: Dataset[String] = sparkSession.read 6 .textFile("src/test/data/坚定实现民族复兴的志向和信心.txt")
提取三个文本,经过分词后,获得(文章标示,中文词,词数量),构成Dataset[MatrixElement]
1 matrixModel.allSimilarityValue.show() 2 matrixModel.similarity(Array("article1", "article2")).show()
得出结果如下:
+--------+--------+-------------------+
| vector1| vector2| similarity_value|
+--------+--------+-------------------+
|article2|article1|0.15971369269593697|
|article3|article1| 0.4362075335522911|
|article3|article2| 0.2181638447849853|
+--------+--------+-------------------+
+--------+--------+-------------------+
| vector1| vector2| similarity_value|
+--------+--------+-------------------+
|article2|article1|0.15971369269593697|
+--------+--------+-------------------+
后续更新中会更新矩阵模型接受新元素值时更新矩阵模型,相似度预测等功能
posted on 2019-05-18 15:31 SaltFishYe 阅读(654) 评论(0) 编辑 收藏 举报