Выбор полезных значений из текстовых сообщений с помощью Keras - PullRequest
0 голосов
/ 19 сентября 2018

Представьте себе, что кто-то отправляет вам такую ​​почту каждый день:

Пример 1:

"Мой расход топлива вчера составлял XXX литров, мое расстояниепроехал YYY км / миль, моя средняя скорость вчера ZZZ км / миль в час "

Пример 2:

" Используется двигатель XXXлитров топлива вчера, автомобиль проехал YYY километров вчера (+3 километра после 12 часов, но это было технически сегодня), средняя скорость автомобиля вчера составляет ZZZ километров в час "

Можнобыть больше значений в почту, до 5 значений (в этом примере их 3).

Задача состоит в том, чтобы извлечь из почты значения XXX,YYY and ZZZ (и больше, когда их больше).Конечно, почта набирается вручную, поэтому каждое письмо имеет свой вид.

Вопрос в том, как это сделать?Любая (серьезная) идея приветствуется, я выскажу свои мысли об этом ниже:

Я думал, что Keras (или любая другая) нейронная сеть может сделать эту работу.Я попытался сделать так, чтобы каждое письмо было представлено пустым вектором с помощью keras.preprocessing.text.one_hot() и обучил его нейронной сети со следующей структурой:

  1. EmbeddingLayer
  2. 1DConvLayer с Reluактивация
  3. MaxpoolLayer
  4. DropoutLayer
  5. FlattenLayer
  6. DenseLayer с активацией Relu
  7. DropoutLayer
  8. Плотный слой с линейной активацией

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

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

Должен ли я использовать совершенно другой вывод?например, нейронная сеть выводит: «шестое слово - это расход топлива».

Должен ли я использовать радикально другой подход без нейронной сети вообще?Что будет работать тогда?

Пример сообщения с выходом нейронной сети.Почтовое сообщение:

 - Cargo quantity, B/L mt: 0 
 - ME Fuel consumption mt: 8,9 
 - Total fuel consumption mt: 15
 - Draught m: 6,65
 - Date: 2018-07-04 07:00
 - Timezone: 2018-07-04 07:00 W. Europe Standard Time 
 - ROB MGO: 510,3
 - Distance, 127

Нейронная сеть Выход:

  • Дата: 2018-09-12T15: 02: 28
  • Часовой пояс: 545,405
  • ROB MGO: -1876,67
  • Груз: 23714,6
  • Осадка: 0,394458
  • Разгрузка груза: 9,97439e + 06
  • Грузоподъемность: 9,87113e + 06

Желаемый выход:

  • Дата: 2018-04-07T07: 00: 00
  • Часовой пояс: + 1
  • ROB MGO: 510,3
  • Груз: 0
  • Осадка: 6,65
  • Разгрузка груза: 99999999
  • Грузовая нагрузка: 99999999

Часовой пояс представляет разницу по отношению к UTC, в этом случае +1, Разгрузка груза и Загрузка груза не присутствуют в почте,поэтому они должны вывести 99999999, что означает «нет».Даты сначала преобразуются в метки времени, поэтому нейронная сеть выводит метку времени.

1 Ответ

0 голосов
/ 25 сентября 2018

Это можно сделать в следующие шаги:

  1. Создать файл Excel с 2 столбцами с именами " Имя " и Шаблон".Где «Имя» - это группа захвата ( Черновик / Выгрузка груза ), а «шаблон» требует регулярных выражений для его захвата.

  2. Прочитайте это Excel вpython с командой ниже:

import pandas as pd
df = pd.read_excel('\\Regex.xlsx', sheet_name=0)
Передайте это df нижеприведенным функциям, которые помогут вам проанализировать Excel регулярных выражений, а затем проанализировать его:
def parse_patterns_regex(df):
    pattern = df['pattern'].tolist()
    pattern_name = df['name'].tolist()
    pattern_dict = dict(zip(pattern_name, pattern))
    return pattern_dict
Передайте pattern dict и text (ваши электронные письма) нижеприведенным функциям, чтобы получить желаемый результат
def find_patterns_regex(text, pattern_dict,sep = ' ;; '):
        NLU_Dict=collections.defaultdict()
        for pn, p in pattern_dict.items():
            val = sep.join([sep.join(filter(lambda x: len(str(x).strip()) >0,map(str, v))) for v in re.findall(p, text,re.I)])
            NLU_Dict[pn] = val
        return NLU_Dict

NLU_Dict будет словаремгруппа захвата и соответствующие значения.Значения, которых нет в почте, будут просто пустыми.Вы можете просто написать простую логику для преобразования blank to 999999 и т. Д.

Пример регулярного выражения для записи в Excel :
Capturing Group: Fuel Consumption ## This is "name" column of the above excel
Regex:(\d+)\s?(?i)liters?|(\d+)\s?(?i)litters? ##This is "pattern" column of the above excel

См. Ссылку ниже, чтобы увидеть работу регулярного выражения: https://regex101.com/r/IppEq0/1

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