[Из песочницы] Обработка русских текстовых данных в 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")