MLlib regexTokenizer игнорирует акценты - PullRequest
0 голосов
/ 07 января 2020

Я тестирую MLlib Tokenizer с pySpark (Python3) следующим образом:

# -*- coding: utf-8 -*-

from pyspark.sql.window import Window
from pyspark.sql.functions import row_number
from pyspark.ml.feature import Tokenizer, RegexTokenizer

# Creating dataframe
sentenceData = spark.createDataFrame([
(["Eu acho que MLlib é incrível!"]),
(["Muito mais legal do que scikit-learn"])
], ["raw"])

# Putting sequential indexer on DataFrame
w = Window.orderBy('raw')
sentenceData = sentenceData.withColumn("id", row_number().over(w))

# Configuring regexTokenizer
regexTokenizer = RegexTokenizer(inputCol="raw", outputCol="words", pattern="\\W")

# Applying Tokenizer to dataset
sentenceData = regexTokenizer.transform(sentenceData)

sentenceData.select(
   'id','raw','words'
).show(truncate=False)

Результат таков:

+---+------------------------------------+--------------------------------------------+
|id |raw                                 |words                                       |
+---+------------------------------------+--------------------------------------------+
|1  |Eu acho que MLlib é incrível!       |[eu, acho, que, mllib, incr, vel]           |
|2  |Muito mais legal do que scikit-learn|[muito, mais, legal, do, que, scikit, learn]|
+---+------------------------------------+--------------------------------------------+

Как видите, слово ' incrível (португальское слово означает «удивительный») был преобразован в два «новых слова» из-за символа «í». Я не нашел ничего в документации, чтобы решить это. Итак, я здесь потерян!

Я попытался изменить конфигурацию 'pattern' в 'regexTokenizer', включая непосредственно 'í' и другие шаблоны, включая символ '\ w' в шаблоне "class" (что-то вроде pattern = "[\ Wí \ w] +"), но не сработало! Есть какой-то способ установить 'португальский' или заставить Spark каким-то образом в шаблоне не игнорировать акценты?

Спасибо!

1 Ответ

0 голосов
/ 14 марта 2020

Попробуйте

pattern="[\\p{L}\\w]+"

Это работает для меня, используя Scala код следующим образом:

val tokenizer = new RegexTokenizer().setGaps(false)
                .setPattern("[\\p{L}\\w]+")
                .setInputCol("raw")
                .setOutputCol("words")
...