2016-11-11 3 views
0

У меня есть набор строк, и мне нужно неясно найти, включена ли одна из этих строк в предложение. И если это так, мне нужна позиция подстроки в предложении. Например:Javascript: Fuzzily найти подстроку в строке

var input = "how was the whether in Londom last night?"; var set = ["london uk", "paris"]; fuzzyFind(input, set); // return something like {score: xxx, found: "london uk", start: 23, end: 29}

http://fusejs.io/ может сделать что-то вроде этого, кажется, но если я не пропустил это не будет сказать мне, где во входной строке подстроку была расположена.

Есть ли существующая библиотека для этого (она будет использоваться в узле)?

+0

https: // WWW .npmjs.com/package/bitap – smcd

+0

Спасибо @smcd. К сожалению, похоже, я не делаю то, что мне нужно. Например, он не возвращает индексы, между которыми найденная строка находилась во входном тексте. – PJC

ответ

-1

Убедитесь, что установлен параметр include: ["matches"].

Редактировать: Это должно быть include: ["score","matches"], а затем в результатах каждого результата объекта будут иметься «соответствия» и «оценка». И матчи будут списком «индексов» для каждого элемента с начальной и конечной позицией для каждого матча.

Кроме того, ответ, который я написал, прежде чем я заметил, что эти варианты были в fuse.js была версия функции partial_ratio из fuzzball.js (мой fuzzywuzzy порт) вместе с difflib изменениями, включающими наиболее подходящий подстроку более длинную строку и ее начальную/конечную позицию вместе со счетом/коэффициентом.

А так как на втором смотрите мой первый ответ не совсем то, что вы искали, и downvoted в любом случае, и я уже написано, вот это тоже :)

var difflib = require('difflib'); 

var input = "how was the whether in Londom last night?"; 
var set = ["london uk", "paris"]; 
console.log(topSubString(input, set)); 

/* 
[score, best matching substring, start, stop] 

[ [ 0.5555555555555556, 'Londom la', 23, 32 ], 
    [ 0.4, 'was t', 4, 9 ] ] 
*/ 

function topSubString(input, set) { 
    results = []; 
    for (var s in set) { 
     results.push(partial_ratio(input, set[s])); 
    } 
    results.sort(function (a, b) { return b[0] - a[0] })[0]; 
    return results; 
} 
function partial_ratio(str1, str2, options) { 

    if (str1.length <= str2.length) { 
     var shorter = str1 
     var longer = str2 
    } 
    else { 
     var shorter = str2 
     var longer = str1 
    } 
    var bestMatch; 
    var m = new difflib.SequenceMatcher(null, shorter, longer); 
    var blocks = m.getMatchingBlocks(); 
    var scores = []; 
    for (var b = 0; b < blocks.length; b++) { 
     var long_start = (blocks[b][1] - blocks[b][0]) > 0 ? (blocks[b][1] - blocks[b][0]) : 0; 
     var long_end = long_start + shorter.length; 
     var long_substr = longer.substring(long_start, long_end); 
     var ssm = new difflib.SequenceMatcher(null, shorter, long_substr); 
     var r = ssm.ratio(shorter, long_substr, options); 
     if (r > 99.5) { bestMatch = [r, long_substr, long_start, long_end]; break; } 
     else scores.push([r, long_substr, long_start, long_end]); 
    } 
    if (!bestMatch) bestMatch = scores.sort(function(a,b){ return b[0] - a[0] })[0]; 
    return bestMatch; 
} 
Смежные вопросы