Тема: из php в js
Показать сообщение отдельно
Старый 10.05.2010, 13:52     # 3
guffer
Guest
 
Сообщения: n/a

решение

видимо этот форум вымер...

вот решение которое сделал я с помощью гугла. конечно не совершенство но работает

Код:
/////////////-------------вспомогательные функции-----------------------////////////////////

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 />");
		}
	}