今天有处理文本特征数据,刚开始因为不太熟悉pyspark环境下处理文本数据的流程,导致踩了不少的坑。在这里记录一下,以供以后参考。
先写下整个处理的流程:
(1)从数据库中提取数据
(2)将提取的数据转换成DataFrame格式
(3)使用tokenizer分词
(4)将文本向量转换成稀疏表示的数值向量(字符频率向量)
(5)将tokenizer得到的分词结果转换数字向量
实现代码如下所示:
%pyspark
from pyspark.mllib.feature import Word2Vec
from pyspark.ml.feature import Word2Vec
from pyspark.ml.feature import CountVectorizer, CountVectorizerModel, Tokenizer, RegexTokenizer, StopWordsRemover
#1.从数据库中提取数据
org_df = spark.sql("""
select label,username
from XXX #XXX代表数据表名,label和username分别代表标签列和数据列
""")
#2.将提取的数据转换成DataFrame格式
res_rdd = org_df.rdd.map(list).map(lambda x:[x[0],' '.join([i for i in x[1]])]).map(tuple)
#print(res_rdd.take(100))
res_df = spark.createDataFrame(res_rdd,['label','username'])
#3.使用tokenizer分词
tokenizer = Tokenizer(inputCol="username", outputCol="words")
t_words = tokenizer.transform(res_df)
#4.将文本向量转换成稀疏表示的数值向量(字符频率向量)
cv = CountVectorizer(inputCol="words", outputCol="features", vocabSize=5, minDF=2.0)
cv_model = cv.fit(t_words)
cv_result = cv_model.transform(t_words)
#5.将tokenizer得到的分词结果转换数字向量
word2Vec = Word2Vec(vectorSize=100, minCount=0, inputCol="words", outputCol="result")
w2v_model = word2Vec.fit(cv_result)
result = w2v_model.transform(cv_result)
#for feature in result.select("result").take(3):
#print(feature)
#6.输出最终结果
result.show(100)