情况说明
我目前正在学习Tensorflow,作为初次尝试(在完成并尝试了MINST教程之后),我想创建一个模型(可能是RNN)来进行一些基本的字符串格式化:
我知道对于下面的情况可能不需要使用深度学习这样复杂的技术,但这只是为了训练自己。
我有一组所谓的“清洁地址”字符串,我希望从中提取出实际的清洁地址。
这是我想要实现的转换类型:
RUE DE MADAGASCAR --> RUE DE MADAGASCAR ZI DE LA PLAINE 55 RUE DU 1ER SEPTEMBRE 1944 --> 55 RUE DU 1ER SEPTEMBRE 1944 ZONE INDUSTRIELLE RUE DE LA VALLEE B.P. 8 --> RUE DE LA VALLEEBP 62 AVENUE BECQUEREL --> AVENUE BECQUEREL291 VOIE ATLAS --> 291 VOIE ATLAS12 RUE ARMAND BUSQUET ZONE INDUSTRIELLE --> 12 RUE ARMAND BUSQUETDOSSIER MLOC 5 RUE AMABLE LOZAI --> 5 RUE AMABLE LOZAI ZI CAEN CANAL --> RUE DE L'EUROPE ZI PORTUAIRE --> RUE DE L'EUROPEBP 5229 BOULEVARD HENRY BECQUEREL CAMPUS JULES HOROWITZ --> BOULEVARD HENRY BECQUERELGIE MONSIEUR GAUTIER BOULEVARD H. BECQUEREL BP 5027 --> BOULEVARD H. BECQUEREL21 PLACE DE LA REPUBLIQUE --> 21 PLACE DE LA REPUBLIQUE 18 RUE DE LA GIRAFE --> 18 RUE DE LA GIRAFE 21 RUE DES GOUDRIERS --> 21 RUE DES GOUDRIERS AVENUE STRASSBURGER --> AVENUE STRASSBURGER 7 RUE DE L'EGLISE --> 7 RUE DE L'EGLISE 1060 RUE LEON FOUCAULT ZI DE LA SPHERE --> 1060 RUE LEON FOUCAULT
如果你需要更多示例,这里有一个链接到包含200个元素的电子表格(计划将其扩展到1000到5000个元素)
如你所见,有很多可识别的模式:
- 不要取
BP
单词及其后面的2个或4个数字 - 不要取
ZI
,ZA
或Zone d'activiter
… - 地址通常看起来像
00 (Rue|Voie|Avenue|...) nameOfStreet
- 等等…
我的处理思路
我试图得到一个输出字符串,它是输入字符串的一部分。根据上述模式,它应该删除特定的单词。
我认为我会使用RNN类型的神经网络,因为它应该能够检测到类似于“这里有一个‘BP’,所以我不取这个词,如果下一个输入是2个或4个数字的字符串,我也不取那些”的情况,我认为需要某种形式的记忆功能。
这完全取决于我想要输入数据的方式。我认为我有两到三种方法可以做到这一点:
- 输入单个单词(以空格分割)
- 输入整个字符串(整个地址)
- 输入一个字符串,然后在更深的层面上分割它?
问题在于:
-
如果我输入单个单词,我如何标记字符串分隔?
-
如果我输入整个字符串,似乎有点浪费,因为系统只能取或删除单个单词。
-
第三种选项(混合两种方法)是否有意义?
是否可以进行批量训练,并使用“批处理部分”来输入多个单词,每个批处理代表一个地址?
另外,我想知道在我的系统中,节点的权重是否会全部为0和1(因为它只能取或删除单个单词),还是会有一些中间值,比如保留单词的概率?
过程回顾
- 创建所有单个单词的字典
- 将我的字符串填充到相同长度?
- 将所有我的字符串(或单词?)转换为1D数组
- 定义图形
- 以小批量输入字符串(或单词?)
- 测试并显示准确性(输出字符串应该是与预期输出完全匹配,还是输出与预期输出之间的差异百分比更有意义?)
- 保存图形
- 使用它来格式化我的字符串
非常感谢你读完这些,任何帮助都将不胜感激。
特别是关于我前进的总体方向,以及向图形输入数据的方式。
回答:
解决这个问题有两种方法立即想到:
- 序列标记 – 用1或0标记输入中的每个单词,表示是否应保留该单词。
- seq2seq模型 – 让RNN读取整个输入,然后逐词或逐字符生成输出。
如果你刚开始,我建议使用序列标记模型。如果你想这样做,我会遵循以下步骤:
- 将输入表示为一个热向量序列(每个维度代表一个单词)
- 将标签表示为1和0的序列(表示每个单词是否应保留)
- 使用RNN读取每个序列
- 使用一个2节点层为每个单词输出类1和类0的得分
- 使用优化器最小化预测标签与实际标签之间的差异
要了解如何在tensorflow中进行序列标记,请查看:https://github.com/guillaumegenthial/sequence_tagging