4
想知道是否有內置Spark功能將1-,2-,n-gram特徵合併到單個詞彙表中。在NGram
中設置n=2
,然後調用CountVectorizer
,結果產生僅包含2-gram的字典。我真正想要的是將所有常用的1克,2克等組合成一本我的語料庫的詞典。如何將n-gram組合成Spark中的一個詞彙?
想知道是否有內置Spark功能將1-,2-,n-gram特徵合併到單個詞彙表中。在NGram
中設置n=2
,然後調用CountVectorizer
,結果產生僅包含2-gram的字典。我真正想要的是將所有常用的1克,2克等組合成一本我的語料庫的詞典。如何將n-gram組合成Spark中的一個詞彙?
您可以單獨訓練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)
謝謝,這是非常合情合理的。 –
另一種方法是使用'VectorAssembler'結合unigrams和bigrams,然後將單個矢量饋送到'CountVectorizer'。我認爲這更符合scikit-learn CountVectorizer。不知道它是否會產生真正的差異。 –
@danieln如果沒有改變'VectorAssembler'不能組合字符串數組。 – zero323