требование не выполнено: аннотаторы inputCols неверны или отсутствуют в johnsnowlabs.nlp

Я использую com.johnsnowlabs.nlp-2.2.2с spark-2.4.4 для обработки некоторых статей. В этих статьях, есть некоторые очень длинные слова меня не интересует и что замедляет POS мечения на много. Я бы хотел исключить их после токенизации и до POSTagging.

Я попытался написать меньший код, чтобы воспроизвести мои проблемы

import sc.implicits._
val documenter = new DocumentAssembler().setInputCol("text").setOutputCol("document").setIdCol("id")
val tokenizer = new Tokenizer().setInputCols(Array("document")).setOutputCol("token")
val normalizer = new Normalizer().setInputCols("token").setOutputCol("normalized").setLowercase(true)

val df = Seq("This is a very useless/ugly sentence").toDF("text")

val document = documenter.transform(df.withColumn("id", monotonically_increasing_id()))
val token = tokenizer.fit(document).transform(document)

val token_filtered = token
  .drop("token")
  .join(token
    .select(col("id"), col("token"))
    .withColumn("tmp", explode(col("token")))
    .groupBy("id")
    .agg(collect_list(col("tmp")).as("token")),
    Seq("id"))
token_filtered.select($"token").show(false)
val normal = normalizer.fit(token_filtered).transform(token_filtered)

У меня эта ошибка при трансформации token_filtered

+--------------------+---+--------------------+--------------------+--------------------+
|                text| id|            document|            sentence|               token|
+--------------------+---+--------------------+--------------------+--------------------+
|This is a very us...|  0|[[document, 0, 35...|[[document, 0, 35...|[[token, 0, 3, Th...|
+--------------------+---+--------------------+--------------------+--------------------+


Exception in thread "main" java.lang.IllegalArgumentException:
requirement failed: Wrong or missing inputCols annotators in NORMALIZER_4bde2f08742a.
Received inputCols: token.
Make sure such annotators exist in your pipeline, with the right output
names and that they have following annotator types: token

Он отлично работает, если я прямо подхожу и трансформирую token в normalizerКажется, что во время explode/groupBy/collect_list, некоторая информация теряется, но схема и данные выглядят одинаково.

Есть идеи?

2 ответа

Чтобы обновить ответ, данный @ticapix, который является правильным, однако в новой версии добавлены две функции: SentenceDetector а также Tokenizer которые minLenght а также maxLength:

Вы можете просто отфильтровать токены, которые не хотите передавать через конвейер:

val tokenizer = new Tokenizer()
      .setInputCols("document")
      .setOutputCol("token")
      .setMinLength(4)
      .setMaxLength(10)

Ссылки:

Ответ: невыполнимо. (https://github.com/JohnSnowLabs/spark-nlp/issues/653)

Аннотаторы уничтожаются во время groupBy операция.

Возможны следующие решения:

  • реализовать индивидуальный Transformer
  • использовать UDF
  • предварительно обработать данные перед подачей их в конвейер
Другие вопросы по тегам