Contador de palabras

Hola tengo un problema con el siguiente algoritmo y es que cuando en la
cadena de texto que se le pasa tiene caracteres con tilde se revienta y
no funciona, cual seria la forma de la expresión regular en la cual
pueda procesar palabras con caracteres tildados sea conjunto [áéíóú]

class String
def word_count
frecuencia= Hash.new(0)
downcase.scan(/\w+/){|palabra| frecuencia[palabra]+=1}
return frecuencia
end
end

puts “perro gato perro gato ave”.word_count

Dónde te está fallando?
Yo probé tu ejemplo por consola en una terminal y funcionó
correctamente,
mirá:

class String
def word_count
frecuencia= Hash.new(0)
downcase.scan(/\w+/){|palabra| frecuencia[palabra]+=1}
return frecuencia
end
end
=> nil

?> puts “perro gato perro gato ave”.word_count
gato2perro2ave1
=> nil

puts “perró gató perró gató ave”.word_count
ave1perró2gató2
=> nil

Cuál es la configuración de tu sistema? La codificación de los
caracteres
que usás?
Tengo la sensación que puede ser por eso.
Juan Matías.

2008/1/22 Julio A. [email protected]:

Juan M. wrote:

Dónde te está fallando?
Yo probé tu ejemplo por consola en una terminal y funcionó
correctamente,
mirá:

class String
def word_count
frecuencia= Hash.new(0)
downcase.scan(/\w+/){|palabra| frecuencia[palabra]+=1}
return frecuencia
end
end
=> nil

?> puts “perro gato perro gato ave”.word_count
gato2perro2ave1
=> nil

puts “perró gató perró gató ave”.word_count
ave1perró2gató2

perr2gat2ave1 <-- SALIDA EN MI SISTEMA

#“ESTA ES LA SALIDA QUE ME GENERA EN MI SISTEMA INSERTANDO TU CADENA
COMO SE LA CONFIGURACIÓN DE MI SISTEMA? ACTUALMENTE UTILIZO INSTANT
RAILS 1.7”

COMO PUEDEN VER AL PROCESAR EL CARACTER CON TILDE DEJA DE HACERLO SALTA
AL SIGUIENTE ESPACIO EN BLANCO Y SE DETIENE HASTA QUE ENCUENTRA OTRO
ESPACIO EN BLANCO O CARACTER TILDADO.

Hola Xavier, me uno al hilo porque yo también tengo ese problema.
Lo he probado y esto es lo que me sale:

irb(main):026:0> class String
irb(main):027:1> def word_count
irb(main):028:2> frecuencia= Hash.new(0)
irb(main):029:2> chars.downcase.scan(/\w+/){|palabra|
frecuencia[palabra]+=1}
irb(main):030:2> return frecuencia
irb(main):031:2> end
irb(main):032:1> end
=> nil
irb(main):033:0> puts “perr\303\263 gat\303\263 perr\303\263 gat\303\263
ave”.word_count
NameError: undefined local variable or method chars' for "perr\303\263 gat\303\263 perr\303\263 gat\303\263 ave":String from (irb):29:in word_count’
from (irb):33
from :0

No me funciona el metodo [CHARS]. Pero de todas formas me gustaría saber
como se puede cambiar la configuración para trabajar en UTF-8 también
con
el interprete.
Trabajo en un Mac OS X 10.4.11 Tiger. Aunque cualquier sugerencia de
otro SO
me vale para investigar

Gracias de antemano

saludos

2008/1/22, Xavier N. [email protected]:

On Jan 22, 2008, at 8:48 PM, Julio A. wrote:

Hola tengo un problema con el siguiente algoritmo y es que cuando en
la
cadena de texto que se le pasa tiene caracteres con tilde se
revienta y
no funciona, cual seria la forma de la expresión regular en la cual
pueda procesar palabras con caracteres tildados sea conjunto [áéíóú]

class String
def word_count
frecuencia= Hash.new(0)
downcase.scan(/\w+/){|palabra| frecuencia[palabra]+=1}

El String#downcase de Ruby 1.8 no entiende Unicode, puede que sea por
eso.

