видимо этот форум вымер...
вот решение которое сделал я с помощью гугла. конечно не совершенство но работает
Код:
/////////////-------------вспомогательные функции-----------------------////////////////////
function count( mixed_var, mode ) { // выводит количество элементов в массиве или количество свойств у пбъекта
var key, cnt = 0;
if( mode == 'COUNT_RECURSIVE' ) mode = 1;
if( mode != 1 ) mode = 0;
for (key in mixed_var){
cnt++;
if( mode==1 && mixed_var[key] && (mixed_var[key].constructor === Array || mixed_var[key].constructor === Object) ){
cnt += count(mixed_var[key], 1);
}
}
return cnt;
}
function explode( delimiter, string ) { // разбиение строк
var emptyArray = { 0: '' };
if ( arguments.length != 2
|| typeof arguments[0] == 'undefined'
|| typeof arguments[1] == 'undefined' )
{
return null;
}
if ( delimiter === ''
|| delimiter === false
|| delimiter === null )
{
return false;
}
if ( typeof delimiter == 'function'
|| typeof delimiter == 'object'
|| typeof string == 'function'
|| typeof string == 'object' )
{
return emptyArray;
}
if ( delimiter === true ) {
delimiter = '1';
}
return string.toString().split ( delimiter.toString() );
}
function in_array(needle, haystack, strict) { // Checks if a value exists in an array
//
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
var found = false, key, strict = !!strict;
for (key in haystack) {
if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
found = true;
break;
}
}
return found;
}
function array_unique(arr) {
var tmp_arr = new Array();
for (i = 0; i < arr.length; i++) {
if (!in_array(arr[i],tmp_arr) ) {
tmp_arr.push(arr[i]);
}
}
return tmp_arr;
}
function array_intersect () {
// пересечение массивов
var arr1 = arguments[0], retArr = {};
var k1 = '', arr = {}, i = 0, k = '';
arr1keys:
for (k1 in arr1) {
arrs:
for (i=1; i < arguments.length; i++) { arr = arguments[i];
for (k in arr) {
if (arr[k] === arr1[k1]) {
if (i === arguments.length-1) {
retArr[k1] = arr1[k1]; }
continue arrs;
}
}
continue arr1keys;
}
}
return retArr;
}
function trim ( str, charlist ) {
charlist = !charlist ? ' \s\xA0' : charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
var re = new RegExp('^[' + charlist + ']+|[' + charlist + ']+$', 'g');
return str.replace(re, '');
}
function array_merge () {
var args = Array.prototype.slice.call(arguments),
retObj = {}, k, j = 0, i = 0, retArr = true;
for (i=0; i < args.length; i++) {
if (!(args[i] instanceof Array)) {
retArr=false;
break; }
}
if (retArr) {
retArr = []; for (i=0; i < args.length; i++) {
retArr = retArr.concat(args[i]);
}
return retArr;
} var ct = 0;
for (i=0, ct=0; i < args.length; i++) {
if (args[i] instanceof Array) {
for (j=0; j < args[i].length; j++) { retObj[ct++] = args[i][j];
}
} else {
for (k in args[i]) {
if (args[i].hasOwnProperty(k)) { if (parseInt(k, 10)+'' === k) {
retObj[ct++] = args[i][k];
} else {
retObj[k] = args[i][k];
} }
}
}
}
return retObj;}
function strlen( string ){return string.length;}
//-----------------------------------------------------------------//
// шинглы //
function get_shingle(text, n) {
n=3;
var shingles = new Array();
text = clean_text(text);
var elements = explode(" ", text);
for ( i=0; i<(count( elements) - n+1); i++) {
var shingle = '';
for ( j=0; j<n; j++){
shingle += trim( elements[ i + j]).toLowerCase() + " ";
}
if(strlen(trim(shingle)))
shingles[i] = trim(shingle, ' -');
}
return shingles;
}
function clean_text(text) {
var new_text = text;
new_text = new_text.replace(/\,/g, ''); new_text = new_text.replace(/!/g, '');
new_text = new_text.replace(/@/g, ''); new_text = new_text.replace(/#/g, '');
new_text = new_text.replace(/№/g, ''); new_text = new_text.replace(/\"/g, '');
new_text = new_text.replace(/\;/g, ''); new_text = new_text.replace(/\$/g, '');
new_text = new_text.replace(/\%/g, ''); new_text = new_text.replace(/\:/g, '');
new_text = new_text.replace(/\^/g, ''); new_text = new_text.replace(/\&/g, '');
new_text = new_text.replace(/\?/g, ''); new_text = new_text.replace(/\*/g, '');
new_text = new_text.replace(/\(/g, ''); new_text = new_text.replace(/\)/g, '');
new_text = new_text.replace(/\-/g, ''); new_text = new_text.replace(/\_/g, '');
new_text = new_text.replace(/\=/g, ''); new_text = new_text.replace(/\+/g, '');
new_text = new_text.replace(/\//g, ''); new_text = new_text.replace(/\`/g, '');
new_text = new_text.replace(/\~/g, ''); new_text = new_text.replace(/\{/g, '');
new_text = new_text.replace(/\}/g, ''); new_text = new_text.replace(/\[/g, '');
new_text = new_text.replace(/\]/g, ''); new_text = new_text.replace(/\\/g, '');
new_text = new_text.replace(/\|/g, ''); new_text = new_text.replace(/\'/g, '');
new_text = new_text.replace(/\</g, ''); new_text = new_text.replace(/\>/g, '');
return new_text;
}
function check_it(first, second) {
if (!first || !second) {
alert( "Отсутствуют оба или один из текстов!");
return 0;
}
for ( i=1; i<5; i++) {
var first_shingles = array_unique(get_shingle(first, i));
var second_shingles = array_unique(get_shingle(second, i));
if(count( first_shingles) < i-1 || count(second_shingles) < i-1) {
alert("Количество слов в тексте меньше чем длинна шинглы");
continue;
}
var intersect = array_intersect(first_shingles, second_shingles);
var merge = array_unique(array_merge( first_shingles, second_shingles));
var diff = (count( intersect)/count( merge))/0.01;
alert( "Количество слов в шингле - "+i+". Процент схожести - " + diff + "%<br />");
}
}