Почему преобразование RegexTokenizer в PySpark дает мне противоположность требуемому шаблону? - PullRequest
0 голосов
/ 06 мая 2020

Когда я использую RegexTokenizer from pyspark.ml.feature для токенизации столбца предложений в моем фрейме данных, чтобы найти все символы слов, я получаю противоположное тому, что я получил бы, когда пакет python re используется для того же предложения. Вот пример кода:

from pyspark.sql import SparkSession
from pyspark.ml.feature import RegexTokenizer
spark = SparkSession.builder \
        .master("local") \
        .appName("Word list") \
        .getOrCreate()

df = spark.createDataFrame(data = [["Hi there, I have a question about RegexTokenizer, Could you 
                           please help me..."]], schema = ["Sentence"])

regexTokenizer = RegexTokenizer(inputCol="Sentence", outputCol="letters", pattern="\\w")
df = regexTokenizer.transform(df)
df.first()['letters']

Это дает следующий результат:

[' ', ', ', ' ', ' ', ' ', ' ', ' ', ', ', ' ', ' ', ' ', ' ', '...']

С другой стороны, если я использую модуль re в том же предложении и используйте тот же шаблон для сопоставления букв, используя этот код здесь:

import re
sentence = "Hi there, I have a question about RegexTokenizer, could you 
                           please help me..."
letters_list = re.findall("\\w", sentence)
print(letters_list)

Я получаю желаемый результат в соответствии с шаблоном регулярного выражения как:

['H', 'i', 't', 'h', 'e', 'r', 'e', 'I', 'h', 'a', 'v', 'e', 'a', 
'q', 'u', 'e', 's', 't', 'i', 'o', 'n', 'a', 'b', 'o', 'u', 't', 
'R', 'e', 'g', 'e', 'x', 'T', 'o', 'k', 'e', 'n', 'i', 'z', 'e', 
'r', 'c', 'o', 'u', 'l', 'd', 'y', 'o', 'u', 'p', 'l', 'e', 'a', 
's', 'e', 'h', 'e', 'l', 'p', 'm', 'e']

Я также обнаружил, что Мне нужно использовать \ W вместо \ w в pySpark, чтобы решить эту проблему. Почему такая разница? Или я неправильно понял использование аргумента pattern в RegexTokenizer ?

1 Ответ

0 голосов
/ 06 мая 2020

Из того, что говорится в документации по RegexTokenizer , при создании он имеет параметр с именем gaps. В одном режиме регулярное выражение соответствует пробелам (true и является значением по умолчанию), в другом - токенам (не пробелам, false).

Попробуйте установить его вручную на нужное вам значение: в ваше дело, gaps = false.

...