想象一下每天有人向您发送一封邮件:
示例1:
“昨天我的燃油消耗为XXX升,我的行驶距离为 YYY公里/里,我昨天的平均速度ZZZ公里/里 每小时”
示例2:
“发动机昨天使用了XXX升燃油,汽车行驶了YYY 昨天的公里数(12点后+3公里,但这是 从技术上讲今天),昨天汽车的平均速度为ZZZ公里 每小时”
邮件中可以包含更多值,最多5个值(在此示例中为3个)。
任务是从邮件中获取XXX,YYY and ZZZ
(如果有更多,更多)。当然,邮件是手动键入的,因此每封邮件都是不同的类型。
问题是,该怎么做? 每个(严肃的)想法都是受欢迎的,我将在下面给出我的想法:
我认为 Keras (或其他任何一种)神经网络可以胜任这项工作。我尝试使用keras.preprocessing.text.one_hot()
来使每个邮件由一个numpy向量表示,并在其上训练具有以下结构的神经网络:
- EmbeddingLayer
- 具有Relu激活功能的1DConvLayer
- MaxpoolLayer
- DropoutLayer
- FlattenLayer
- 具有Relu激活功能的DenseLayer
- DropoutLayer
- 具有线性激活的致密层
对于上面的示例,将有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,表示“不存在”。首先将日期转换为时间戳,以便神经网络输出时间戳。
答案 0 :(得分:1)
可以通过以下步骤完成:
制作一个Excel文件,该文件包含名为“ 名称”和“ 样式”的2列。其中“名称”是捕获组(吃水/货运卸载),则正则表达式需要使用“模式”来捕获它。
使用以下命令在python中读取此excel:
import pandas as pd df = pd.read_excel('\\Regex.xlsx', sheet_name=0)
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
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
等。
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