Biblioteca node.js para extraer palabras de un texto -- javascript campo con parsing campo con node.js campo con unicode camp codereview Relacionados El problema

node.js library for extracting words from a text


0
vote

problema

Español

Estoy buscando comentarios en mi biblioteca para extraer palabras de un texto: https://npmjs.org/ Paquete / UWORMS

La palabra extraída se define como secuencia de caracteres Unicode de LU, LL, LT, LM, LO Grupos. Así que el código de la parte principal es ( https://github.com/ Alexatnet / Uwords / Blob / Master / index.js # L9 ):

  module.exports = function (text) {     var words, word, index, limit, code;      words = [ ];     word = null;      for (index = 0, limit = text.length; index < limit; index += 1) {         code = text.charCodeAt(index);         if (-1 === _.indexOf(letters, code, true)) {             if (null !== word) {                 words.push(word.join(''));                 word = null;             }         } else {             if (null === word) {                 word = [ ];             }             word.push(String.fromCharCode(code));         }     }      if (null !== word) {         words.push(word.join(''));     }      return words; };   

y la matriz letters se creó de la siguiente manera ( https://github.com/alexatnet/uwords/blob/master/gruntfile.js#l59 ):

      grunt.registerTask('create-letters-json', 'letters.json', function () {         var letters, compacted;          letters = [             require('unicode/category/Lu'),             require('unicode/category/Ll'),             require('unicode/category/Lt'),             require('unicode/category/Lm'),             require('unicode/category/Lo')         ].reduce(function (list, item) {             list.push.apply(list, Object.keys(item).map(function (value) {                 return parseInt(value, 10);             }));             return list;         }, [ ]).sort(function (a, b) { return a - b; });          compacted = (function (list) {             var result, item, idx, value;              result = [ ];              item = { begin : list[0], end : list[0] };             result.push(item);              for (idx = 1; idx < list.length; idx += 1) {                 value = list[idx];                 if (item.end + 1 === value) {                     item.end = value;                 } else {                     item = { begin : list[idx], end : list[idx] };                     result.push(item);                 }             }              for (idx = 0; idx < result.length; idx += 1) {                 item = result[idx];                 if (item.begin === item.end) {                     result[idx] = item.begin;                 } else {                     result[idx] = [ item.begin, item.end ];                 }             }              return result;         }(letters));          require('fs').writeFileSync(__dirname + '/letters.json',             JSON.stringify(compacted, null, 2));     });   

Es un enfoque bastante ingenuo, pero creo que funcionará en la mayoría de los casos. ¿Qué piensas?

Original en ingles

I'm looking for feedback on my library for extracting words from a text: https://npmjs.org/package/uwords

The extracted word is defined as sequence of Unicode characters from Lu, Ll, Lt, Lm, Lo groups. So the code of the main part is (https://github.com/AlexAtNet/uwords/blob/master/index.js#L9):

module.exports = function (text) {     var words, word, index, limit, code;      words = [ ];     word = null;      for (index = 0, limit = text.length; index < limit; index += 1) {         code = text.charCodeAt(index);         if (-1 === _.indexOf(letters, code, true)) {             if (null !== word) {                 words.push(word.join(''));                 word = null;             }         } else {             if (null === word) {                 word = [ ];             }             word.push(String.fromCharCode(code));         }     }      if (null !== word) {         words.push(word.join(''));     }      return words; }; 

and the array letters was created as follows (https://github.com/AlexAtNet/uwords/blob/master/gruntfile.js#L59):

    grunt.registerTask('create-letters-json', 'letters.json', function () {         var letters, compacted;          letters = [             require('unicode/category/Lu'),             require('unicode/category/Ll'),             require('unicode/category/Lt'),             require('unicode/category/Lm'),             require('unicode/category/Lo')         ].reduce(function (list, item) {             list.push.apply(list, Object.keys(item).map(function (value) {                 return parseInt(value, 10);             }));             return list;         }, [ ]).sort(function (a, b) { return a - b; });          compacted = (function (list) {             var result, item, idx, value;              result = [ ];              item = { begin : list[0], end : list[0] };             result.push(item);              for (idx = 1; idx < list.length; idx += 1) {                 value = list[idx];                 if (item.end + 1 === value) {                     item.end = value;                 } else {                     item = { begin : list[idx], end : list[idx] };                     result.push(item);                 }             }              for (idx = 0; idx < result.length; idx += 1) {                 item = result[idx];                 if (item.begin === item.end) {                     result[idx] = item.begin;                 } else {                     result[idx] = [ item.begin, item.end ];                 }             }              return result;         }(letters));          require('fs').writeFileSync(__dirname + '/letters.json',             JSON.stringify(compacted, null, 2));     }); 

It is quite naive approach but I think that it will work in most of the cases. What do you think?

           
   
   

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

La parte superior se ve limpia, personalmente, lo haría

  • No se compare con null Todo el tiempo, simplemente compruebe word.length y ten 9988776655544337 sea una matriz en todo momento.
  • no inicializar word y words por separado
  • NO USE branches0 , yo usaría branches1 en lugar
  • Yo usaría el operador branches2 en lugar de comparar con branches3
  • primero me ocuparía de encontrar una coincidencia, y luego sin encontrar una coincidencia (cambiar el branches4 bloques en otras palabras), mi mente tenía que hacer una doble toma cuando estaba leyendo tu código
  • Si agregaría un espacio al final de branches5 , para que no necesite la última declaración de IF

Todo lo que me daría algo así:

  branches6  

Finalmente, creo que recopilar códigos de caracteres en el 2º script, luego tomar caracteres, convertirlos a los códigos de caracteres y luego usar los caracteres nuevamente, podría no ser el mejor enfoque.

Personalmente, lo haría branches7 Sé un objeto donde cada letra (no el código de caracteres) sería una propiedad del objeto establecido en VERDADERO. No más conversiones de códigos de caracteres, y lo más probable es que supere la tabla de búsqueda ordenada. (Para ser probado ...)

 

The top part looks clean, personally I would

  • Not compare with null all the time, just check word.length and have word be an array at all times.
  • Not initialize word and words separately
  • Not use String.fromCharCode(code), I would use text[index] instead
  • I would use the ~ operator instead of comparing to -1
  • I would first deal with finding a match , and then with not finding a match ( switch the if blocks in other words ), my mind had to do a double take when I was reading your code
  • if would add a space to the end of text, so that I would not need the last if statement

All that would give me something like:

module.exports = function (text){  text += " ";     var words = [],       word  = [],       limit = text.length, code, index;      for (index = 0; index < limit; index += 1) {         code = text.charCodeAt(index);         if (~_.indexOf(letters, code, true)) {           word.push( text[index] )         } else {           if (word.length) {             words.push(word.join(''));             word = [];           }         }     }     return words; }; 

Finally, I think collecting char-codes in the 2nd script, then taking chars, converting those to char-codes and then use the chars again might not be the best approach.

Personally, I would letters be an object where each letter ( not the char-code ) would be a property of the object set to true. No more char-code conversions, and most likely it would beat the sorted lookup table. ( To be tested.. )

 
 
   
   
0
 
vote

No he usado Nodo JS. Sin embargo, me pregunto si podría simplemente usar la cadena Reemplazar? Por ejemplo,

  branches8  

La salida sería la siguiente.

  branches9  
 

I have not used node js. However, I wonder if you could simply use string replace? For example,

v = 'I was walking down the park on day. I was running down the block' j = message.replace(/was/g, '') 

The output would be the following.

'I  walking down the park one day. I  here' 
 
 
 
 

Relacionados problema

5  biblioteca isrtl.coffee para determinar si un texto es de dirección derecha a izquierda  ( Isrtl coffee library to determine if a text is of right to left direction ) 
Acabo de escribir esta pequeña biblioteca llamada isrtl.coffee para determinar la dirección del texto. ¿Hay alguna mejor manera de hacer esto? window.ori...

5  Convertir una mezcla de Latín 1 y UTF-8 a UTF-8 adecuado  ( Convert a mix of latin 1 and utf 8 to proper utf 8 ) 
El siguiente programa toma una secuencia byte arbitraria como entrada y salidas UTF-8 bien formadas. Todas las secuencias UTF-8 de la entrada se copian sin mo...

8  Dir = "AUTO" JavaScript Shim para IE  ( Dir auto javascript shim for ie ) 
motivo de guión: dir="auto" es un valor de atributo de la especificación HTML 5 con el soporte deficiente actual en IE y los navegadores de la Ópera . E...

3  Crea una URL agradable con eliminación de diactrices  ( Create nice url with diactrics removal ) 
Por favor revise mi clase. Utiliza GET9 (Probablemente no sea la mejor solución, sin embargo, no haya encontrado una mejor alternativa para cambiar caracter...

3  Análisis de cadenas con múltiples delimentadores  ( String parsing with multiple delimeters ) 
Mis datos están en este formato: 龍舟 龙舟 [long2 zhou1] / dragón barco / barco imperial / n y quiero devolver: FUNCTION funcCombSort RETURNS CHARACTER ...

8  Nivel de código fuente Portátil C ++ Unicode Literales  ( Source code level portable c unicode literals ) 
Windows Console Windows Lamentablemente no es compatible con Stream E / S de caracteres internacionales. Por ejemplo, en Windows 7, aún puede hacer "CHCP 6500...

12  Copie los directorios mientras cambia los nombres de archivos de Unicode a ASCII  ( Copy directories while changing unicode filenames to ascii ) 
He creado un script corto de perl 6 copyfnameascii.pl3 Para copiar una jerarquía de archivos que tengo, aplicando una decodificación de URL a los nombres de...

7  Cadena de JavaScript a Unicode (Hex)  ( Javascript string to unicode hex ) 
Este conjunto de preguntas está relacionado con un proyecto que he publicado para convertir caracteres, o cuerdas, a unicode basado en hex; por ejemplo ... ...

3  Eliminar texto dentro de los soportes [cerrado]  ( Removing text inside brackets ) 
cerrado . Esta pregunta necesita detalles o claridad . Actualmente no está aceptando respuestas. ...

3  ¿Simplificar la expresión regular? (Conversión de Fracciones Unicode a Tex)  ( Simplify regular expression converting unicode fractions to tex ) 
Fondo Estoy convirtiendo el texto Unicode a tex para tipingetting. En la entrada, estoy permitiendo fracciones simples como ½ y ⅔ usando caracteres únic...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos