JS/Jquery:字符串到单词的文本分割脚本使用字典和最长匹配
JS/Jquery: string to words text-segmentation script using dictionary and longest match?
给定一个字符串,例如:
var str = "thisisinsane";
由字典中的单词列表辅助,例如:
var dic = [ "insane", "i", "is", "sin", "in", "this", "totally" ];
如何将str
拆分为单词
对于这个字符串,有3个单词需要识别。但我们需要避免这些陷阱。为了在大多数时候避开它们,我知道我们可以从左边攻击这个句子,并试图找到最长的单词。当被发现时,我们可以攻击字符串的其余部分等。
下面是右下角的输入、可能的陷阱和想要的输出。
thisisinsane
|
|
(this)isinsane
/ '
/ '
(this,i)sinsane (this,is)insane
/ / '
/ / '
(this,i,sin)ane (this,is,in)sane (this,is,insane)
/ <BEST IS>
/ <THIS ONE>
(this,is,in,sane)
最后,我们想要得到:
var splited = ["this", "is", "insane"];
这是一个快速实现,它将从左到右进行搜索,并首先匹配字典中最长的单词(jsfiddle)。然而,我不太确定自己实现这一点是否明智,因为这听起来像是一个复杂的领域,即使在没有任何相关知识的情况下,我也可以看出这种算法一开始就有缺陷。如果有现有的库的话,你可能会更好地查找它们。
不用说,这只是打字很快。它没有以任何方式针对性能进行优化(它使用递归,这实际上根本没有必要),也没有经过广泛的测试。不过,它适用于您的示例数据,以及我测试的一些变体。我喜欢把一些工作留给OP,以防我给出完整的代码示例,所以如果你想使用它,请随时改进。
var splitByDictionary = function (input, dictionary) {
"use strict";
// make sure we're going to look for longest-possible matches first
dictionary.sort( function (a, b) {
return b.length - a.length;
} );
var foundWords = [],
remaining = input;
var result = (function match () {
if( remaining.length === 0 ) {
return true;
}
for( var i = 0; i < dictionary.length; i++ ) {
if( remaining.substr( 0, dictionary[i].length ) === dictionary[i] ) {
foundWords.push( dictionary[i] );
remaining = remaining.substr( dictionary[i].length );
return match();
}
}
return false;
})();
return result ? foundWords : null;
};
var splitted = splitByDictionary( "thisisinsane", ["insane", "i", "is", "sin", "in", "this", "totally"] );
console.log( splitted ); // ["this", "is", "insane"]
相关文章:
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- javascript结合了数组和字典
- 借助asp.net验证或java脚本对多个文本进行验证
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- Java脚本时间添加
- 不显示带有本地json文件数据的谷歌地图脚本
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 从远程脚本获取用户IP
- 如何根据时间运行不同的脚本
- 如何将字符串值从php页面发送到java脚本页面
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- 当脚本由system.js加载时,如何要求('electron')
- HTML标记在脚本标记中工作
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- JS/Jquery:字符串到单词的文本分割脚本使用字典和最长匹配
- 有没有办法在应用程序脚本中使用JavaScript为对象创建方法字典
- Alfresco当我调用trigger.js时,位于Repository>数据字典>脚本>trigge
- 如何在java脚本中实现字典
- Javascript在大字典中循环生成无响应的脚本