为什么 Spark MLlib HashingTF 只输出一维向量?
Why does Spark MLlib HashingTF output only 1D Vectors?
所以我有这个大数据框,格式为:
数据框:org.apache.spark.sql.DataFrame = [id: string, data: string]
数据是一个很大的集合words/indentifiers。它还包含不必要的符号,如 ["{ 等,我需要清理它们。
我的清理解决方案是:
val dataframe2 = sqlContext.createDataFrame(dataframe.map(x=> Row(x.getString(0), x.getAs[String](1).replaceAll("[^a-zA-Z,_:]",""))), dataframe.schema)
我需要将 ML 应用于此数据,因此它应该像这样进入管道。
- 第一次分词,给出
org.apache.spark.sql.DataFrame = [id: string, data: string, tokenized_data: array<string>]
有输出(没有 data
列)
[id1,WrappedArray(ab,abc,nuj,bzu...)]
- 停用词删除
org.apache.spark.sql.DataFrame = [id: string, data: string, tokenized_data: array<string>, newData: array<string>]
有输出(没有data
和tokenized_data
)
[id1,WrappedArray(ab,abc,nuj,bzu...)]
- HashingTF
org.apache.spark.sql.DataFrame = [id: string, data: string, tokenized_data: array<string>, newData: array<string>, hashedData: vector]
矢量看起来像这样:
[id1,(262144,[236355],[1.0])]
[id2,(262144,[152325],[1.0])]
[id3,(262144,[27653],[1.0])]
[id4,(262144,[199400],[1.0])]
[id5,(262144,[82931],[1.0])]
作为先前算法的结果创建的每个数组总体上可以包含从 0 到几十个特征。然而实际上 all/most 我的矢量是一维的。我想用这些数据做一些聚类,但是一维是个大问题。为什么会发生这种情况,我该如何解决?
我发现错误正是在我清理数据时发生的。如果我不进行清理,HashingTF 会正常执行。我在清理过程中做错了什么,如何在不弄乱格式的情况下执行类似的清理?
[^a-zA-Z,_:]
匹配所有空格。它会产生一个连续的字符串,当标记化时,它会创建一个标记和一个带有一个条目的 Vector
。您应该排除空格或使用正则表达式分词器作为替代。
所以我有这个大数据框,格式为:
数据框:org.apache.spark.sql.DataFrame = [id: string, data: string]
数据是一个很大的集合words/indentifiers。它还包含不必要的符号,如 ["{ 等,我需要清理它们。
我的清理解决方案是:
val dataframe2 = sqlContext.createDataFrame(dataframe.map(x=> Row(x.getString(0), x.getAs[String](1).replaceAll("[^a-zA-Z,_:]",""))), dataframe.schema)
我需要将 ML 应用于此数据,因此它应该像这样进入管道。
- 第一次分词,给出
org.apache.spark.sql.DataFrame = [id: string, data: string, tokenized_data: array<string>]
有输出(没有 data
列)
[id1,WrappedArray(ab,abc,nuj,bzu...)]
- 停用词删除
org.apache.spark.sql.DataFrame = [id: string, data: string, tokenized_data: array<string>, newData: array<string>]
有输出(没有data
和tokenized_data
)
[id1,WrappedArray(ab,abc,nuj,bzu...)]
- HashingTF
org.apache.spark.sql.DataFrame = [id: string, data: string, tokenized_data: array<string>, newData: array<string>, hashedData: vector]
矢量看起来像这样:
[id1,(262144,[236355],[1.0])]
[id2,(262144,[152325],[1.0])]
[id3,(262144,[27653],[1.0])]
[id4,(262144,[199400],[1.0])]
[id5,(262144,[82931],[1.0])]
作为先前算法的结果创建的每个数组总体上可以包含从 0 到几十个特征。然而实际上 all/most 我的矢量是一维的。我想用这些数据做一些聚类,但是一维是个大问题。为什么会发生这种情况,我该如何解决?
我发现错误正是在我清理数据时发生的。如果我不进行清理,HashingTF 会正常执行。我在清理过程中做错了什么,如何在不弄乱格式的情况下执行类似的清理?
[^a-zA-Z,_:]
匹配所有空格。它会产生一个连续的字符串,当标记化时,它会创建一个标记和一个带有一个条目的 Vector
。您应该排除空格或使用正则表达式分词器作为替代。