我正在使用sparkNLP版本3.2.3,并尝试对一些文本进行标记化。我使用了spacy和其他分词器,它们通过将缩写分为"they“和"'re”来处理缩写,比如"they'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=ACfU3U1pklNa8NNElLk_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, .]|
+------------------+发布于 2021-10-22 13:19:09
这本书根本不是最新的默认行为(我也希望文档本身更全面)。看看annotators.Tokenizer界面和默认的here。
根据我的理解,您可以通过修改后缀模式来以您想要的方式处理收缩。
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'})]}]https://stackoverflow.com/questions/69634998
复制相似问题