如何将 n-grams 组合成 Spark 中的一个词汇表?
How to combine n-grams into one vocabulary in Spark?
想知道是否有内置的 Spark 功能可以将 1-、2-、n-gram 特征组合成一个词汇表。在 NGram
中设置 n=2
然后调用 CountVectorizer
会导致字典仅包含 2-grams。我真正想要的是将所有频繁的 1-gram、2-gram 等组合到我的语料库中的一个字典中。
您可以训练单独的 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)
想知道是否有内置的 Spark 功能可以将 1-、2-、n-gram 特征组合成一个词汇表。在 NGram
中设置 n=2
然后调用 CountVectorizer
会导致字典仅包含 2-grams。我真正想要的是将所有频繁的 1-gram、2-gram 等组合到我的语料库中的一个字典中。
您可以训练单独的 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)