Эффективная предварительная обработка текста с использованием PySpark (очистка, токенизация, стоп-слова, stemming, фильтр) - PullRequest
0 голосов
/ 02 декабря 2018

Недавно я начал изучать искру по книге «Изучение искры».Теоретически все понятно, на практике я столкнулся с тем, что сначала мне нужно предварительно обработать текст, но реальных советов по этой теме не было.

Первое, что я учел, эточто теперь предпочтительнее использовать Dataframe вместо RDD, поэтому моя попытка предварительной обработки была предпринята для кадров данных.

Обязательные операции:

  1. Очистка текста от пунктуации (regexp_replace)
  2. Токенизация (Tokenizer)
  3. Удаление стоп-слов (StopWordsRemover)
  4. Стеатизация (SnowballStemmer)
  5. Фильтрация коротких слов (udf)

Myкод:

from pyspark.sql import SparkSession
from pyspark.sql.functions import udf, col, lower, regexp_replace
from pyspark.ml.feature import Tokenizer, StopWordsRemover
from nltk.stem.snowball import SnowballStemmer

spark = SparkSession.builder \
    .config("spark.executor.memory", "3g") \
    .config("spark.driver.cores", "4") \
    .getOrCreate()
df = spark.read.json('datasets/entitiesFull/full').select('id', 'text')

# Clean text
df_clean = df.select('id', (lower(regexp_replace('text', "[^a-zA-Z\\s]", "")).alias('text')))

# Tokenize text
tokenizer = Tokenizer(inputCol='text', outputCol='words_token')
df_words_token = tokenizer.transform(df_clean).select('id', 'words_token')

# Remove stop words
remover = StopWordsRemover(inputCol='words_token', outputCol='words_clean')
df_words_no_stopw = remover.transform(df_words_token).select('id', 'words_clean')

# Stem text
stemmer = SnowballStemmer(language='english')
stemmer_udf = udf(lambda tokens: [stemmer.stem(token) for token in tokens], ArrayType(StringType()))
df_stemmed = df_words_no_stopw.withColumn("words_stemmed", stemmer_udf("words_clean")).select('id', 'words_stemmed')

# Filter length word > 3
filter_length_udf = udf(lambda row: [x for x in row if len(x) >= 3], ArrayType(StringType()))
df_final_words = df_stemmed.withColumn('words', filter_length_udf(col('words_stemmed')))

Обработка занимает очень много времени, размер всего документа составляет 60 ГБ.Имеет ли смысл использовать СДР?Поможет ли кеширование?Как я могу оптимизировать предварительную обработку?

Сначала я протестировал реализацию на локальном компьютере, затем попробую на кластере.Локальный компьютер - Ubuntu RAM 6Gb, 4 процессора.Любое альтернативное решение также приветствуется.Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...