背景给定一串文本,它是否代表一个地址?地址中一般有xx路、xx街等,这些字符在地址串中具有很强的特征。但如果仅此还不够,比如:延安路发生重大交通事故,显然不是地址串。这种问题在直觉上更适合用语言模型捕捉地址的通用语言。借助tensorflow,我们可以轻松训练出这样的模型。训练数据本模型使用100w+个地址串,加上全国各省市县的组合(特别是正规的xx县、xx市、xx省)。覆盖大部分地址字符串的样本是北京市朝阳区朝阳北路101号。汕头市金华区山樟立交桥底朝阳大悦城(近星河湾)6号(近金华小学)利民南路长春经济开发区林和街道天地十二广场C29栋肇东市绥化市(近肯德基)六盘水中山区人民中路220号宁波河头路83号、87号、91号上海市杨浦区银兴路752号(门口)ChengdaMarket)衢州市江山市潞西南路潞西广场北侧潞西大厦2号楼11号——16号模型的输入语言模型可以是字型,也可以是字型,字型基于。对于中文,有成千上万个不同的字符。Wordbased更大。基于分词的分词也需要使用tokenizer来分词,分词也可能会损失精度。基于词的关系模型更简单,容错性更强。我们使用基于单词的语言模型进行训练。这样我们就把输入的地址串先按Unicode划分,然后只保留出现频率大于1的作为字典。此外,我们假设地址字符串中的最大长度为50个字符,否则每个段(50)将被单独处理。考虑到我们在训练中使用的字符不一定能覆盖在线测试中的所有字符,如果不在字典中,字典会把它映射到id0。但是字符串的结尾需要特殊的表示来区分字典中没有的情况。我们将它添加到每个字符串的末尾以指示结束。Label&Loss词语言模型的本质是在给定上下文的情况下,计算下一个出现的字符。的概率分布,在训练过程中,我们给出的地址串隐式给出了每个时间步的标记输出值。一般语言模型的损失函数是perplexity,这里类似。求和每一步的交叉熵。由于timestep是固定的,这相当于将perplexity近似放大了timestep*batch_size倍。训练代码是这样的整个训练代码其实很短,如下:网上代码用c++调用,python训练的模型变量和计算图分别存放。我们使用tensorflow自带的工具tensorflow/python/tools/freeze_graph.py让我们将这些组合成一个模型文件,然后在我们的C++代码中加载模型。计算句子的perplexity时,先将句子分成Unicode字符,填入input和target对应的tensor,然后运行指定的计算节点,得到loss,计算perplexity。在这里,我们只是将困惑归一化。困惑度越低,得分越接近1,反之越接近0。
