我经历了JohnSnowLabs SpellChecker 。
我在那里找到了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
spark-nlp 设计用于其自己的特定管道,并且不同变换器的输入列必须包含特殊元数据。
该异常已经告诉您NorvigSweetingModel应该对该输入进行标记化:
确保此类列具有以下注释器类型:token
如果我没有弄错的话,至少你会收集文件并在这里进行标记。
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")
))
Pipeline像这样,可以在小的调整下应用到你的数据-输入数据必须是string不是array*:
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列或Array [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 type.;;
'Project [names#62, UDF(names#62) AS document#343]
+- AnalysisBarrier
+- Project [value#60 AS names#62]
+- LocalRelation [value#60]
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。