我最近在处理一个使用各种单词缩写的数据库。例如,
wtrbtl = water bottlebwlingbl = bowling ballbsktball = basketball
似乎没有一致的缩写惯例,即有时使用元音,有时不使用。我试图构建一个类似于上面的缩写和相应单词的映射对象,但没有完整的语料库或全面的术语列表(即可能引入未明确知道的缩写)。为简单起见,假设它仅限于健身房中找到的物品,但实际上可以是任何东西。
基本上,如果只看示例的左侧部分,哪种模型可以像我们的大脑一样处理,将每个缩写与相应的完整文本标签关联起来。
我的想法停留在取首尾字母并在字典中查找这些字母。然后根据上下文分配先验概率。但由于有大量没有词尾标记的词素,我看不出如何将它们分开。
更新:
我还想到结合几个字符串度量算法,如匹配评级算法来确定一组相关术语,然后计算该组中每个单词与目标缩写之间的Levenshtein距离。然而,对于不在主字典中的单词的缩写,我仍然一头雾水。基本上,推断单词构造 – 或许Naive Bayes模型可以帮助,但我在使用上述算法时担心任何精度上的错误会使模型训练过程无效。
任何帮助都将不胜感激,因为我真的被这个问题困住了。
回答:
如果你找不到详尽的字典,你可以构建(或下载)一个概率语言模型,为你生成和评估句子候选。它可以是一个字符n-gram模型或一个神经网络。
对于你的缩写,你可以构建一个“噪声模型”,它预测字符省略的概率。它可以从一个语料库中学习(你必须手动或半手动标记),表明辅音比元音更少被省略。
有了复杂的语言模型和简单的噪声模型,你可以使用噪声通道方法结合它们(例如,参见Jurafsky的文章了解更多详情),来建议候选句子。
更新。我对这个问题充满热情,并实现了这个算法:
- 语言模型(在《指环王》文本上训练的字符5-gram)
- 噪声模型(每个符号被缩写的概率)
- 波束搜索算法,用于候选短语建议。
我的解决方案在这个Python笔记本中实现。使用训练好的模型,它的接口类似于noisy_channel('bsktball', language_model, error_model)
,顺便说一下,它返回{'basket ball': 33.5, 'basket bally': 36.0}
。字典值是建议的分数(分数越低越好)。
对于其他示例,它的效果较差:对于’wtrbtl’,它返回
{'water but all': 23.7, 'water but ill': 24.5, 'water but lay': 24.8, 'water but let': 26.0, 'water but lie': 25.9, 'water but look': 26.6}
对于’bwlingbl’,它给出
{'bwling belia': 32.3, 'bwling bell': 33.6, 'bwling below': 32.1, 'bwling belt': 32.5, 'bwling black': 31.4, 'bwling bling': 32.9, 'bwling blow': 32.7, 'bwling blue': 30.7}
然而,当在合适的语料库上训练(例如,体育杂志和博客;也许可以对名词进行过采样),并且可能使用更宽的波束搜索宽度时,这个模型将提供更相关的建议。