在scala中计算余弦相似性

pinkon5k  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(513)

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

我的代码是:

  1. val rows = sc.textFile("/usr/local/comedy")
  2. val vecData = rows.map(line => Vectors.dense(line.split(", ").map(_.toDouble)))
  3. val mat = new RowMatrix(vecData)
  4. val exact = mat.columnSimilarities()
  5. val approx = mat.columnSimilarities(0.07)
  6. val exactEntries = exact.entries.map { case MatrixEntry(i, j, u) => ((i, j), u) }
  7. val approxEntries = approx.entries.map { case MatrixEntry(i, j, v) => ((i, j), v) }
  8. val MAE = exactEntries.leftOuterJoin(approxEntries).values.map {
  9. case (u, Some(v)) =>
  10. math.abs(u - v)
  11. case (u, None) =>
  12. math.abs(u)
  13. }.mean()

但出现以下错误:

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

怎么了?

ix0qys7i

ix0qys7i1#

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

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

看起来像是输入 String 没有被拆分为单独的列数据。所以呢 .split(", ") 不做它的工作,很容易理解为什么,没有逗号空间序列分割。
我们可以去掉空格,只在逗号处分开,但仍然会留下一个非数字 [ 在第1列数据和第3列数据中根本没有数字字符。
有几种不同的方法来解决这个问题。我很想使用正则表达式解析器。

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

相关问题