Как объединить n-граммы в один словарь в Spark?

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

1 ответ

Вы можете тренировать отдельные модели 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)

licensed under cc by-sa 3.0 with attribution.