2009-08-07 2 views
5

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

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

Некоторые выглядят вроде этого:

 
    This is example text that could be many lines long... 

    Location 1 
    Product 1  Product 2  Product 3 
    $20.99  $21.99  $33.79 

    Location 2 
    Product 1  Product 2  Product 3 
    $24.99  $22.88  $35.59 

Другие смотрят вроде этого:

 
    PRODUCT       PRICE   +/- 
    ------------  -------- ------- 
    Location 1 
    1             2007.30 +048.20 
    2             2022.50 +048.20 

    Maybe some multiline text here about a holiday or something... 

    Location 2 
    1             2017.30 +048.20 
    2             2032.50 +048.20 

В настоящее время у нас есть отдельные парсеры, написанные для электронной почты формата каждой компании. Но эти форматы немного меняются довольно часто. Мы не можем рассчитывать на то, что цены будут в одной строке или столбце каждый раз.

Это тривиально для нас, чтобы посмотреть электронные письма и определить, какая цена идет с каким продуктом в каком месте. Но не столько для нашего кода. Поэтому я пытаюсь найти более гибкое решение и хотел бы получить ваши предложения о том, какие подходы предпринять. Я открыт для чего-либо из регулярного выражения в нейронные сети. Я узнаю, что мне нужно для выполнения этой работы, я просто не знаю, что мне нужно узнать. Является ли это проблемой lex/parsing? Больше похоже на OCR?

Код не должен самостоятельно определять форматы. Письма попадают в несколько основных «стилей», подобных тем, которые указаны выше. Нам действительно нужен код, чтобы он был достаточно гибким, чтобы новая линейка продуктов или пробелы или что-то не делали файл недоступным.

Спасибо за любые предложения о том, с чего начать.

+1

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

+0

Текущий код в основном: Если компания является компанией1, перейдите к третьей строке, прочитайте первые 12 символов в качестве продукта, а затем прочитайте символы 45-50 в качестве цены. Затем перейдите к четвертой строке ... Это очень, очень жестко закодировано. –

+0

@Scott, Ok, если пробел разделяет данные на столбцы, как я опишу в своем ответе, вы можете использовать скрипты удобно. – nik

ответ

7

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

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

from pyparsing import * 

aaa =""" This is example text that could be many lines long... 
      another line 

    Location 1 
    Product 1  Product 2  Product 3 
    $20.99  $21.99  $33.79 

    stuff in here you want to ignore 

    Location 2 
    Product 1  Product 2  Product 3 
    $24.99  $22.88  $35.59 """ 

result = SkipTo("Location").suppress() \ 
# in place of "location" could be any type of match like a re. 
     + OneOrMore(Word(alphas) + Word(nums)) \ 
     + OneOrMore(Word(nums+"$.")) \ 

all_results = OneOrMore(Group(result)) 

parsed = all_results.parseString(aaa) 

for block in parsed: 
    print block 

Это возвращает список списков.

['Location', '1', 'Product', '1', 'Product', '2', 'Product', '3', '$20.99', '$21.99', '$33.79'] 
['Location', '2', 'Product', '1', 'Product', '2', 'Product', '3', '$24.99', '$22.88', '$35.59'] 

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

Я не знаю, существуют ли эквиваленты на других языках.

0

Вы предоставили два образца образцов для текстовых файлов.
Я думаю, что они могут обрабатываться с помощью скриптов.
Что-то вроде: AWK, sed, grep с bash-скриптами.


Один образец в первом образце,

  1. Раздел начинается с ключевого слова Location [Номер]
    • вторая линия раздела имеет столбцы описания названия продукта
    • третья линия раздела имеет колонны с ценами на продукты

В разделе может быть изменено количество продуктов.
Может быть изменено количество разделов на файл.
Продукты и цены всегда находятся на обозначенных линиях участка.
Разделение пробелов идентифицирует ассоциацию столбцов (product,price).
Количество товаров в разделе соответствует количеству цен в этом разделе.


Собранные данные, вероятно, будут ассимилироваться в базе данных.

0

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

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

+0

Спасибо. Сейчас мы изучаем, потому что может быть, что более общий метод может утроить доходы, что меняет наше обычное определение «перепрограммирования». :) Если у вас есть идеи о более общих методах, даже если они кажутся, что они могут быть излишними, добавьте их. –

Смежные вопросы