计算scala中的余弦相似度
calculate cosine similarity in scala
我有一个包含UserId、MovieId的文件(tags.csv),tags.I想使用基于域的方法来计算标签之间的余弦相似度。我只想显示喜剧的相关标签,并测量与喜剧标签相关的每个标签的相似度。
数据集
我的代码是:
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)
怎么了?
错误消息充满了相关信息。
NumberFormatException: For input string: "[1,898,"black comedy"]"
输入 String
似乎没有拆分成单独的列数据。所以 .split(", ")
没有完成它的工作,很容易看出为什么,没有逗号-space 序列可以分割。
我们可以去掉 space 并仅在逗号上拆分,但这仍然会在第 1 列数据中留下非数字 [
,而第 3 列数据在全部.
有几种不同的方法可以解决这个问题。我很想使用正则表达式解析器。
val twoNums = "(\d+),(\d+),".r.unanchored
val vecData = rows.collect{ case twoNums(a, b) =>
Vectors.dense(Array(a.toDouble, b.toDouble))
}
我有一个包含UserId、MovieId的文件(tags.csv),tags.I想使用基于域的方法来计算标签之间的余弦相似度。我只想显示喜剧的相关标签,并测量与喜剧标签相关的每个标签的相似度。
数据集
我的代码是:
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)
怎么了?
错误消息充满了相关信息。
NumberFormatException: For input string: "[1,898,"black comedy"]"
输入 String
似乎没有拆分成单独的列数据。所以 .split(", ")
没有完成它的工作,很容易看出为什么,没有逗号-space 序列可以分割。
我们可以去掉 space 并仅在逗号上拆分,但这仍然会在第 1 列数据中留下非数字 [
,而第 3 列数据在全部.
有几种不同的方法可以解决这个问题。我很想使用正则表达式解析器。
val twoNums = "(\d+),(\d+),".r.unanchored
val vecData = rows.collect{ case twoNums(a, b) =>
Vectors.dense(Array(a.toDouble, b.toDouble))
}