【问题标题】:calculate cosine similarity in scala在scala中计算余弦相似度
【发布时间】:2021-05-19 19:00:51
【问题描述】:

我有一个包含 UserId、MovieId、tags 的文件 (tags.csv)。我想使用基于域的方法来计算标签之间的余弦相似度。我只想显示喜剧的相关标签,并测量与喜剧标签相关的每个标签的相似度。

数据集

我的代码是:

val rows = sc.textFile("/usr/local/comedy")
val vecData = rows.map(line => Vectors.dense(line.split(", ").map(_.toDouble)))
val mat = new RowMatrix(vecData)
val exact = mat.columnSimilarities()
val approx = mat.columnSimilarities(0.07)
val exactEntries = exact.entries.map { case MatrixEntry(i, j, u) => ((i, j), u) }
val approxEntries = approx.entries.map { case MatrixEntry(i, j, v) => ((i, j), v) }
val MAE = exactEntries.leftOuterJoin(approxEntries).values.map {
  case (u, Some(v)) =>
    math.abs(u - v)
  case (u, None) =>
    math.abs(u)
}.mean()

但是出现了这个错误:

java.lang.NumberFormatException: For input string: "[1,898,"black comedy"]"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)

怎么了?

【问题讨论】:

  • 错误信息很清楚。您尝试将其转换为数字的 String 中有非数字字符。
  • 拜托,尽管我想使用标签,你能告诉我如何克服这个问题。
  • 您需要解析输入,以便仅将数字部分发送到.toDouble。您尚未发布任何文件数据示例,因此我们无法提出任何建议,但您可以弄清楚。
  • 我用文件数据样本更新问题。

标签: scala apache-spark cosine-similarity recommender-systems


【解决方案1】:

错误信息中充满了相关信息。

NumberFormatException: For input string: "[1,898,"black comedy"]"

看起来输入 String 没有被拆分为单独的列数据。所以.split(", ") 没有做好它的工作,很容易看出原因,没有逗号空间序列可以拆分。

我们可以去掉空格,只用逗号分割,但这仍然会在第一列数据中留下非数字[,而第三列数据根本没有数字字符。

有几种不同的方法可以解决这个问题。我很想使用正则表达式解析器。

val twoNums = "(\\d+),(\\d+),".r.unanchored
val vecData = rows.collect{ case twoNums(a, b) =>
                Vectors.dense(Array(a.toDouble, b.toDouble))
              }

【讨论】:

  • 非常感谢。请你帮我计算标签的余弦相似度:标签 l 相似度 l 有趣 l 0.0523,黑色喜剧 l 0.477,黑色喜剧 l 0.471,幽默 l 0.326。
猜你喜欢
  • 2015-05-24
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2018-04-11
  • 2021-05-29
  • 2017-02-03
相关资源
最近更新 更多