Вопрос или проблема
Я хочу использовать машинное обучение и обработку естественного языка (NLP), чтобы преобразовать полуструктурированные данные в текстовых файлах в структурированные данные, предсказывая паттерны в файлах и разбивая поля. Например, если у меня есть текстовый файл, который выглядит следующим образом:
Входные данные:
2021565267MALL1ETAGE ZARA1st FLOOR 2345561
2022565267MALL2ETAGE ZARA1st FLOOR 2345561
2022565267ANFAPLACE2ETAGECOFEESHOP2345561
20225652634ANFAPLACE2ETAGE 2345561
Желаемый выход:
2021565267,MALL1ETAGE ZARA1st FLOOR,2345561
2022565267,MALL2ETAGE ZARA1st FLOOR,2345561
2022565267,ANFAPLACE2ETAGECOFEESHOP,2345561
20225652634,ANFAPLACE2ETAGE,2345561
Полуструктурированные файлы имеют непостоянную ширину, поэтому мы не можем просто добавить спецификацию колонн в pandas следующим образом (это может сработать для первой строки, например):
col_specification =[(1, 10),.... ]
Один из подходов, который я нашел в Интернете, заключается в том, чтобы создать словарь на основе частоты появления слов в полуструктурированном файле. Сработает ли это в данной ситуации, и если да, то как я могу реализовать что-то подобное?
Я делаю следующие предположения:
- Первый столбец с числами – это первые несколько цифр/чисел в каждой строке.
- Последний столбец с числами – это последние несколько цифр/чисел в каждой строке.
- Таким образом, во втором столбце такие тексты, как
MALL1ETAGE ZARA1st FLOOR
, не должны содержать чисел в начале или в конце. Таким образом,20215652671MALL1ETAGE ZARA1st FLOOR 2345561
будет интерпретироваться как20215652671, MALL1ETAGE ZARA1st FLOOR, 2345561
, а не как2021565267, 1MALL1ETAGE ZARA1st FLOOR, 2345561
.
С этой целью вы можете использовать следующее, что использует регулярное выражение для захвата первой и последней группы чисел:
import re
re.findall("^([0-9]+)(.*?)([0-9]+)$", "2021565267MALL1ETAGE ZARA1st FLOOR 2345561")
# [('2021565267', 'MALL1ETAGE ZARA1st FLOOR ', '2345561')]
Применение strip()
к каждому из результатов удаляет пробелы в конце и позволяет получить желаемый выход.
Ответ или решение
Чтобы извлечь структурированные данные из полуструктурированных текстовых файлов с помощью методов машинного обучения и обработки естественного языка (NLP), мы можем использовать регулярные выражения, которые отлично подходят для этой задачи. Ниже приведено полное решение, которое основывается на ваших предположениях и показывает, как можно преобразовать данные в нужный формат.
Подход к задаче
-
Анализ данных: Мы понимаем, что каждая строка содержит набор данных, где:
- Первая часть — это последовательность цифр.
- Вторая часть — текст, содержащий пробелы и буквы, но без цифр в начале или конце.
- Последняя часть — это опять последовательность цифр.
-
Регулярное выражение: Мы будем использовать регулярные выражения для захвата трех групп данных.
Реализация
Вот пример реализации на Python:
import re
# Исходные данные
data = [
"2021565267MALL1ETAGE ZARA1st FLOOR 2345561",
"2022565267MALL2ETAGE ZARA1st FLOOR 2345561",
"2022565267ANFAPLACE2ETAGECOFEESHOP2345561",
"20225652634ANFAPLACE2ETAGE 2345561"
]
# Шаблон регулярного выражения
pattern = r"^([0-9]+)(.*?)([0-9]+)$"
# Функция для обработки и извлечения данных
def extract_data(lines):
extracted_data = []
for line in lines:
match = re.findall(pattern, line)
if match:
# Получаем первую, вторую и третью части
first_column = match[0][0].strip()
second_column = match[0][1].strip()
third_column = match[0][2].strip()
# Формируем результат в нужном формате
extracted_data.append(f"{first_column},{second_column},{third_column}")
return extracted_data
# Вызываем функцию и выводим результат
structured_data = extract_data(data)
for row in structured_data:
print(row)
Объяснение кода
- Импорт библиотеки: Мы импортируем библиотеку
re
, которая предоставляет поддержку регулярных выражений. - Исходные данные: Создаем список
data
, в который помещаем строки полуструктурированных данных. - Шаблон регулярного выражения: Используем шаблон
^([0-9]+)(.*?)([0-9]+)$
, где:^([0-9]+)
— захватывает первую часть (последовательность цифр) на начале строки.(.*?)
— захватывает середину строки (текст), которая не содержит цифр в начале или конце.([0-9]+)$
— захватывает последнюю часть (последовательность цифр) в конце строки.
- Функция
extract_data
: Эта функция принимает список строк, применяет регулярное выражение и выбирает соответствующие части, убирая лишние пробелы. - Вывод результата: Итоги выводятся в нужном формате.
Заключение
Данное решение позволит вам эффективно извлекать структурированные данные из полуструктурированных текстов, используя регулярные выражения. Если у вас есть дополнительные вопросы или нужна помощь с другими аспектами, не стесняйтесь обращаться!