使用 pyspark 包含 1 到 3 个 n-gram 的 TF-IDF

问题描述

与 scikit-learn TfidfVectorizer(min_df=20,max_df=0.5,ngram_range=(1,3)) 中发生的情况类似,我想计算我的文本数据的术语频率并考虑 uni-grams、bi-grams 和 tri-grams。

因为我是 pyspark 的新手,所以我不完全确定这个解决方案能做到这一点,但这是我现在所拥有的,它产生一个向量,其中包含每个 n-gram 的组合 TF-IDF。

    def build_trigrams(inputCol="filtered",n=3):
    
    ngrams = [
        NGram(n=i,inputCol="filtered",outputCol="{0}_grams".format(i))
        for i in range(1,n + 1)
    ]
 
    cv = [
        CountVectorizer(minDF=20,maxDF=0.5,inputCol="{0}_grams".format(i),outputCol="{0}_tf".format(i))
        for i in range(1,n + 1)
    ]
    
    idf = [IDF(inputCol="{0}_tf".format(i),outputCol="{0}_tfidf".format(i),minDocFreq=5) for i in range(1,n + 1)]
 
    assembler = [VectorAssembler(
        inputCols=["{0}_tfidf".format(i) for i in range(1,n + 1)],outputCol="features"
    )]
    
    return Pipeline(stages=ngrams + cv + idf + assembler)

现在,与 this 问题中发生的情况类似,我希望以相同的方式查看数据帧中的特征:

features = tfidf.fit_transform(data['desciption'])
data_TF_IDF = pd.DataFrame(features.todense(),columns=tfidf.get_feature_names())

这样我就可以从文本数据中看到 n-gram 的 TF-IDF。问题是,当必须组合多个 CountVectorizers 时,我不知道该怎么做,如上面的函数所示。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)