2016-08-08 4 views
4

Удивительно, если есть встроенная функция Spark для объединения функций 1-, 2-, n-грамм в один словарь. Установка n=2 в NGram с последующим вызовом CountVectorizer приводит к словарю, содержащему только 2 грамма. Я действительно хочу объединить все частые 1 грамм, 2 грамма и т. Д. В один словарь для моего корпуса.Как объединить n-граммы в один словарь в Spark?

ответ

7

Вы можете обучить отдельные модели NGram и CountVectorizer и слить их с помощью 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) 
+1

Спасибо, что имеет смысл. –

+0

Альтернативой было бы объединение униграмм и биграмм с помощью 'VectorAssembler', а затем подача одного вектора в' CountVectorizer'. Я думаю, что это больше похоже на scikit-learn CountVectorizer. Не уверен, что это действительно имеет значение. –

+1

@ danieln Если ничего не изменилось, VectorAssembler не может собрать массивы строк. – zero323

 Смежные вопросы

  • Нет связанных вопросов^_^