Как нам использовать setDictionary для аннотатора лемматизации в Spark-NLP?
У меня есть требование, по которому я должен добавить словарь на этапе лемматизации. При попытке использовать его в конвейере и выполнении pipeline.fit() я получаю исключение arrayIndexOutOfBounds. Как правильно это реализовать? есть примеры?
Я передаю токен как inputcol для лемматизации и лемму как outputcol. Вот мой код:
// DocumentAssembler annotator
val document = new DocumentAssembler()
.setInputCol("text")
.setOutputCol("document")
// SentenceDetector annotator
val sentenceDetector = new SentenceDetector()
.setInputCols("document")
.setOutputCol("sentence")
// tokenizer annotaor
val token = new Tokenizer()
.setInputCols("sentence")
.setOutputCol("token")
import com.johnsnowlabs.nlp.util.io.ExternalResource
// lemmatizer annotator
val lemmatizer = new Lemmatizer()
.setInputCols(Array("token"))
.setOutputCol("lemma")
.setDictionary(ExternalResource("C:/data/notebook/lemmas001.txt","LINE_BY_LINE",Map("keyDelimiter"->",","valueDelimiter"->"|")))
val pipeline = new Pipeline().setStages(Array(document,sentenceDetector,token,lemmatizer))
val result= pipeline.fit(df).transform(df)
Сообщение об ошибке:
Name: java.lang.ArrayIndexOutOfBoundsException
Message: 1
StackTrace: at com.johnsnowlabs.nlp.util.io.ResourceHelper$$anonfun$flattenRevertValuesAsKeys$1$$anonfun$apply$14.apply(ResourceHelper.scala:315)
at com.johnsnowlabs.nlp.util.io.ResourceHelper$$anonfun$flattenRevertValuesAsKeys$1$$anonfun$apply$14.apply(ResourceHelper.scala:312)
at scala.collection.Iterator$class.foreach(Iterator.scala:891)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
at com.johnsnowlabs.nlp.util.io.ResourceHelper$$anonfun$flattenRevertValuesAsKeys$1.apply(ResourceHelper.scala:312)
at com.johnsnowlabs.nlp.util.io.ResourceHelper$$anonfun$flattenRevertValuesAsKeys$1.apply(ResourceHelper.scala:312)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at com.johnsnowlabs.nlp.util.io.ResourceHelper$.flattenRevertValuesAsKeys(ResourceHelper.scala:312)
at com.johnsnowlabs.nlp.annotators.Lemmatizer.train(Lemmatizer.scala:52)
at com.johnsnowlabs.nlp.annotators.Lemmatizer.train(Lemmatizer.scala:19)
at com.johnsnowlabs.nlp.AnnotatorApproach.fit(AnnotatorApproach.scala:45)
at org.apache.spark.ml.Pipeline$$anonfun$fit$2.apply(Pipeline.scala:153)
at org.apache.spark.ml.Pipeline$$anonfun$fit$2.apply(Pipeline.scala:149)
at scala.collection.Iterator$class.foreach(Iterator.scala:891)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
at scala.collection.IterableViewLike$Transformed$class.foreach(IterableViewLike.scala:44)
at scala.collection.SeqViewLike$AbstractTransformed.foreach(SeqViewLike.scala:37)
at org.apache.spark.ml.Pipeline.fit(Pipeline.scala:149)
1 ответ
Мне нравится ваш трубопровод, поэтому все зависит от того, что внутри lemmas001.txt
и можете ли вы получить к нему доступ в Windows.
ПРИМЕЧАНИЕ. Я видел пользователей Windows, использующих это в Apache Spark:
"C:\\Users\\something\\Desktop\\someDirectory\\somefile.txt"
Как тренироваться Lemmatizer
в Spark NLP просто:
val lemmatizer = new Lemmatizer()
.setInputCols(Array("token"))
.setOutputCol("lemma")
.setDictionary("AntBNC_lemmas_ver_001.txt", "->", "\t")
Файл должен иметь следующий формат, где keyDelimiter
в этом случае ->
и valueDelimiter
является \t
:
abnormal -> abnormal abnormals
abode -> abode abodes
abolish -> abolishing abolished abolish abolishes
abolitionist -> abolitionist abolitionists
abominate -> abominate abominated abominates
abomination -> abomination abominations
aboriginal -> aboriginal aboriginals
aborigine -> aborigines aborigine
abort -> aborted abort aborts aborting
abortifacient -> abortifacients abortifacient
abortionist -> abortionist abortionists
abortion -> abortion abortions
abo -> abo abos
abotrite -> abotrites abotrite
abound -> abound abounds abounding abounded
Кроме того, если вы не хотите обучать свой собственный лемматизатор, вы можете использовать предварительно обученные модели следующим образом:
английский
val lemmatizer = new LemmatizerModel.pretrained(name="lemma_antbnc", lang="en")
.setInputCols(Array("token"))
.setOutputCol("lemma")
французкий язык
val lemmatizer = new LemmatizerModel.pretrained(name="lemma", lang="fr")
.setInputCols(Array("token"))
.setOutputCol("lemma")
Итальянский
val lemmatizer = new LemmatizerModel.pretrained(name="lemma", lang="it")
.setInputCols(Array("token"))
.setOutputCol("lemma")
Немецкий
val lemmatizer = new LemmatizerModel.pretrained(name="lemma", lang="de")
.setInputCols(Array("token"))
.setOutputCol("lemma")
Список всех предварительно обученных моделей находится здесь:https://nlp.johnsnowlabs.com/docs/en/models
Список всех предварительно обученных конвейеров находится здесь:https://nlp.johnsnowlabs.com/docs/en/pipelines
Пожалуйста, дайте мне знать в комментарии, если у вас есть еще вопросы.
Полное раскрытие информации: я являюсь одним из разработчиков библиотеки Spark NLP.
Обновление: я нашел этот пример для вас в Scala на Databricks на случай, если вам интересно (на самом деле именно так они обучили итальянскую модель лемматизатора)