使用Keras从短信中挑选有用的值

时间:2018-09-19 09:40:16

标签: python neural-network keras

想象一下每天有人向您发送一封邮件:

示例1:

  

“昨天我的燃油消耗为XXX升,我的行驶距离为   YYY公里/里,我昨天的平均速度ZZZ公里/里   每小时”

示例2:

  

“发动机昨天使用了XXX升燃油,汽车行驶了YYY   昨天的公里数(12点后+3公里,但这是   从技术上讲今天),昨天汽车的平均速度为ZZZ公里   每小时”

邮件中可以包含更多值,最多5个值(在此示例中为3个)。

任务是从邮件中获取XXX,YYY and ZZZ(如果有更多,更多)。当然,邮件是手动键入的,因此每封邮件都是不同的类型。

问题是,该怎么做? 每个(严肃的)想法都是受欢迎的,我将在下面给出我的想法:

我认为 Keras (或其他任何一种)神经网络可以胜任这项工作。我尝试使用keras.preprocessing.text.one_hot()来使每个邮件由一个numpy向量表示,并在其上训练具有以下结构的神经网络:

  
      
  1. EmbeddingLayer
  2.   
  3. 具有Relu激活功能的1DConvLayer
  4.   
  5. MaxpoolLayer
  6.   
  7. DropoutLayer
  8.   
  9. FlattenLayer
  10.   
  11. 具有Relu激活功能的DenseLayer
  12.   
  13. DropoutLayer
  14.   
  15. 具有线性激活的致密层
  16.   

对于上面的示例,将有3个输出神经元,每个神经元应预测一个值,例如第一个输出神经元应输出XXX,第二个神经元YYY,依此类推。

使用 Adam优化程序和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
  •   
  • 机器人MGO:-1876.67
  •   
  • 货物:23714.6
  •   
  • 吃水:0.394458
  •   
  • 卸载量:9.97439e + 06
  •   
  • 载货量:9.87113e + 06
  •   

所需的输出:

  
      
  • 日期:2018-04-07T07:00:00
  •   
  • 时区:+1
  •   
  • 机器人MGO:510.3
  •   
  • 货物:0
  •   
  • 吃水:6.65
  •   
  • 货物卸载量:99999999
  •   
  • 货运量:99999999
  •   

时区表示与UTC的时差,在这种情况下,邮件中不存在+1,货物卸载和货物装载,因此它们应输出99999999,表示“不存在”。首先将日期转换为时间戳,以便神经网络输出时间戳。

1 个答案:

答案 0 :(得分:1)

可以通过以下步骤完成:

  1. 制作一个Excel文件,该文件包含名为“ 名称”和“ 样式”的2列。其中“名称”是捕获组(吃水/货运卸载),则正则表达式需要使用“模式”来捕获它。

  2. 使用以下命令在python中读取此excel:

import pandas as pd
df = pd.read_excel('\\Regex.xlsx', sheet_name=0)
  1. 将此df传递给以下函数,这些函数将帮助您解析regex的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
  1. pattern dicttext(您的电子邮件)传递给以下函数以获取所需的输出
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等。

  1. 要用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

  1. 现在您需要为捕获组编写更多正则表达式并放入excel