Обработка русских текстовых данных в Azure Machine Learning

Буквально только что закончился хакатон компании Microsoft по Azure ML. В процессе решения одной из задач потребовалась обработка русскоязычных текстовых данных, причём желательно внутри системы. В итоге, потратив ощутимое время на поиск решения, хочу им поделиться. Надеюсь, что это поможет кому-то сэкономить время и не биться головой в стенку зря.

Как известно, в Azure ML есть два языка для разработки скриптов внутри системы. Начнём с Python, там задача решается проще всего.

Стандартная функция, которая вызывается для обработки данных:

def azureml_main(dataframe1 = None, dataframe2 = None):
    for index, row in dataframe1.iterrows():
        search = str(row['Search']).decode('utf-8')

Здесь мы берём колонку Search из dataset, который подключен к первому входу блока «Execute Python Script» и преобразовываем её из utf-8. После этого все строковые функции работают с этой строчкой корректно. В случае, если нам нужно вернуть текстовые данные, нужно выполнить обратную операцию:

        out_list.append(str.encode('utf-8'))

    return pandas.DataFrame(out_list)

Чтобы воспользоваться стеммингом, нужно импортировать класс RussianStemmer, создать объект, вызвав конструктор с параметров False, и дальше использовать этот объект. Использовать параметр True для загрузки стандартного набора стоп-слов на данный момент нельзя, выдаётся ошибка.

from nltk.stem.snowball import RussianStemmer

stemmer = RussianStemmer(False)
stemmer.stem(word)

Решение аналогичной проблемы для R выглядит настолько просто, что кажется невероятным время, которое пришлось убить на поиск этого решения.

search<-dataset1$Search
Encoding(search)<-'UTF-8'

Аналогично выбираем колонку Search и задаём кодировку в явной форме. После этого вызова строковые функции начинают работать с текстом корректно, я проверял на библиотеке stringi. Обратное преобразование не требуется, всё отлично работает и так.

Аналогично реализуем стемминг в R. Обращаю внимание, что необходимо задать кодировку UTF-8, иначе стеммер ничего не будет делать.

library(SnowballC)
stems <- wordStem(words, language = "russian")
Поделиться публикацией

Похожие публикации

Комментарии 3

    +2
    Было бы хорошо, если бы вы показали проблему и ее решение на конкретном тестовом примере. Пока выглядит как ответ для stackexchange.
      0
      Да, эту заметку я написал именно в этом формате. Про хакатон я пишу более подробную статью, там будут конкретные примеры.
      0
      К сожалению ни в этой заметке, ни в заметке про хакатон не расскрыта тайна работы с русским языком, так как нет полного примера.

      Попытался по аналоии воспроизвести следующую последовательность: Enter Data Manually -> Execute Python Script -> Feature Hashing

      Сам скрипт:

      # -*- coding: utf-8 -*-
      from nltk.stem.snowball import RussianStemmer
      import pandas as pd
      
      stemmer = RussianStemmer(False)
      
      def azureml_main(dataframe1 = None, dataframe2 = None):
          out_list = []
          for index, row in dataframe1.iterrows():
              stemmed = stemmer.stem(row['text'].decode('utf-8'))
              out_list.append(stemmed.encode('utf-8'))
      
          return pd.DataFrame(out_list)
      


      на выходе из скрипта текст действительно прогнался через stemmer, а вот на выходе feature hashing сплошные нули

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое