我正在尝试使用SparkNLP对文本数据进行主题建模和情感分析。我已经完成了数据集的所有预处理步骤,但在LDA中遇到了错误。
程序是:
from pyspark.ml import Pipelinefrom pyspark.ml.feature import StopWordsRemover, CountVectorizer, IDFfrom pyspark.ml.clustering import LDAfrom pyspark.sql.functions import col, lit, concat, regexp_replacefrom pyspark.sql.utils import AnalysisExceptionfrom pyspark.ml.feature import Tokenizer, RegexTokenizerfrom pyspark.sql.functions import col, udffrom pyspark.sql.types import IntegerTypefrom pyspark.ml.clustering import LDAfrom pyspark.ml.feature import StopWordsRemoverfrom pyspark.ml.feature import Normalizerfrom pyspark.ml.linalg import Vectorsdataframe_new = spark.read.format('com.databricks.spark.csv') \.options(header='true', inferschema='true') \.load('/home/[email protected]/Gourav/chap3/abcnews-date-text.csv')get_tokenizers = Tokenizer(inputCol="headline_text", outputCol="get_tokens")get_tokenized = get_tokenizers.transform(dataframe_new)remover = StopWordsRemover(inputCol="get_tokens", outputCol="row")get_remover = remover.transform(get_tokenized)counter_vectorized = CountVectorizer(inputCol="row", outputCol="get_features")getmodel = counter_vectorized.fit(get_remover)get_result = getmodel.transform(get_remover)idf_function = IDF(inputCol="get_features", outputCol="get_idf_feature")train_model = idf_function.fit(get_result)outcome = train_model.transform(get_result)lda = LDA(k=10, maxIter=10)model = lda.fit(outcome)
回答:
根据文档,LDA包括一个featuresCol
参数,默认值为featuresCol='features'
,即保存实际特征的列名;根据您展示的架构,您的DataFrame中没有这样的列,因此出现了预期的错误。
目前尚不清楚您的DataFrame中哪个列包含特征 – get_features
还是 get_idf_feature
(在您展示的样本中它们看起来相同);假设是get_idf_feature
,您应该将LDA调用更改为:
lda = LDA(featuresCol='get_idf_feature', k=10, maxIter=10)
Spark(包括pyspark)ML API与例如scikit-learn及类似框架的逻辑相当不同且独特;其中一个区别确实是特征必须在相应DataFrame的单一列中。有关这个概念的一般演示,请参见我在PySpark中的KMeans聚类的回答(它是关于K-Means的,但逻辑是相同的)。