A veces los problemas de trabajar sin soporte para UTF-8 pero tener la
cosas en UTF-8 ofrecen sintomas raros porque los bytes quedan mal
formados y salta la liebre por cualquier sitio. Por ejemplo a veces he
visto codigo aparentemente correcto que no compilaba segun Ruby por un
mismatch entre el encoding del fichero y el que se le indicaba a Ruby.

Prueba a poner

chars.downcase.scan …

– fxn

A ver …

http://pastie.caboo.se/142316

El codigo de Xavier con un test. Lo puedes tirar a ver si eso de
funciona.

Un saludo,

Francesc

On Jan 23, 2008, at 10:05 AM, Andrés gutiérrez wrote:

irb(main):031:2> end
No me funciona el metodo [CHARS]. Pero de todas formas me gustaría

def word_count
mismatch entre el encoding del fichero y el que se le indicaba a Ruby.
Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


name. Francesc E. i Martí
voice. +34 678.681.603

On Jan 23, 2008, at 10:05 AM, Andrés gutiérrez wrote:

irb(main):033:0> puts “perr\303\263 gat\303\263 perr\303\263 gat
\303\263 ave”.word_count
NameError: undefined local variable or method chars' for "perr \303\263 gat\303\263 perr\303\263 gat\303\263 ave":String from (irb):29:inword_count’
from (irb):33
from :0

No me funciona el metodo [CHARS].

String#chars es un metodo de Rails, lo mencione sin warning porque en
esta lista asumo Rails si no se dice otra cosa.

BTW que Ruby 1.9 define String#chars y significa otra cosa
completamente distinta (es un iterador sobre los caracteres que
entiende Unicode).

Pero de todas formas me gustaría saber como se puede cambiar la
configuración para trabajar en UTF-8 también con
el interprete.
Trabajo en un Mac OS X 10.4.11 Tiger. Aunque cualquier sugerencia de
otro SO me vale para investigar

Has de mirarte la variable $KCODE, Rails asigna un valor adecuado para
trabajar en UTF-8 por defecto (desde la 1.2).

– fxn

On Jan 23, 2008, at 11:14 AM, Andrés gutiérrez wrote:

La variable $KCODE esta en --> config/environment.rb no?
Esto lo he cambiado poniendo en enviroment $KCODE = ‘u’ . Aunque el
código de arriba me ha funcionado sin ponerlo

Desde la 1.2 $KCODE lo pone Rails para trabajar en UTF-8 por defecto,
no hace falta que configures nada en environment.rb.

puts “perró gató perró gató ave”.word_count
Cuando lo pego en el terminal con la consola de rails encendida o
con la de ruby me lo muestra asi

puts “perr\303\263 gat\303\263 perr\303\263 gat\303\263
ave”.word_count

es porque mi sistema no reconoce UTF-8???

Las pruebas con UTF-8 las suelo hacer siempre con ficheros, porque en
la consola intervienen demasiadas cosas en I/O como para estar seguro
de que no interfiere en las pruebas.

Por ejemplo, en Terminal.app se escribe y lee UTF-8 perfectamente,
pero no puedo entrar UTF-8 bien en irb/console, ni la shell Python,
pero si en la shell Erlang… Tendra que ver con readline quiza y algo
que no tendre bien configurado, algun flag de compilacion…, no lo he
investigado, pero hay una capa ahi intermedia que si no esta 100%
controlada es mejor sencillamente quitar de en medio.

Como script/runner en Rails 2 admite un nombre de fichero como
argumento esta incluso mas sencillo que antes.

Vale esto es lo que pasa en rails CON y SIN el método [CHARS]:

Loading development environment (Rails 2.0.2)

CON CHARS:

class String
def word_count
frecuencia= Hash.new(0)
chars.downcase.scan(/\w+/){|palabra| frecuencia[palabra]+=1}
return frecuencia
end
end
=> nil
puts “perr\303\263 gat\303\263 perr\303\263 gat\303\263 ave”.word_count
ave1perró2gató2

SIN CHARS:

class String
def word_count
frecuencia= Hash.new(0)
downcase.scan(/\w+/){|palabra| frecuencia[palabra]+=1}
return frecuencia
end
end
=> nil
puts “perr\303\263 gat\303\263 perr\303\263 gat\303\263 ave”.word_count
ave1perró2gató2
=> nil

