【问题标题】:How to combine n-grams into one vocabulary in Spark?如何在 Spark 中将 n-gram 组合成一个词汇表?
【发布时间】:2016-12-14 20:40:20
【问题描述】:

想知道是否有内置的 Spark 功能可以将 1-、2-、n-gram 特征组合成一个词汇表。在NGram 中设置n=2,然后调用CountVectorizer 会产生一个仅包含2-gram 的字典。我真正想要的是将所有频繁出现的 1-gram、2-gram 等组合到我的语料库中的一本字典中。

【问题讨论】:

    标签: python apache-spark nlp pyspark apache-spark-ml


    【解决方案1】:

    您可以训练单独的 NGramCountVectorizer 模型并使用 VectorAssembler 进行合并。

    from pyspark.ml.feature import NGram, CountVectorizer, VectorAssembler
    from pyspark.ml import Pipeline
    
    
    def build_ngrams(inputCol="tokens", n=3):
    
        ngrams = [
            NGram(n=i, inputCol="tokens", outputCol="{0}_grams".format(i))
            for i in range(1, n + 1)
        ]
    
        vectorizers = [
            CountVectorizer(inputCol="{0}_grams".format(i),
                outputCol="{0}_counts".format(i))
            for i in range(1, n + 1)
        ]
    
        assembler = [VectorAssembler(
            inputCols=["{0}_counts".format(i) for i in range(1, n + 1)],
            outputCol="features"
        )]
    
        return Pipeline(stages=ngrams + vectorizers + assembler)
    

    示例用法:

    df = spark.createDataFrame([
      (1, ["a", "b", "c", "d"]),
      (2, ["d", "e", "d"])
    ], ("id", "tokens"))
    
    build_ngrams().fit(df).transform(df) 
    

    【讨论】:

    • 谢谢,这很有道理。
    • 另一种方法是使用VectorAssembler 组合一元和二元,然后将单个向量提供给CountVectorizer。我认为这更符合 scikit-learn CountVectorizer。但不确定它是否真的有影响。
    • @danieln 如果没有任何改变,VectorAssembler 无法组装字符串数组。
    • 如何将 n-gram 范围(如 (1,3))提供给 HasigTF?
    猜你喜欢
    • 2019-05-14
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    相关资源
    最近更新 更多