关于使用RNN模型格式化字符串的建议

情况说明

我目前正在学习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个数字
  • 不要取ZIZAZone d'activiter
  • 地址通常看起来像00 (Rue|Voie|Avenue|...) nameOfStreet
  • 等等…

我的处理思路

我试图得到一个输出字符串,它是输入字符串的一部分。根据上述模式,它应该删除特定的单词。

我认为我会使用RNN类型的神经网络,因为它应该能够检测到类似于“这里有一个‘BP’,所以我不取这个词,如果下一个输入是2个或4个数字的字符串,我也不取那些”的情况,我认为需要某种形式的记忆功能。

这完全取决于我想要输入数据的方式。我认为我有两到三种方法可以做到这一点:

  • 输入单个单词(以空格分割)
  • 输入整个字符串(整个地址)
  • 输入一个字符串,然后在更深的层面上分割它?

问题在于:

  • 如果我输入单个单词,我如何标记字符串分隔?

  • 如果我输入整个字符串,似乎有点浪费,因为系统只能取或删除单个单词。

  • 第三种选项(混合两种方法)是否有意义?

是否可以进行批量训练,并使用“批处理部分”来输入多个单词,每个批处理代表一个地址?

另外,我想知道在我的系统中,节点的权重是否会全部为0和1(因为它只能取或删除单个单词),还是会有一些中间值,比如保留单词的概率?

过程回顾

  1. 创建所有单个单词的字典
  2. 将我的字符串填充到相同长度?
  3. 将所有我的字符串(或单词?)转换为1D数组
  4. 定义图形
  5. 以小批量输入字符串(或单词?)
  6. 测试并显示准确性(输出字符串应该是与预期输出完全匹配,还是输出与预期输出之间的差异百分比更有意义?)
  7. 保存图形
  8. 使用它来格式化我的字符串

非常感谢你读完这些,任何帮助都将不胜感激。

特别是关于我前进的总体方向,以及向图形输入数据的方式。


回答:

解决这个问题有两种方法立即想到:

  • 序列标记 – 用1或0标记输入中的每个单词,表示是否应保留该单词。
  • seq2seq模型 – 让RNN读取整个输入,然后逐词或逐字符生成输出。

如果你刚开始,我建议使用序列标记模型。如果你想这样做,我会遵循以下步骤:

  1. 将输入表示为一个热向量序列(每个维度代表一个单词)
  2. 将标签表示为1和0的序列(表示每个单词是否应保留)
  3. 使用RNN读取每个序列
  4. 使用一个2节点层为每个单词输出类1和类0的得分
  5. 使用优化器最小化预测标签与实际标签之间的差异

要了解如何在tensorflow中进行序列标记,请查看:https://github.com/guillaumegenthial/sequence_tagging

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注