Preguntas:
La variable $KCODE esta en → config/environment.rb no?
Esto lo he cambiado poniendo en enviroment $KCODE = ‘u’ . Aunque el
código
de arriba me ha funcionado sin ponerlo

Mi segunda pregunta es porque lo que copio. ejem:

puts “perró gató perró gató ave”.word_count
Cuando lo pego en el terminal con la consola de rails encendida o con
la
de ruby me lo muestra asi

puts “perr\303\263 gat\303\263 perr\303\263 gat\303\263 ave”.word_count

es porque mi sistema no reconoce UTF-8???

Tercera pregunta (para Francesc) lo que me propones como hay que
hacerlo.
dentro de una App rails o como un archivo independiente?
Si me dieras alguna indicacion te lo agradecería

2008/1/23, Xavier N. [email protected]:

Ok. gracias entendido. Solo una duda ¿donde se tiene que colocar el
archivo
(por ejemplo el que me sugire Francesc en este hilo) para funcionar con
script/runner???

Como script/runner en Rails 2 admite un nombre de fichero como
argumento esta incluso mas sencillo que antes

Gracias por la ayuda

Un saludo

2008/1/23, Xavier N. [email protected]:

El fichero que yo incluí se puede meter en la carpeta “lib”. Alli se
tiene que separar la parte de test de la extensión “string”.

Digamos que tendremos …

lib/string_extensions.rb
lib/test/string_extensions_test.rb

And that’s all … :wink:

Francesc

On Jan 24, 2008, at 9:41 AM, Andrés gutiérrez wrote:

no hace falta que configures nada en environment.rb.
la consola intervienen demasiadas cosas en I/O como para estar seguro
argumento esta incluso mas sencillo que antes.


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


name. Francesc E. i Martí
voice. +34 678.681.603

On Jan 24, 2008, at 9:41 AM, Andrés gutiérrez wrote:

Ok. gracias entendido. Solo una duda ¿donde se tiene que colocar el
archivo (por ejemplo el que me sugire Francesc en este hilo) para
funcionar con
script/runner???

En cualquier lugar del disco, en el caso de script/runner interpreta
el archivo que sea en el contexto de la aplicacion:

 script/runner /path/a/cualquier/script.rb

– fxn

Esto es lo que he hecho (Xabier):
Este el esl archivo ===>string_extensions.rb

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
class String

def word_count
frequency = Hash.new(0)
downcase.scan(/\w+/) { |word| frequency[word] += 1 }
return frequency
end

end

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Este es el error que me da al probarlo:

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
web:~/mi/path/de/mi/app/rails2/miApp yo$ script/runner
/Desktop/string_extensions.rb
/usr/local/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/commands/runner.rb:47:
(eval):1: compile error (SyntaxError)
(eval):1: unknown regexp options - trg
(eval):1: syntax error, unexpected tIDENTIFIER, expecting $end
/Desktop/string_extensions.rb
^ from
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
eval' from /usr/local/lib/ruby/gems/1.8/gems/rails-2.0.2 /lib/commands/runner.rb:47 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in gem_original_require’
from
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
`require’
from script/runner:3

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Esto es lo que me dice cuando tengo el archivo en el escritorio. ¿Qué
estoy
haciendo mal?

Para Francesc:

Lo que tu me has dicho:

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

El fichero que yo incluí se puede meter en la carpeta “lib”. Alli se
tiene que separar la parte de test de la extensión “string”.

Digamos que tendremos …

lib/string_extensions.rb
lib/test/string_extensions_test.rb

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Como lo pruebo una vez que tengo el codigo donde dices???.

NOTA:
Espero que no os moleste que este siguiendo los consejos de los dos a la
vez. Pero creo que
así puedo aprender más cosas nuevas. De hecho creo que tengo el tema
del
UTF-8 mas o menos bien. Pero me gustaría terminar este hilo sabiendo
probarlo como me estaís diciendo

Gracias

2008/1/24, Xavier N. [email protected]:

On Jan 24, 2008, at 11:36 AM, Andrés gutiérrez wrote:

return frequency

web:~/mi/path/de/mi/app/rails2/miApp yo$ script/runner /Desktop/
string_extensions.rb
/usr/local/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/commands/runner.rb:
47: (eval):1: compile error (SyntaxError)
(eval):1: unknown regexp options - trg

Esto esta muy raro, no solo no lo puedo reproducir, sino que no veo de
donde salen esas opciones de regexp “trg”.

No hay nada mas? Puedes ejecutar un script vacio con script/runner? La
consola arranca?

– fxn

script/runner /Desktop/vacio.rb
/usr/local/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/commands/runner.rb:47:
(eval):1: compile error (SyntaxError)
(eval):1: unknown regexp options - vac from
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
eval' from /usr/local/lib/ruby/gems/1.8/gems/rails-2.0.2 /lib/commands/runner.rb:47 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in gem_original_require’
from
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
`require’
from script/runner:3

