Lar*_*s D 15 algorithm text dictionary
我们有一个大约150,000个单词的列表,当用户输入自由文本时,系统应该显示字典中的单词列表,这些单词与自由文本中的单词非常接近.
例如,用户输入:"我想在沃尔玛购买legoe玩具".如果字典包含"乐高","汽车"和"沃尔玛",系统应在列表中显示"乐高"和"沃尔玛"."沃尔玛"是显而易见的,因为它与句子中的单词相同,但"乐高"与"乐高"相似,也被提及.但是,没有什么与"Car"相似,所以没有显示单词.
显示列表应该是实时的,这意味着当用户输入句子时,屏幕上必须出现单词列表.有人知道一个很好的算法吗?
字典实际上包含可能包含空格的概念.例如,"乐高太空飞船".完美的解决方案也能识别这些多字概念.
任何建议表示赞赏.
您将针对固定字典进行相当多的单词查找.因此,您需要准备字典.从逻辑上讲,您可以快速消除"太不同"的候选人.
例如,单词car
和dissimilar
可能共享一个后缀,但它们显然不是彼此的拼写错误.现在为什么对我们人类如此明显?对于初学者来说,长度完全不同.这是一次立即取消资格(但有一个例外 - 下面).因此,您的字典应按字长排序.将输入单词与类似长度的单词匹配.对于简短的单词,这意味着+/- 1个字符; 更长的单词应该有更高的余量(你的人口统计拼写的确切程度如何?)
一旦你将自己局限于相似长度的候选词,你就会想要删除完全不同的词.有了这个,我的意思是他们使用完全不同的字母.如果按字母顺序对单词中的字母进行排序,这是最容易比较的.例如car
变成"acr"
; rack
成为"ackr"
.您将在预处理字典和每个输入字时执行此操作.原因是确定两个有序集的差异(大小)很便宜.(如果需要解释,请添加评论).car
并rack
具有尺寸1的差异,car
并hat
有大小2的差异这缩小了你的候选集更进一步.请注意,对于较长的单词,当您发现太多差异时,可以提前纾困.例如dissimilar
,biography
总差异为13,但考虑到长度(8/9),一旦找到5个差异,你可能会纾困.
这将为您留下一组使用几乎相同字母的候选词,并且长度几乎相同.此时,您可以开始使用更精确的算法; 你不需要再为每个输入单词运行150,000次比较.
现在,对于前面提到的长度异常:问题在于"单词"之类的greencar
.它与长度为8的单词并不完全匹配,但对于人类而言,它的意义非常明显.在这种情况下,你不能真正打破任何随机边界的输入词,并对两半运行额外的N-1不精确匹配.但是,检查缺少的空间是可行的.只需查找所有可能的前缀即可.这是有效的,因为你将要使用的字典的相同部分遍地,例如g
gr
,gre
,gree
等对于每一个你发现前缀,检查剩余suffixis也在dictionery,例如reencar
,eencar
.如果输入单词的两半都在字典中,但单词本身不是,则可以假设缺少空格.
归档时间: |
|
查看次数: |
12597 次 |
最近记录: |