我有一个短字符串列表,每个字符串都标识一个城市。拼写错误很常见。下面的示例显示了其中一些短字符串,以及它们应该匹配的正确城市。
| 细绳 | 城市 |
|---|---|
| 阿姆斯特丹 | 阿姆斯特丹 |
| 阿斯姆特丹 | 阿姆斯特丹 |
| 阿姆斯特丹 | 阿姆斯特丹 |
| 纽约 | 纽约 |
| 纽约 | 纽约 |
| 纽约 | 纽约 |
| 纽约 | 纽约 |
| 纽约 | 纽约 |
我想训练一个接受输入字符串的分类器,然后预测最有可能被识别的城市。然而,有一个微妙之处在于,正确的城市不仅取决于输入字符串,还取决于其他因素,例如人的当前位置以及正在写作的人。
例如,以下字符串可能表示基于这些其他特征的不同城市:
| 当前位置 | 人 | 细绳 | 城市 |
|---|---|---|---|
| 英国 | 约翰 | 德拉特福德 | 达特福德 |
| 英国 | 杰克 | 达特福德 | 达特福德 |
| 英国 | 吉尔 | 达特弗罗德 | 达特福德 |
| 挪威 | 吉尔 | 达特福德 | 达特福德 |
| 挪威 | 约翰 | 达特弗罗德 | 达特峡湾 |
| 挪威 | 詹姆士 | 达特弗罗德 | 达特峡湾 |
| 瑞典 | 奥拉夫 | 德拉特峡湾 | 达特峡湾 |
| 英国 | 奥拉夫 | 德拉特福德 | 达特峡湾 |
正如我们所看到的,相同的输入字符串可能意味着不同的实际城市,具体取决于编写者以及作者当前所在的位置。这意味着仅使用 tf-idf 进行模糊搜索不足以做出正确的预测。
我正在考虑两种不同的方法来实现适当的分类器:
- 使用字符 n-gram 作为特征 + 其他分类特征的提升树
- 使用字母卷积+其他分类特征的神经网络
这里的一个优点是字符串的大小总是有限的(最多大约 50/60 个字符)。
对于提升树的情况,我特别苦苦挣扎的一件事是,如何让模型了解字符 n-gram 的顺序?例如,序列mst之后的序列ams表示amsterdam,但我不知道如何给模型一种序列感,这个序列可能在字符串中的任何位置?(例如,如果输入字符串是,aamsterdam那么这个序列将在位置 2,而不是位置 1)。
所以简而言之,我会寻找分解和建模输入字符串的最佳方式的指导,以便将其转换为可被提升树或(卷积?)神经网络使用的特征,以及其他分类输入特征.
我显然不是在这里寻找一个完整的解决方案,只是一般指导将不胜感激。