Новое решение для очистки очень грязного неструктурированного текста

После целых двух недель проб и ошибок, когда мы почти думали, что это невозможно ...

Я сделал это.

Мне удалось повернуть это:

«Эту проблему было трудно решить»

В это:

«Это была трудная проблема для решения»

Я думал, что все это видел после работы с Singlish или даже Tweets.

Но никогда бы не подумал, что натолкнусь на такие грязные неструктурированные текстовые данные.

Я явно преувеличил приведенный выше пример, но проблема сводится к следующим двум ключевым моментам:

  • Обнаружение и устранение орфографических ошибок
  • Обработка случайных пробелов между словами

Как люди, мы можем легко расшифровать приведенное выше утверждение как:

«Это была трудная проблема для решения»

Однако разработка методологии решения такой проблемы с данными оказалась более сложной задачей, чем предполагалось.

В этом посте я рассмотрю новое решение, которое я использовал для очистки чрезвычайно грязного неструктурированного текстового набора данных.

Вот как выглядели данные:

Примечание. Это просто пример того, как выглядят грязные данные, а не фактические данные.

Сегодня будет не так много фрагментов кода, но к концу поста вы получите представление о методологии решения такой проблемы с данными, если вы когда-нибудь с ней столкнетесь.

Проблема качества данных 1. Обнаружение и устранение орфографических ошибок

В одном из моих предыдущих постов об обработке орфографических ошибок я использовал векторы слов и сделал много переводов, чтобы сформировать обобщенный вектор перевода для обработки орфографических ошибок.



В этом посте я вернусь к алгоритмическому подходу к обработке орфографических ошибок.

Этот сегмент состоит из двух частей:

  1. Обнаруживать слова с ошибками
  2. Исправьте слова с ошибками

Для этого я использовал готовую команду SAS Viya’s для исправления ошибок написания под названием tpSpell.

Примечание. SAS работает с так называемыми наборами действий, которые являются синонимами пакетов Python. В каждом наборе действий можно выполнить множество действий.

Часть 1. Обнаружение слов с орфографическими ошибками

На этом этапе действие tpSpell выполняет так называемое извлечение кандидатов.

Функция Candidate Extraction объединяет слова в две категории:

  • Правильно написанные слова-кандидаты
  • Кандидаты в слова с ошибками

Правильно написанное слово-кандидат определяется заранее заданным параметром («минимальное количество родителей») перед запуском процедуры.

Этот параметр указывает минимальное количество документов, в которых должен появиться термин, чтобы его можно было считать кандидатом в правильно написанное слово.

Все правильно написанные слова-кандидаты имеют форму <term>-<role>-<parent>.

Например, см. Рисунок 1 ниже:

Обратите внимание, что имя потенциального кандидата представляет собой конкатенацию столбцов «Срок», «Роль» и «Родитель», чтобы сформировать «алгоритм-N-алгоритм».

Вот логика.

  1. Если имя потенциального кандидата, «алгоритмы-N-алгоритм», встречается 5 раз в 4 документах, то количество документов, в которых оно появилось, равно 4.
  2. Если предварительно определенный параметр, называемый «минимальные родители», установлен на 3, поскольку 4 больше 3, слово «алгоритмы-N-алгоритм» добавляется в список кандидатов с правильным написанием.

А что насчет списка кандидатов на слова с ошибками? Как же тогда создать эту таблицу?

Как и в случае со списком кандидатов с правильно написанным словом, есть еще один предопределенный параметр, который нужно установить.

На этот раз он называется «максимум детей».

Взгляните, например, на рисунок 2 ниже:

Логика проста.

Если для параметра «максимальное количество потомков» установлено значение 3 и количество документов, в которых появляется имя потенциального кандидата, например «algoxxxthzs-N-algoxxxthzs», меньше 3, тогда «algoxxxthzs-N-algoxxxthzs» добавляется в список кандидатов слова с ошибками.

Эта логика повторяется для всей таблицы, указанной на рисунке 2.

Теперь, когда у нас есть список кандидатов с правильным написанием и список кандидатов с ошибками, следует логика присвоения правильно написанного слова его соответствующим орфографическим ошибкам.

Часть 2: Разрешение орфографических ошибок

На этом этапе выполняется Сравнение кандидатов для устранения орфографических ошибок.

Теперь алгоритм будет проверять все слова в списке с ошибками на соответствие всем словам в списке с правильным написанием.

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

Другой предопределенный параметр, называемый «максимальное расстояние заклинания», определяет, правильно ли написано слово с ошибкой.

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

Если «максимальное расстояние заклинания» было установлено на 20. Поскольку 50 больше 20, правильно написанный кандидат «алгоритм» теперь считается правильным написанием слова «algoxxxthzs».

Есть также другие дополнительные параметры, которые вы можете установить здесь, чтобы учесть многосторонние слова, такие как пожарная машина, продолжить или присоединиться и т. Д. Вы можете прочитать документацию здесь.

Хотя выше я сказал, что это звучит очень сложно…

Это не так.

Вот как выполнить все вышеперечисленное.

proc cas;
 textParse.tpSpell /
  table={name="pos", caslib="public"}
  minParents=3
  maxChildren=6
  maxSpellDist=15
  casOut={name="tpSpell_Out", replace=true};
   run;
quit;

Результат будет выглядеть так:

Что мне нравится в программировании SAS, так это то, насколько легко использовать сложные алгоритмы с помощью всего нескольких строк кода.

Да, пакеты Python делают то же самое, но иногда пакеты не такие продвинутые, как SAS.

