Алгоритмы или шаблоны для чтения текста - PullRequest
6 голосов
/ 07 августа 2009

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

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

Некоторые выглядят примерно так:

    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 / разбора? Больше похоже на OCR?

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

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

Ответы [ 3 ]

7 голосов
/ 08 августа 2009

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

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

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 голосов
/ 07 августа 2009

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

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

0 голосов
/ 07 августа 2009

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


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

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

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...