Я обрабатываю текстовые данные в фрейме данных pyspark. До сих пор мне удалось токенизировать данные в виде столбца массивов и создать следующую таблицу:
print(df.schema)
StructType(List(StructField(_c0,IntegerType,true),StructField(pageid,IntegerType,true),StructField(title,StringType,true),StructField(text,ArrayType(StringType,true),true)))
df.show(5)
+---+------+-------------------+--------------------+
|_c0|pageid| title| text|
+---+------+-------------------+--------------------+
| 0|137277| Sutton, Vermont|[sutton, is, town...|
| 1|137278| Walden, Vermont|[walden, is, town...|
| 2|137279| Waterford, Vermont|[waterford, is, t...|
| 3|137280|West Burke, Vermont|[west, burke, is,...|
| 4|137281| Wheelock, Vermont|[wheelock, is, to...|
+---+------+-------------------+--------------------+
only showing top 5 rows
Затем я попытался лемматизировать их с помощью функций udf
def get_wordnet_pos(treebank_tag):
"""
return WORDNET POS compliance to WORDENT lemmatization (a,n,r,v)
"""
if treebank_tag.startswith('J'):
return wordnet.ADJ
elif treebank_tag.startswith('V'):
return wordnet.VERB
elif treebank_tag.startswith('N'):
return wordnet.NOUN
elif treebank_tag.startswith('R'):
return wordnet.ADV
else:
# As default pos in lemmatization is Noun
return wordnet.NOUN
def postagger(p):
import nltk
x = list(nltk.pos_tag(p))
return x
sparkPosTagger = udf(lambda z: postagger(z),ArrayType(StringType()))
def lemmer(postags):
import nltk
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
x = [lemmatizer.lemmatize(word, get_wordnet_pos(pos_tag)) for [word,pos_tag] in nltk.pos_tag(postags)]
return x
sparkLemmer = udf(lambda z: lemmer(z), ArrayType(StringType()))
#df = df.select('_c0','pageid','title','text', sparkPosTagger("text").alias('lemm'))
df = df.select('_c0','pageid','title','text', sparkLemmer("lemm").alias('lems'))
, которая возвращает это ошибка:
PicklingError: args[0] from __newobj__ args has the wrong class
Я полагаю, что ошибка в основном происходит из-за несовместимости с объектом, который создает nltk.pos_tag (postags). Обычно, когда предоставляется список токенов, nltk.pos_tag () создает список кортежей.
Хотя я застрял в поиске обходного пути. Как вы можете видеть из кода, я пытался заранее разделить процесс с помощью pos_tagging отдельно, только чтобы получить ту же ошибку.
Есть ли способ заставить эту работу?