Как исправить функции TF.IDF на pyspark? - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь разработать процесс TF.IDF для pyspark с помощью MapReduce (платформа - Databricks).Поскольку я действительно новичок в 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()

Ошибка: задание прервано из-за сбоя этапа: задание 0 на этапе 1.0 не выполнено 1 раз, последний сбой: потерянное задание 0.0на этапе 1.0 (TID 1, localhost, драйвер исполнителя)

Я очень ценю вашу помощь здесь, так как не знаю, как решить эту проблему: (

Заранее большое спасибо

1 Ответ

0 голосов
/ 26 июня 2019

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)
...