Как использовать модуль исправления орфографии JohnSnowLabs NLP NorvigSweetingModel? - PullRequest
0 голосов
/ 21 ноября 2018

Я проходил через SpellChecker JohnSnowLabs здесь .

Я нашел там реализацию алгоритма Norvig, а в разделе примера только две следующие строки:

import com.johnsnowlabs.nlp.annotator.NorvigSweetingModel
NorvigSweetingModel.pretrained()

Как я могу применить эту предварительно обученную модель к моему фрейму данных (df) ниже для исправления заклинания в столбце "names"?

+----------------+---+------------+
|           names|age|       color|
+----------------+---+------------+
|      [abc, cde]| 19|    red, abc|
|[eefg, efa, efb]|192|efg, efz efz|
+----------------+---+------------+

Я пытался сделать это следующим образом:

val schk = NorvigSweetingModel.pretrained().setInputCols("names").setOutputCol("Corrected")

val cdf = schk.transform(df)

Но приведенный выше код дал мне следующую ошибку:

java.lang.IllegalArgumentException: requirement failed: Wrong or missing inputCols annotators in SPELL_a1f11bacb851. Received inputCols: names. Make sure such columns have following annotator types: token
  at scala.Predef$.require(Predef.scala:224)
  at com.johnsnowlabs.nlp.AnnotatorModel.transform(AnnotatorModel.scala:51)
  ... 49 elided

1 Ответ

0 голосов
/ 21 ноября 2018

spark-nlp предназначены для использования в своих конкретных конвейерах, а входные столбцы для разных преобразователей должны включать специальные метаданные.

Исключение уже говорит вам, что входные данные для NorvigSweetingModel должны быть токенизированы:

Убедитесь, что такие столбцы имеют следующие типы аннотаторов: токен

Если я не ошибаюсь, вы как минимум соберете документы и токенизируете здесь.

import com.johnsnowlabs.nlp.DocumentAssembler
import com.johnsnowlabs.nlp.annotator.NorvigSweetingModel
import com.johnsnowlabs.nlp.annotators.Tokenizer
import org.apache.spark.ml.Pipeline

val df = Seq(Seq("abc", "cde"), Seq("eefg", "efa", "efb")).toDF("names")

val nlpPipeline = new Pipeline().setStages(Array(
  new DocumentAssembler().setInputCol("names").setOutputCol("document"),
  new Tokenizer().setInputCols("document").setOutputCol("tokens"),
  NorvigSweetingModel.pretrained().setInputCols("tokens").setOutputCol("corrected")
))

A Pipeline может применяться к вашим данным с небольшой корректировкой - входные данные должны быть string, а не array<string>*:

val result = df
  .transform(_.withColumn("names", concat_ws(" ", $"names")))
  .transform(df => nlpPipeline.fit(df).transform(df))
result.show()
+------------+--------------------+--------------------+--------------------+
|       names|            document|              tokens|           corrected|
+------------+--------------------+--------------------+--------------------+
|     abc cde|[[document, 0, 6,...|[[token, 0, 2, ab...|[[token, 0, 2, ab...|
|eefg efa efb|[[document, 0, 11...|[[token, 0, 3, ee...|[[token, 0, 3, ee...|
+------------+--------------------+--------------------+--------------------+

Если вы хотите экспортировать вывод, вы должны расширить Pipeline на Finisher.

import com.johnsnowlabs.nlp.Finisher

new Finisher().setInputCols("corrected").transform(result).show
 +------------+------------------+
 |       names|finished_corrected|
 +------------+------------------+
 |     abc cde|        [abc, cde]|
 |eefg efa efb|  [eefg, efa, efb]|
 +------------+------------------+

* В соответствии с документами DocumentAssembler

может читать либо строковый столбец, либо массив [String]

, но на практике это не похоже на работу в 1.7.3:

df.transform(df => nlpPipeline.fit(df).transform(df)).show()
org.apache.spark.sql.AnalysisException: cannot resolve 'UDF(names)' due to data type mismatch: argument 1 requires string type, however, '`names`' is of array<string> type.;;
'Project [names#62, UDF(names#62) AS document#343]
+- AnalysisBarrier
      +- Project [value#60 AS names#62]
         +- LocalRelation [value#60]
...