0

我正在使用 sparkNLP 3.2.3 版并尝试标记一些文本。我使用 spacy 和其他分词器来处理诸如“他们是”之类的缩略词,方法是将其拆分为“他们”和“'re”。根据此资源页面 105-107 sparkNLP 也应该以这种方式标记:https ://books.google.com/books?id=5DDtDwAAQBAJ&pg=PA106&lpg=PA106&dq=spark+nlp+tokenizer+contractions&source=bl&ots=5bao0SzjQ7&sig=ACfU3U1pklNa8NNELk_tX48tMKHuFGViA&hl= en&sa=X&ved=2ahUKEwij6abZ29bzAhU0CjQIHaIkAE4Q6AF6BAgUEAM#v=onepage&q=spark%20nlp%20tokenizer%20contractions&f=false

然而,当我通过 sparkNLP 标记化实际运行一些收缩时,它并没有将它们分开。任何想法可能会发生什么?我想出于其他原因使用这个包,所以不想在 spacy 或 NLTK 和这个之间交换。

import sparknlp
from sparknlp.base import *
from sparknlp.annotator import *
from pyspark.ml import Pipeline

data = spark.createDataFrame([["They're fine."]]).toDF("text")
documentAssembler = DocumentAssembler().setInputCol("text").setOutputCol("document")
tokenizer = Tokenizer().setInputCols(["document"]).setOutputCol("token").fit(data)

pipeline = Pipeline().setStages([documentAssembler, tokenizer]).fit(data)
result = pipeline.transform(data)

result.selectExpr("token.result").show(truncate=False)
+------------------+
|result            |
+------------------+
|[They're, fine, .]|
+------------------+
4

1 回答 1

0

这本书根本不是最新的默认行为(我也希望文档本身更全面)。看看这里annotators.Tokenizer的界面和默认值。

据我了解,您以所需方式处理收缩的方式是修改后缀模式。

suffixPattern默认为([^\s\w]?)([^\s\w]*)\z(根据 3.2.3 版的文档字符串)。通过将其更改为('re)\z(您需要根据您的需要调整模式),您可以实现以下目标:

toker = Pipeline(stages=[
    DocumentAssembler()\
        .setInputCol("text")\
        .setOutputCol("document"),
    Tokenizer()\
        .setInputCols(["document"])\
        .setOutputCol("tokens")\
        .setSuffixPattern(r"('re)\z")
])
toker_m = toker.fit(sql.createDataFrame(pd.DataFrame([{"text": ""}])))
toker_lm = LightPipeline(toker_m)
toker_lm.fullAnnotate("They're fine.")

这使:

[{'document': [Annotation(document, 0, 12, They're fine., {})],
  'tokens': [Annotation(token, 0, 3, They, {'sentence': '0'}),
   Annotation(token, 4, 6, 're, {'sentence': '0'}),
   Annotation(token, 8, 12, fine., {'sentence': '0'})]}]
于 2021-10-22T13:19:09.280 回答