Dan*_*kin 27 python nlp machine-learning abbreviation
我最近在研究一种使用各种单词缩写的数据集.例如,
wtrbtl = water bottle
bwlingbl = bowling ball
bsktball = basketball
Run Code Online (Sandbox Code Playgroud)
在所使用的惯例方面似乎没有任何一致性,即有时他们有时不使用元音.我正在尝试构建一个类似于上面的映射对象的缩写及其相应的单词而没有完整的语料库或全面的术语列表(即可以引入未明确知道的缩写).为简单起见,它说它仅限于您在健身房中找到的东西,但它可能是任何东西.
基本上,如果你只看一下例子的左侧,那么在将每个缩写与相应的全文标签相关联时,哪种模型可以做与我们大脑相同的处理.
我的想法已停止在第一封和最后一封信中找到并在字典中找到它们.然后根据上下文分配先验概率.但是由于有大量语素没有标记表示单词结尾,我看不出它是如何分裂它们的.
更新:
我还想到结合一些字符串度量算法(如匹配评级算法)来确定一组相关术语,然后计算集合中每个单词与目标缩写之间的Levenshtein距离.但是,当涉及不在主词典中的单词的缩写时,我仍处于黑暗中.基本上,推断单词构造 - 可能Naive Bayes模型可能有所帮助,但我担心使用上述算法导致的任何精度误差都将使任何模型训练过程无效.
任何帮助都表示赞赏,因为我真的被困在这个.
Dav*_*ale 21
如果您找不到详尽的字典,您可以构建(或下载)概率语言模型,为您生成和评估候选句子.它可以是字符n-gram模型或神经网络.
对于缩写,您可以构建一个"噪声模型"来预测字符遗漏的可能性.它可以从语料库中学习(您必须手动或半手动标记)辅音错误发生频率低于元音.
拥有复杂的语言模型和简单的噪声模型,您可以使用嘈杂的通道方法将它们组合起来(参见Jurafsky的文章以获取更多详细信息),以建议候选句子.
更新.我对这个问题很热心并实现了这个算法:
我的解决方案在这个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}.然而,当在适当的语料库(例如体育杂志和博客;可能对名词的过度采样)进行训练时,并且可能具有更宽的波束搜索宽度,该模型将提供更相关的建议.
Rob*_*bie 14
所以我看了一个类似的问题,并遇到了一个名为PyEnchant的奇妙包.如果您使用构建拼写检查器,您可以获得单词建议,这将是一个很好的简单解决方案.然而,它只会建议单个单词(据我所知),所以你有这样的情况:
wtrbtl = water bottle
Run Code Online (Sandbox Code Playgroud)
不管用.
这是一些代码:
import enchant
wordDict = enchant.Dict("en_US")
inputWords = ['wtrbtl','bwlingbl','bsktball']
for word in inputWords:
print wordDict.suggest(word)
Run Code Online (Sandbox Code Playgroud)
输出是:
['rebuttal', 'tribute']
['bowling', 'blinding', 'blinking', 'bumbling', 'alienable', 'Nibelung']
['basketball', 'fastball', 'spitball', 'softball', 'executable', 'basketry']
Run Code Online (Sandbox Code Playgroud)
也许如果你知道有什么类型的缩写,你可以将字符串分成两个单词,例如
'wtrbtl' -> ['wtr', 'btl']
Run Code Online (Sandbox Code Playgroud)
还有自然语言处理工具包(NLTK),它是令人惊叹的,你可以通过查看每个建议单词的常见程度来结合上面的代码使用它.
祝好运!