imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование
Опции темы
Старый 09.05.2010, 20:42     # 1
guffer
Guest
 
Сообщения: n/a

из php в js

Здравствуйте. мне нужно реализовать метод шинглов на javascript. в поисковиках находил только php и питоне. помогите конвертировать код из php в js. в долгу не останусь.

PHP код:
    function get_shingle($text,$n=3) {
        
$shingles = array();
        
$text clean_text($text);
        
$elements explode(" ",$text);
        for (
$i=0;$i<(count($elements)-$n+1);$i++) {
            
$shingle '';
            for (
$j=0;$j<$n;$j++){
                
$shingle .= mb_strtolower(trim($elements[$i+$j]), 'UTF-8')." ";
            }
            if(
strlen(trim($shingle)))
                
$shingles[$i] = trim($shingle' -');
        }
        return 
$shingles;    
    }
    
    function 
clean_text($text) {
        
$new_text eregi_replace("[\,|\.|\'|\"|\\|\/]","",$text);
        
$new_text eregi_replace("[\n|\t]"," ",$new_text);
        
$new_text preg_replace('/(\s\s+)/'' 'trim($new_text));
        return 
$new_text;
    }
    
    function 
check_it($first$second) {
        if (!
$first || !$second) {
            echo 
"Отсутствуют оба или один из текстов!";
            return 
0;
        }
        
        for (
$i=1;$i<5;$i++) {
            
$first_shingles array_unique(get_shingle($first,$i));
            
$second_shingles array_unique(get_shingle($second,$i));
        
            if(
count($first_shingles) < $i-|| count($second_shingles) < $i-1) {
                echo 
"Количество слов в тексте меньше чем длинна шинглы<br />";
                continue;
            }
            
            
$intersect array_intersect($first_shingles,$second_shingles);
            
            
$merge array_unique(array_merge($first_shingles,$second_shingles));
            
               
$diff = (count($intersect)/count($merge))/0.01;
            
            echo 
"Количество слов в шингле - $i. Процент схожести - ".round($diff2)."%<br />";
        }
    }

    if (isset(
$_POST['text1']) && isset($_POST['text2'])) {
        
check_it(strip_tags($_POST['text1']), strip_tags($_POST['text2']));
    } 
 
Старый 10.05.2010, 11:54     # 2
guffer
Guest
 
Сообщения: n/a

почти реализовал сам, единственное нужен аналог функции array_intersect
подскажите как его реализовать.
 
Старый 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 />");
		}
	}
 
Старый 10.05.2010, 14:47     # 4
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
Молодец.

Далеко не у всех есть куча свободного времени чтобы заняться этим чисто из спортивного интереса.
EvroStandart вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 18:30.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.