Хорошим примером может служить то, как SAS выполняет оптимизацию гиперпараметров и параметров глубокого обучения внутри слоев. Как анекдот, настроить гиперпараметры в SAS было действительно просто.

SAS сочетает в себе латинский гиперкуб с генетическим алгоритмом, оптимизированным с помощью метода гиперполосности, для учета использования ресурсов. Кроме того, все автоматически становится многопоточным.

Написание того, что SAS делает из коробки на Python, определенно потребовало бы больше времени и усилий, не говоря уже о знаниях, необходимых о том, как распределять обработку с помощью Python, с учетом распределения и использования ресурсов - что, как я думаю, большинство людей не одобряют. незнакома с.

Проблема качества данных 2: обработка случайных пробелов

Эта проблема действительно заставила меня протестировать несколько методологий. Все это не сработало, за исключением методологии, которую я сейчас прохожу.

Чтобы освежить свою память, тебе, наверное, понравилась эта

Выше следует указать на несколько проблем с качеством данных:

  1. Пробел между словами, например, «проблема».
  2. Отсутствующие символы, т. Е. «Заблокирован»
  3. Поменяны местами символы, например «thsi»
  4. Двойные символы, например, «ты»
  5. Комбинация вопросов, например, «m emry» - комбинация 1 и 2.

Мне нужно было найти способ устранить пробелы между словами, при этом одновременно учитывая орфографические ошибки (числа 2, 3 и 4).

К счастью, с обработкой орфографических ошибок можно относительно легко справиться, как я показал выше с помощью tpSpell.

Но сложность заключается в комбинации вопросов (номер 5).

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

Размышляя о лучшем решении для этой работы, я черпал вдохновение из того, как работают сети кодер-декодер.

Могу ли я как-то «закодировать» предложения и «расшифровать» их после?

Очевидно, я употребляю здесь эти термины неуместно. Под «кодированием» я имел в виду удалить все пробелы между словами. Как такой:

обновить вашу память о проблемах локальных ликетов

Под «декодированием» я имею в виду разбиение слов на отдельные слова после исправления орфографических ошибок:

чтобы освежить память, проблема выглядела так

Проблема с «расшифровкой». Часть 1.

Одна из самых больших проблем, которые мне пришлось решить, заключалась в том, когда вставлять пробел после «кодирования» строки.

Возьмем, к примеру, слова «обновить».

Как узнать, что между «до» и «обновить» стоит пробел? Почему не «в», «re» и «свежий»?

Вот как я это сделал и логика моего сценария SAS.

Декодированные слова основаны на самом длинном совпадении слова.

Например, если я увидел слова «helloworld», я сначала собираюсь выполнить поиск слова «ад» в заранее определенном списке потенциальных кандидатов. то есть таблица словаря

Пока не появится следующий символ «o», поскольку «hell + o» = «hello», «hello »Становится лучшим потенциальным кандидатом.

Я отбрасываю слово «ад» в качестве основного кандидата и оставляю слово «привет» в качестве нового основного кандидата.

При чтении следующего символа «hello + w» = «hellow», поскольку «hellow» не является правильным словом в список потенциальных кандидатов, лучше всего выделить «привет».

После завершения этих проверок я добавляю пробел после «hello» и продолжаю описанную выше логику для «w», «o», «r», «l» и «d», пока я не получу «hello world»

Итак, что это за список потенциальных кандидатов и как я получил этот словарь?

Это словарь, который я создал из правильно написанного списка слов, созданного ранее с помощью действия tpSpell.

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

Проблема с «расшифровкой». Часть 2.

Были и другие проблемы, которые необходимо было решить, чтобы «декодер» заработал.

То есть мне пришлось удалить стоп-слова, все формы пунктуации, все слова в нижнем регистре и сохранить только родительские термины.

Почему?

Потому что, если бы я этого не сделал, всплыло бы много проблем.

Возьмем, к примеру, это предложение:

«серия книг»

После «кодирования» это будет:

«книги книг»

Напомним, что созданный мной алгоритм берет самое длинное совпадение в словаре во время процесса «декодирования».

Если бы я сохранил все стоп-слова, «декодер» проанализировал бы первое слово как «эти», а не «».

По этой причине следующие символы «ries» в слове «se ries» больше не будут слово в моем словаре и будет отброшено.

Это будет означать, что «декодированная» строка окажется «эти книги», что, очевидно, неверно.

Еще одна хитрость, влияющая на «декодер», выглядит примерно так:

«велосипедный спорт» → «велосипедный спорт» → «велосипедные порты» (неверно)

Чтобы решить эту проблему, я оставил в таблице словаря только родительские термины.

Пример 1: велосипед s → велосипед

Пример 2: спорт s → спорт

Если посмотреть только на родительские термины, мой результат выглядел так:

«велосипедный спорт» → «велосипедный спорт» → «велосипедный спорт» (правильно)

Поскольку «велосипед s» больше нет в моем словаре, а «велосипед» нет, декодер правильно его разбирает, а не вывод «порт для велосипедов».

Итак, вот оно что!

Моя собственная методология «кодировщика-декодера» для очистки чрезвычайно грязного неструктурированного текста! 😉

Это не идеальное решение, но оно достаточно для меня, чтобы я мог приступить к своей последующей задаче НЛП.

Увидеть все это в действии!

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

Вот как выглядит образец и процесс:

Конечные заметки

Ну вот и все!

Надеюсь, вы нашли этот пост поучительным! 😃

Хотя я потратил около 2 недель на опробование многих методологий, я получил от этого массу удовольствия!

До следующего раза, прощай!

Профиль в Linkedin: Тимоти Тан