分享

Spark 高级分析:第六章第8,9节 低维度查询和评分以及词相关性

feilong 2018-6-22 10:47:22 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 5134
本帖最后由 feilong 于 2018-6-22 10:48 编辑
问题导读

1.什么是余弦相似度,如何计算?
2.LSA有哪些降维的方式?
3
.LSA如何降维?

4.如何计算词之间的相似性?




一篇:Spark 高级分析:第六章第7节 找到重要概念
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24672&extra=


一个词语和一个文档有什么关系?两项之间的关系如何?哪些文档最符合一组查询条件?最初的term文档矩阵提供了一个简单的方法来回答这些问题。通过计算矩阵中两个列向量之间的余弦相似度,可以得到两项之间的相关性分数。余弦相似度测量两个向量之间的夹角。在高维文档空间中指向同一方向的向量被认为是相互关联的。它被计算为向量的点积除以它们长度的乘积。在自然语言和信息检索应用中,余弦相似度被广泛地用作词语向量和文档权重之间的相似度度量。同样地,对于两个文档,关联分数可以计算为它们的两个行向量之间的余弦相似度。一个词语和一个文档之间的相关性得分可以简单地作为两个方面的交集中的元素。

然而,这些分数来自于对这些实体之间关系的肤浅认识,依赖于简单的频率计数。LSA提供了将这些分数建立在对语料库的更深层次理解上的能力。例如,如果在诺曼底登陆的一篇文章中,“大炮”一词没有出现,但它经常提到榴弹炮,LSA代表可能能够在其他文件中,根据火炮和榴弹炮的共同出现,恢复火炮和文章之间的关系。

LSA表示也从效率的角度提供了好处。它将重要的信息封装到一个低维度的表示中,而不是原始的词文档矩阵。考虑寻找与特定词语最相关的词语集的任务。这个简单的方法要求在这个词语的列向量和所有其他列向量之间,在这个词语表矩阵中计算点积。这涉及到一系列的乘法,正比于词语的数量乘以文档的数量。LSA可以通过查找它的概念空间表示并将其映射回词语空间来实现同样的结果,它需要大量的乘法,而只需要与k的数量成比例。

LSA理解在重建的低秩矩阵中两个列之间的余弦相似度之间的关系,即如果将三个近似因子相乘在一起时将产生的矩阵。LSA背后的一个想法是,这个矩阵提供了一个更有用的数据表示。它提供了以下几种方式:
•通过缩略相关术语来计算同义词。
•通过对具有多重含义的词语施加更少的权重来计算多义性。
•消除噪音。

然而,这个矩阵的这个内容实际上并不需要计算去发现余弦相似度。一些线性代数处理表明重构矩阵中两列之间的余弦相似度与SV T中相应列的余弦相似度完全相等。考虑寻找与特定词语最相关的词语集的任务。在一个词语和所有其他词语之间找到余弦相似度等价于将v中的每一行规范化,然后将对应的行乘以它。结果向量中的每个元素将包含一个词语和查询项之间的相似性。
为了简洁起见,我们省略了计算VS和规范其行的方法的实现,但是它们可以在存储库中找到。
[mw_shl_code=scala,true]import breeze.linalg.{DenseVector => BDenseVector}
import breeze.linalg.{DenseMatrix => BDenseMatrix}
def topTermsForTerm(
normalizedVS: BDenseMatrix[Double],
termId: Int): Seq[(Double, Int)] = {
val rowVec = new BDenseVector[Double](
row(normalizedVS, termId).toArray)
val termScores = (normalizedVS * rowVec).toArray.zipWithIndex
termScores.sortBy(-_._1).take(10)
}
val VS = multiplyByDiagonalMatrix(svd.V, svd.s)
val normalizedVS = rowsNormalized(VS)
def printRelevantTerms(term: String) {
val id = idTerms(term)
printIdWeights(topTermsForTerm(normalizedVS, id, termIds)
}
printRelevantTerms("algorithm")
...
(algorithm,1.000000000000002), (heuristic,0.8773199836391916), (compute,0.8561015487853708), (constraint,printRelevantTerms("radiohead")
...
(radiohead,0.9999999999999993), (lyrically,0.8837403315233519), (catchy,0.8780717902060333), (riff,printRelevantTerms("tarantino")
...
(tarantino,1.0), (soderbergh,0.780999345687437), (buscemi,0.7386998898933894), (screenplay,0.7347041267543623),[/mw_shl_code]


没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条