Я пытаюсь правильно настроить 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.Любая помощь будет оценена.
Спасибо.