Слишком много значений для распаковки в лямбда-функции - PullRequest
0 голосов
/ 17 мая 2018

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

class tfidf(ModelBuilder, Model):

    def __init__(self, max_ngram=1, normalize = True):
        self.max_ngram = max_ngram
        self.normalize = normalize

    def build(self, mentions, idfs):
        m = mentions\
            .map(lambda (target, (span, text)): (target, text))\  """error is triggered here  """
            .mapValues(lambda v: ngrams(v, self.max_ngram))\
            .flatMap(lambda (target, tokens): (((target, t), 1) for t in tokens))\
            .reduceByKey(add)\
            .map(lambda ((target, token), count): (token, (target, count)))\
            .leftOuterJoin(idfs)\

А вот пример вывода класса mentions (который является причиной ошибки в классе tdfidf):

Out[24]:                                                                        
[{'_id': u'en.wikipedia.org/wiki/William_Cowper',
  'source': 'en.wikipedia.org/wiki/Beagle',
  'span': (165, 179),
  'text': u'References to the dog appear before the 19th century in works by such writers as William Shakespeare, John Webster, John Dryden, Thomas Tickell, Henry Fielding, and William Cowper, as well as in Alexander Pope\'s translation of Homer\'s "Iliad".'},
 {'_id': u"en.wikipedia.org/wiki/K-Run's_Park_Me_In_First",
  'source': 'en.wikipedia.org/wiki/Beagle',
  'span': (32, 62),
  'text': u" On 12 February 2008, a Beagle, K-Run's Park Me In First (Uno), won the Best In Show category at the Westminster Kennel Club show for the first time in the competition's history."},

Сообщение об ошибке:

 .map(lambda (target, (span, text)): (target, text))\
ValueError: too many values to unpack

Я пытался: .map(lambda ( src, target, span, text) : (target, text))\, так как мне нужны только цель и текст, который вызывает ту же ошибку в mentions\.

Простой и скомпилированный пример:

import math
import numpy


Data = [{'_id': '333981',

  'source': 'Apple',

  'span': (100, 119),

  'text': ' It is native to the northern Pacific.'}, {'_id': '27262',

  'source': 'Apple',

  'span': (4, 20),

  'text': ' Apples are yummy.'}]



m = map(lambda (ID, (span, text)) : (ID, text) , Data)

print(list(m))

Я использую Python 2.7. Любая помощь или руководство будет высоко ценится.

Большое спасибо,

1 Ответ

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

Если вы хотите создать новый массив словарей, содержащий только поля source и text, вы можете использовать

m = map(lambda item: {field: item.get(field) for field in ['source', 'text']}, Data)

Если вы хотите создать массив кортежей содержимого для ключей source и text:

m = map(lambda item: (item.get('source'), item.get('text')), Data)
...