Получение Spacy для правильной работы с Pyspark, но получение ошибки Typeerror в UDF - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь правильно настроить Spacy для работы с моим кодом Pyspark.Я просто пытаюсь использовать функциональные возможности Spacy, такие как извлечение POS для различных текстов, лемма и т. Д., Проблема в том, что он не работает.

Я работаю в Windows 10 с Python 3.7.0 иPyspark V2.4.3.Техника, которой я следовал, состояла в том, чтобы использовать пользовательскую функцию (UDF), подобную этой ссылке переполнения стека пользователем chris.Идея состоит в том, чтобы пройтись по тексту, разделить его на куски и передать каждый кусок в функцию UDF для запуска Spacy.

def spacy_preprocessing_udf(text, lowercase, remove_stop):
    print("inside spacy_preprocessing")
    def preprocess(text):
        lowercase = True
        remove_stop = True
        arry = ["testing"]
        #print("inside preprocess")
        #print(text)
        global nlp

        try:
            #print("inside try")
            stops = spacy.lang.en.stop_words.STOP_WORDS
            if lowercase:
                text = text.lower()
            text = nlp(text)
            #print("after doc")
            #print("before loop try")
            teststt = ""
            listofword_pos = list()
            for word in text:
                lemma = word.lemma_.strip()
                if lemma:
                    if not remove_stop or (remove_stop and lemma not in stops):
                        lemnlp = nlp(lemma)
                        lemmaPOS = "dum"
                        for leword in lemnlp:
                            lemmaPOS = leword.pos_.strip()
                        # tuplpair = (lemma, lemmaPOS)
                        testst = lemma + " : " + lemmaPOS
                        print(testst)
                        teststt = testst
                        listofword_pos.append(testst)
            return listofword_pos
        except:
            #print("inside except")
            nlp = spacy.load("en")
            stops = spacy.lang.en.stop_words.STOP_WORDS
            if lowercase:
                text = text.lower()
            text = nlp(text)

            listofword_pos = list()
            teststt = ""
            #print("before loop")
            for word in text:
                lemma = word.lemma_.strip()
                if lemma:
                    if not remove_stop or (remove_stop and lemma not in stops):
                        lemnlp = nlp(lemma)
                        lemmaPOS = "dum"
                        for leword in lemnlp:
                          lemmaPOS = leword.pos_.strip()
                        #tuplpair = (lemma, lemmaPOS)
                        testst = lemma + " : " + lemmaPOS
                        print(testst)
                        teststt = testst
                        listofword_pos.append(testst)
                        print(len(listofword_pos))
            return listofword_pos
    res_udf = F.udf(preprocess(text), ArrayType(StringType()))

    return res_udf
loop:
                spacy_result = spacy_preprocessing_udf(text_list[index], True, True)

                spacylist = spacylist.append(spacy_result)

Дело в том, что код успешно попадает внутрьSpacy метод и даже инициирует Spacy и вызывает все эти различные методы Spacy (POS, лемма и т. Д.).при отладке я вижу такие примеры, как "run: verb" , что правильно.Проблема в том, что он не возвращает должным образом окончательный список.Я получаю следующую ошибку

TYpeError: Недопустимая функция: не является функцией или вызываемой ( вызов не определен): класс 'список'

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

Спасибо.

...