为什么Spark MLlib HashingTF仅输出1D向量?

时间:2016-09-24 18:06:07

标签: scala apache-spark dataframe apache-spark-mllib apache-spark-ml

所以我有这个格式的大数据框:

dataframe:org.apache.spark.sql.DataFrame = [id: string, data: string]

数据是一组非常大的单词/标识符。它还包含不必要的符号,如[“{等我需要清理。

我的解决方案是:

val dataframe2 = sqlContext.createDataFrame(dataframe.map(x=> Row(x.getString(0), x.getAs[String](1).replaceAll("[^a-zA-Z,_:]",""))), dataframe.schema)

我需要对这些数据应用ML,所以它应该像这样进入管道。

  1. First Tokenizing,它给出了
  2. org.apache.spark.sql.DataFrame = [id: string, data: string, tokenized_data: array<string>]

    带输出的

    (没有data列)

    [id1,WrappedArray(ab,abc,nuj,bzu...)]

    1. StopWords删除
    2. org.apache.spark.sql.DataFrame = [id: string, data: string, tokenized_data: array<string>, newData: array<string>]

      带输出(不包含datatokenized_data

      [id1,WrappedArray(ab,abc,nuj,bzu...)]

      1. HashingTF
      2. 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到几十个特征。然而,我的几乎所有/大部分向量都是一维的。我想用这些数据进行一些聚类,但是1维度是一个大问题。为什么会发生这种情况?我该如何解决?

        我发现当我清理数据时,错误恰好发生了。如果我不进行清理,HashingTF会正常执行。在清理过程中我做错了什么?如何在不弄乱格式的情况下执行类似的清理工作?

1 个答案:

答案 0 :(得分:1)

[^a-zA-Z,_:]匹配所有空格。它会产生一个连续的字符串,当标记化时会创建一个令牌,而Vector则带有一个条目。您应该排除空格或使用正则表达式作为替换。