Es esto lo que me pedías. He creado el archivo “vacio.rb” y lo he
ejecutado.No sé…:frowning:

2008/1/24, Xavier N. [email protected]:

On Jan 24, 2008, at 1:46 PM, Andrés gutiérrez wrote:

custom_require.rb:27:in `require’
from script/runner:3

Es esto lo que me pedías. He creado el archivo “vacio.rb” y lo he
ejecutado.No sé…:frowning:

Jajaja que misterio, y ni siquiera se queja de las mismas opciones de
regexp. Me parece que toca divide and conquer :-).

– fxn

Jajaja que misterio, y ni siquiera se queja de las mismas opciones de
regexp. Me parece que toca divide and conquer :-).

No te sigo, lo siento :frowning:

2008/1/24, Xavier N. [email protected]:

Para testear el “string_extension.rb” has de hacer …

ruby lib/test/string_extension_test.rb

Un saludo,

Francesc

On Jan 24, 2008, at 11:36 AM, Andrés gutiérrez wrote:

return frequency

web:~/mi/path/de/mi/app/rails2/miApp yo$ script/runner /Desktop/
from /usr/local/lib/ruby/site_ruby/1.8/rubygems/

Digamos que tendremos …

el archivo que sea en el contexto de la aplicacion:


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


name. Francesc E. i Martí
voice. +34 678.681.603

En el direcctorio raiz de mi App===> path/raiz/de/mi/App/MiApp ruby
lib/test/string_extension_test.rb

lib/test/string_extensions_test.rb:1: Invalid char \357' in expression lib/test/string_extensions_test.rb:1: Invalid char \273’ in expression
lib/test/string_extensions_test.rb:1: Invalid char \277' in expression lib/test/string_extensions_test.rb:1: Invalid char \342’ in expression
lib/test/string_extensions_test.rb:1: Invalid char \200' in expression lib/test/string_extensions_test.rb:1: Invalid char \250’ in expression
lib/test/string_extensions_test.rb:1: Invalid char \342' in expression lib/test/string_extensions_test.rb:1: Invalid char \200’ in expression
lib/test/string_extensions_test.rb:1: Invalid char `\250’ in expression
lib/test/string_extensions_test.rb:1: syntax error, unexpected kCLASS,
expecting $end

require ‘test/unit’

class TestString < Test::Unit::TestCase

def test_word_count
sample = “perró gato perro perro gato ave”
sample_result = {“gato” => 2, “perró” => 2, “ave” => 1 }
assert_equal sample.word_count, sample_result
end

end

Esto es lo que me suelta. Cómo lo ves?

El día 24/01/08, Francesc E. [email protected]
escribió:

Pero funciona (No String_extensions.rb). Quiero decir lo he hecho de la
forma correcta. Aunque
String_extensions.rb este mal???

De todas formas aqui tienes los codigos que estoy usando

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
String_extensions.rb
class String

def word_count
frequency = Hash.new(0)
downcase.scan(/\w+/) { |word| frequency[word] += 1 }
return frequency
end

end
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
String_extensions_test.rb
require ‘test/unit’

class TestString < Test::Unit::TestCase

def test_word_count
sample = “perro gato perro gato ave”
sample_result = {“gato” => 2, “perro” => 2, “ave” => 1 }
assert_equal sample.word_count, sample_result
end

end
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Saludos

El día 24/01/08, Francesc E. [email protected]
escribió: