IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   из php в js (http://www.imho.ws/showthread.php?t=143658)

guffer 09.05.2010 20:42

из 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']));
    } 


guffer 10.05.2010 11:54

почти реализовал сам, единственное нужен аналог функции array_intersect
подскажите как его реализовать.

guffer 10.05.2010 13:52

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

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

Код:

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

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


EvroStandart 10.05.2010 14:47

Молодец.

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


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

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