Лямбда-функция, вызывающая TypeError: объект 'int' не повторяется - PullRequest
0 голосов
/ 17 мая 2018

Я только начал изучать Python. Я использую API для построения модели IDF, однако я сталкиваюсь с некоторыми ошибками с лямбда-функциями, которые я не могу устранить. Это класс, который генерирует IDF:

class Idfs(DocumentFrequencies, Model):

    def build(self, corpus):
        log.info('Counting documents in corpus...')
        N = float(corpus.count())
        dfs = super(Idfs, self).build(corpus)

        log.info('Building idf model: N=%i', N)
        return dfs\
           .map(lambda (term, (df,rank)): (term, df))\  
           .mapValues(lambda df: math.log(N/df))

    @staticmethod
    def format_item((term, idf)):
        return {
        '_id': term,
        'idf': idf,
        }

И это класс, который считает DF:

class DocumentFrequencies(ModelBuilder):

    def __init__(self, lowercase=False, max_ngram=1, min_df=2):
        self.lowercase = lowercase
        self.max_ngram = max_ngram
        self.min_df = min_df

    def build(self, docs):
        m = docs.map(lambda d: d['text'])
        if self.lowercase:
            m = m.map(lambda text: text.lower())

        return m\
            .flatMap(lambda text: set(ngrams(text, self.max_ngram)))\
            .map(lambda t: (t, 1))\
            .reduceByKey(add)\
            .filter(lambda (k,v): v > self.min_df)

Ошибка появляется в этой строке .map(lambda (term, (df, rank)): (term, df))\, и это сообщение об ошибке:

TypeError: 'int' object is not iterable

Это то, что я получаю, когда звоню DocumentFrequencies.collect():

Out[5]:                                                                         
[(u'fawn', 3),
 (u'1,800', 31),
 (u'clotted', 3),
 (u'comically', 11),
 (u'Adjusting', 3),
 (u'O(log', 6),
 (u'unnecessarily', 15),
 (u'evangelical', 53),
 (u'naturopathic', 3),
 (u'grenadiers', 4),
 (u'stipulate', 4),
 (u'Vikrant', 3),
 (u'fractal', 18),

Я не знаю, какой именно аргумент вызывает ошибку. Я использую Python 2.7, 8 ГБ 1600 МГц DDR с 2 ядрами. Это конфиги pyspark:

conf = pyspark.SparkConf().setAll([('spark.executor.memory', '8g'),('spark.driver.memory','8g'),('spark.network.timeout','100000000s'),('spark.executor.heartbeatInterval','10000000s'),('spark.driver.maxResultSize','8g'),('spark.driver.cores','2')])

Заранее спасибо,

1 Ответ

0 голосов
/ 17 мая 2018

На основании DocumentFrequencies.collect() выходных данных,

map(lambda (term, (df,rank)): (term, df))

Не должно существовать.По сути, он пытается преобразовать данный кортеж (u'fawn', 3) в две части.u'fawn' отображается на term, а 3 отображается на (df,rank).Поскольку целое число 3 не может быть преобразовано в кортеж (который является итеративным), сообщение об ошибке

TypeError: 'int' object is not iterable

Удаление этой строки ничего не изменит в dfs.

...