imho.ws |
![]() |
![]() |
![]() |
# 1 |
Guest
Сообщения: n/a
|
из php в js
Здравствуйте. мне нужно реализовать метод шинглов на javascript. в поисковиках находил только php и питоне. помогите конвертировать код из php в js. в долгу не останусь.
PHP код:
|
![]() |
# 3 |
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 />"); } } |