UnboundLocalError при вызове метода nragms в библиотеке шаблонов Python - PullRequest
0 голосов
/ 20 мая 2018

Я новичок в Python и Pyspark.Я работаю с кодом, который работает на pyspark, который строит модель tfidfs.Однако при вызове метода ngrams известной библиотеки шаблонов возникает UnboundLocalError.

Это макет данных text, который (id ,list[text]) извлекается с помощью text.map(lambda x: (x["_id"], (x["span"], x["text"]))).groupByKey().map(lambda x: (x[0], list(x[1])):

[(u'en.wikipedia.org/wiki/Woodville_South,_South_Australia',
  [u'Campbell was born in Myrtle Bank.']),
 (u'en.wikipedia.org/wiki/Picket_(military)',
  [u'The film dealt with the story .',
   u"Members of the Union force."]),
 (u'en.wikipedia.org/wiki/320th_Troop_Carrier_Squadron',
  [u" The 1st Air Transport."])]

Этокак отформатированы idfs:

Out[23]:                                                                        
[{'_id': u'1,800', 'idf': 7.245417283738939},
 {'_id': u'Poetry', 'idf': 5.399590593240608},
 {'_id': u'Bloodworth', 'idf': 7.938564464298884},
 {'_id': u'Mullally', 'idf': 7.938564464298884}]

Вот часть кода, с которым я работаю:

corpus = text\
            .mapValues(lambda v: ngrams(v, self.max_ngram))\  """the ngrams method call """
            .flatMap(lambda (target, tokens): (((target, t), 1) for t in tokens))\
            .reduceByKey(add)\
            .map(lambda ((target, token), count): (token, (target, count)))\

Это метод библиотеки Pattern в text.py:

def ngrams(string, n=3, punctuation=PUNCTUATION, continuous=False):
    """ Returns a list of n-grams (tuples of n successive words) from the given string.
        Alternatively, you can supply a Text or Sentence object.
        With continuous=False, n-grams will not run over sentence markers (i.e., .!?).
        Punctuation marks are stripped from words.
    """
    def strip_punctuation(s, punctuation=set(punctuation)):
        return [w for w in s if (isinstance(w, Word) and w.string or w) not in punctuation]
    if n <= 0:
        return []
    if isinstance(string, basestring):
        s = [strip_punctuation(s.split(" ")) for s in tokenize(string)]
    if isinstance(string, Sentence):
        s = [strip_punctuation(string)]
    if isinstance(string, Text):
        s = [strip_punctuation(s) for s in string]
    if continuous:
        s = [sum(s, [])]
    g = []
    for s in s:         """ ERROR triggered here """
        #s = [None] + s + [None]
        g.extend([tuple(s[i:i+n]) for i in range(len(s)-n+1)])
    return g

Это след сообщения об ошибке:

python2.7/site-packages/sift/util.py", line 8, in ngrams
    for n in en.ngrams(text, n=i+1, **pattern_args):
python2.7/site-packages/pattern/text/__init__.py", line 83, in ngrams
    for s in s:
UnboundLocalError: local variable 's' referenced before assignment

Я знаю, что означает ошибка. Я попытался отредактировать метод библиотеки, однако ошибка остается, поэтому, возможно, я ее не совсем исправил илигде-нибудь еще.Как я могу устранить эту ошибку?

Я использую Python 2.7 и pyspark 2.3.0.

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

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

Ответы [ 2 ]

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

В if continuous: вы ссылаетесь на s.Но если никакие предыдущие условия не были проверены, s не существует.

Простым решением было бы присвоить начальное значение s перед ifs, например [].

* 1009.* Кроме того, вы можете переименовать эту переменную, чтобы избежать конфликтов с переменными цикла.
0 голосов
/ 20 мая 2018

Если я правильно помню ваш последний вопрос, «v» является результатом groupByKey.Таким образом, самый простой способ сделать эту работу, вероятно, состоит в том, чтобы превратить «v» в строку:

from pattern.en import ngrams

rdd = sc.parallelize([{'_id': u'en.wikipedia.org/wiki/Cerambycidae',
  'source': 'en.wikipedia.org/wiki/Plinthocoelium_virens',
  'span': (61, 73),
  'text': u'"Plinthocoelium virens" is a species of beetle in the family Cerambycidae.'},
 {'_id': u'en.wikipedia.org/wiki/Dru_Drury',
  'source': 'en.wikipedia.org/wiki/Plinthocoelium_virens',
  'span': (20, 29),
  'text': u'It was described by Dru Drury in 1770.'},
 {'_id': u'en.wikipedia.org/wiki/Dru_Drury',
  'source': 'en.wikipedia.org/wiki/Plinthocoelium_virens2',
  'span': (20, 29, 2),
  'text': u'It was described by Dru Drury in 1770.2'}])

print rdd.map(lambda x: (x["_id"], x["text"])).groupByKey()\
.map(lambda x: (x[0], list(x[1])))\
.mapValues(lambda v: ngrams(" ".join(v), 5))\
.collect()

[(u'en.wikipedia.org / wiki / Dru_Drury ', [(u'Это', ты был, ты описал, ты, ты,), ты был, ты описал, ты, ты, Друри), (u'byred, u'by ', u'Dru', u'Drury ', u'in'), (u'by ', u'Dru', u'Drury ', u'in',u'1770 '), (u'It', u'was ', u'described', u'by ', u'Dru'), (u'was ', u'described', u'by ', u'Dru', u'Drury '), (u'описано', u'by ', u'Dru', u'Drury ', u'in'), (u'by ', u'Dru', u 'Drury ', u'in', u'1770.2 ')]), (u'en.wikipedia.org / wiki / Cerambycidae', [(u'Plinthocoelium ', u'virens', u'is ', u'a', ты' вид '), (ты' virens ', ты', ты ', ты' вид ', ты'), (ты ', ты', ты 'вид', u'of ', u'beetle'), (u'a ', u'species', u'of ', u'beetle', u'in '), (u'species', u'of ',ты, жук, ты, ты), (ты, жук, ты, семья, ты, семья), (жук, ты'in', u'he ', u'family', u'Cerambycidae ')])]

...