Python - 如何使用 NLP 从缩写文本中凭直觉识别单词?
Python - How to intuit word from abbreviated text using NLP?
我最近在处理一个使用各种单词缩写的数据集。例如,
wtrbtl = water bottle
bwlingbl = bowling ball
bsktball = basketball
在使用的约定方面似乎没有任何一致性,即有时他们使用元音有时不使用。我正在尝试构建一个像上面那样的映射对象,用于缩写及其相应的单词,而没有完整的语料库或全面的术语列表(即可以引入未明确知道的缩写)。为简单起见,假设它仅限于您在健身房找到的东西,但它可以是任何东西。
基本上,如果您只看示例的左侧,在将每个缩写与相应的全文标签相关联方面,什么样的模型可以像我们的大脑一样进行处理。
我的想法已经停止在获取第一个和最后一个字母并在字典中找到它们。然后根据上下文分配先验概率。但是由于有大量语素没有指示单词结尾的标记,所以我看不出如何拆分它们。
更新:
我还想到了结合一些字符串度量算法(如匹配评级算法)来确定一组相关术语,然后计算该组中每个单词与目标缩写之间的 Levenshtein 距离。但是,对于没有在主词典中的单词的缩写,我仍然一无所知。基本上,推断单词构造——朴素贝叶斯模型可能会有所帮助,但我担心使用上述算法引起的任何精度错误都会使任何模型训练过程无效。
感谢任何帮助,因为我真的被困在这个问题上。
所以我研究了一个类似的问题,发现了一个很棒的包,叫做 PyEnchant。如果您使用内置的拼写检查器,您可以获得单词建议,这将是一个不错且简单的解决方案。 但是它只会建议单个单词(据我所知),所以你的情况是:
wtrbtl = water bottle
不会工作。
这是一些代码:
import enchant
wordDict = enchant.Dict("en_US")
inputWords = ['wtrbtl','bwlingbl','bsktball']
for word in inputWords:
print wordDict.suggest(word)
输出为:
['rebuttal', 'tribute']
['bowling', 'blinding', 'blinking', 'bumbling', 'alienable', 'Nibelung']
['basketball', 'fastball', 'spitball', 'softball', 'executable', 'basketry']
也许如果你知道有哪些缩写,你可以将字符串分成两个词,例如
'wtrbtl' -> ['wtr', 'btl']
还有 Natural Language Processing Kit (NLTK),它非常棒,您可以将其与上述代码结合使用,例如查看每个建议词的常见程度。
祝你好运!
一个选择是回到过去并计算 Soundex Algorithm 等价物。
Soundex 删除所有元音,处理常见的发音错误和拼写错误。该算法很简单,过去是手工完成的。缺点是没有特殊的词干提取或停止工作支持。
... abbreviations for words not in a master dictionary.
那么,您正在寻找一种 NLP 模型,它可以提出有效的英语单词,而以前从未见过它们?
可能更容易找到更详尽的词典,或者将现有词典中的每个词映射到常见的扩展名,例如 +"es"
或 word[:-1] + "ies"
。
如果找不到详尽的词典,您可以构建(或下载)概率语言模型,为您生成和评估候选句子。它可以是字符 n-gram 模型或神经网络。
对于您的缩写,您可以构建一个 "noise model" 来预测字符遗漏的概率。它可以从语料库中学习(你必须手动或半手动地标记它)辅音丢失的频率低于元音。
有一个复杂的语言模型和一个简单的噪声模型,您可以使用 噪声通道 方法将它们结合起来(请参阅 the article by Jurafsky 了解更多详细信息),以建议候选人句子。
更新。我对这个问题很感兴趣并实现了这个算法:
- 语言模型(在指环王文本上训练的字符 5-gram)
- 噪声模型(每个符号被缩写的概率)
- 波束搜索算法,用于候选短语建议。
我的解决方案已实施 in this Python notebook。对于训练有素的模型,它具有类似于 noisy_channel('bsktball', language_model, error_model)
的界面,顺便说一句,returns
{'basket ball': 33.5, 'basket bally': 36.0}
。字典值是建议的分数(越低越好)。
对于其他示例,它的效果更差:对于 'wtrbtl' 它 returns
{'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}
然而,当在适当的语料库(例如体育杂志和博客;可能对名词进行过度采样)上进行训练时,并且可能使用更宽的波束搜索宽度,此模型将提供更多相关建议。
我最近在处理一个使用各种单词缩写的数据集。例如,
wtrbtl = water bottle
bwlingbl = bowling ball
bsktball = basketball
在使用的约定方面似乎没有任何一致性,即有时他们使用元音有时不使用。我正在尝试构建一个像上面那样的映射对象,用于缩写及其相应的单词,而没有完整的语料库或全面的术语列表(即可以引入未明确知道的缩写)。为简单起见,假设它仅限于您在健身房找到的东西,但它可以是任何东西。
基本上,如果您只看示例的左侧,在将每个缩写与相应的全文标签相关联方面,什么样的模型可以像我们的大脑一样进行处理。
我的想法已经停止在获取第一个和最后一个字母并在字典中找到它们。然后根据上下文分配先验概率。但是由于有大量语素没有指示单词结尾的标记,所以我看不出如何拆分它们。
更新:
我还想到了结合一些字符串度量算法(如匹配评级算法)来确定一组相关术语,然后计算该组中每个单词与目标缩写之间的 Levenshtein 距离。但是,对于没有在主词典中的单词的缩写,我仍然一无所知。基本上,推断单词构造——朴素贝叶斯模型可能会有所帮助,但我担心使用上述算法引起的任何精度错误都会使任何模型训练过程无效。
感谢任何帮助,因为我真的被困在这个问题上。
所以我研究了一个类似的问题,发现了一个很棒的包,叫做 PyEnchant。如果您使用内置的拼写检查器,您可以获得单词建议,这将是一个不错且简单的解决方案。 但是它只会建议单个单词(据我所知),所以你的情况是:
wtrbtl = water bottle
不会工作。
这是一些代码:
import enchant
wordDict = enchant.Dict("en_US")
inputWords = ['wtrbtl','bwlingbl','bsktball']
for word in inputWords:
print wordDict.suggest(word)
输出为:
['rebuttal', 'tribute']
['bowling', 'blinding', 'blinking', 'bumbling', 'alienable', 'Nibelung']
['basketball', 'fastball', 'spitball', 'softball', 'executable', 'basketry']
也许如果你知道有哪些缩写,你可以将字符串分成两个词,例如
'wtrbtl' -> ['wtr', 'btl']
还有 Natural Language Processing Kit (NLTK),它非常棒,您可以将其与上述代码结合使用,例如查看每个建议词的常见程度。
祝你好运!
一个选择是回到过去并计算 Soundex Algorithm 等价物。
Soundex 删除所有元音,处理常见的发音错误和拼写错误。该算法很简单,过去是手工完成的。缺点是没有特殊的词干提取或停止工作支持。
... abbreviations for words not in a master dictionary.
那么,您正在寻找一种 NLP 模型,它可以提出有效的英语单词,而以前从未见过它们?
可能更容易找到更详尽的词典,或者将现有词典中的每个词映射到常见的扩展名,例如 +"es"
或 word[:-1] + "ies"
。
如果找不到详尽的词典,您可以构建(或下载)概率语言模型,为您生成和评估候选句子。它可以是字符 n-gram 模型或神经网络。
对于您的缩写,您可以构建一个 "noise model" 来预测字符遗漏的概率。它可以从语料库中学习(你必须手动或半手动地标记它)辅音丢失的频率低于元音。
有一个复杂的语言模型和一个简单的噪声模型,您可以使用 噪声通道 方法将它们结合起来(请参阅 the article by Jurafsky 了解更多详细信息),以建议候选人句子。
更新。我对这个问题很感兴趣并实现了这个算法:
- 语言模型(在指环王文本上训练的字符 5-gram)
- 噪声模型(每个符号被缩写的概率)
- 波束搜索算法,用于候选短语建议。
我的解决方案已实施 in this Python notebook。对于训练有素的模型,它具有类似于 noisy_channel('bsktball', language_model, error_model)
的界面,顺便说一句,returns
{'basket ball': 33.5, 'basket bally': 36.0}
。字典值是建议的分数(越低越好)。
对于其他示例,它的效果更差:对于 'wtrbtl' 它 returns
{'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}
然而,当在适当的语料库(例如体育杂志和博客;可能对名词进行过度采样)上进行训练时,并且可能使用更宽的波束搜索宽度,此模型将提供更多相关建议。