如何修复 pyspark 上的 TF.IDF 函数?
How to fix TF.IDF functions on pyspark?
我正在尝试通过 MapReduce(平台是 Databricks)在 pyspark 上开发 TF.IDF 进程。由于我对 pyspark、Databricks 和 MapReduce 的整个过程真的很陌生,所以我遇到了一些我无法解决的语法问题。
这是我尝试使用的代码 运行:
full_text = sc.wholeTextFiles("/FileStore/tables/full_text.txt", 5)
number_of_docs = full_text.count()
import re
def tokenize(s):
return re.split("\W+", s.lower())
#Tokenize the text
tokenized_text = full_text.map(lambda text,title: (title, tokenize(text)))
#Count Words in each document
term_frequency = tokenized_text.flatMapValues(lambda x: x).countByValue()
term_frequency.items()[:20] # Display 20 lines
document_frequency = tokenized_text.flatMapValues(lambda x: x).distinct()\
.map(lambda title,word: (word,title)).countByKey()
document_frequency.items()[:10]
import numpy as np
def tf_idf(number_of_docs, term_frequency, document_frequency):
result = []
for key, value in tf.items():
doc = key[0]
term = key[1]
df = document_frequency[term]
if (df>0):
tf_idf = float(value)*np.log(number_of_docs/df)
result.append({"doc":doc, "score":tf_idf, "term":term})
return result
tf_idf_output = tf_idf(number_of_docs, term_frequency, document_frequency)
tf_idf_output[:10]
问题在线:
term_frequency = tokenized_text.flatMapValues(lambda x: x).countByValue()
document_frequency = tokenized_text.flatMapValues(lambda x: x).distinct()\
.map(lambda title,word: (word,title)).countByKey()
错误:作业因阶段失败而中止:阶段 1.0 中的任务 0 失败 1 次,最近的失败:阶段 1.0 中丢失任务 0.0(TID 1、本地主机、执行程序驱动程序)
非常感谢你的帮助,因为我不知道如何解决这个问题:(
非常感谢
map
采用一元(单个参数)函数。您传递的是二进制(两个参数)函数。
回到 Python 2 天 lambdas
支持元组参数解包
lambda (text, title): (title, tokenize(text))
今天你应该索引
lambda tt: (tt[0], tokenize(tt[1]))
或更好地使用适当的功能:
def tuple_tokenizer(title_and_text):
title, text = title_and_text
return title, tokenize(text)
我正在尝试通过 MapReduce(平台是 Databricks)在 pyspark 上开发 TF.IDF 进程。由于我对 pyspark、Databricks 和 MapReduce 的整个过程真的很陌生,所以我遇到了一些我无法解决的语法问题。
这是我尝试使用的代码 运行:
full_text = sc.wholeTextFiles("/FileStore/tables/full_text.txt", 5)
number_of_docs = full_text.count()
import re
def tokenize(s):
return re.split("\W+", s.lower())
#Tokenize the text
tokenized_text = full_text.map(lambda text,title: (title, tokenize(text)))
#Count Words in each document
term_frequency = tokenized_text.flatMapValues(lambda x: x).countByValue()
term_frequency.items()[:20] # Display 20 lines
document_frequency = tokenized_text.flatMapValues(lambda x: x).distinct()\
.map(lambda title,word: (word,title)).countByKey()
document_frequency.items()[:10]
import numpy as np
def tf_idf(number_of_docs, term_frequency, document_frequency):
result = []
for key, value in tf.items():
doc = key[0]
term = key[1]
df = document_frequency[term]
if (df>0):
tf_idf = float(value)*np.log(number_of_docs/df)
result.append({"doc":doc, "score":tf_idf, "term":term})
return result
tf_idf_output = tf_idf(number_of_docs, term_frequency, document_frequency)
tf_idf_output[:10]
问题在线:
term_frequency = tokenized_text.flatMapValues(lambda x: x).countByValue()
document_frequency = tokenized_text.flatMapValues(lambda x: x).distinct()\
.map(lambda title,word: (word,title)).countByKey()
错误:作业因阶段失败而中止:阶段 1.0 中的任务 0 失败 1 次,最近的失败:阶段 1.0 中丢失任务 0.0(TID 1、本地主机、执行程序驱动程序)
非常感谢你的帮助,因为我不知道如何解决这个问题:(
非常感谢
map
采用一元(单个参数)函数。您传递的是二进制(两个参数)函数。
回到 Python 2 天 lambdas
支持元组参数解包
lambda (text, title): (title, tokenize(text))
今天你应该索引
lambda tt: (tt[0], tokenize(tt[1]))
或更好地使用适当的功能:
def tuple_tokenizer(title_and_text):
title, text = title_and_text
return title, tokenize(text)