2012-04-09 11 views
10

He estado usando el Ruby Classifier library en classify privacy policies. Llegué a la conclusión de que el simple enfoque de bolsa de palabras incorporado en esta biblioteca no es suficiente. Para aumentar la precisión de mi clasificación, quiero entrenar al clasificador en n-gramas además de las palabras individuales.Training Naive Clasificador Bayes en los ngulos

Me preguntaba si hay una biblioteca para preprocesar documentos para obtener n-gramas relevantes (y lidiar adecuadamente con los signos de puntuación). Un pensamiento fue que pude preprocesar los documentos y alimentos pseudo-N-gramas en el Rubí clasificador como:

wordone_wordtwo_wordthree

O tal vez hay una mejor manera de estar haciendo esto, como una biblioteca que tiene ngram basado Naive Bayes Clasificación incorporada desde el getgo. Estoy abierto a utilizar idiomas que no sean Ruby aquí si hacen el trabajo (Python parece ser un buen candidato si es necesario).

Respuesta

11

Si está de acuerdo con Python, yo diría que nltk sería perfecto para usted.

Por ejemplo:

>>> import nltk 
>>> s = "This is some sample data. Nltk will use the words in this string to make ngrams. I hope that this is useful.".split() 
>>> model = nltk.NgramModel(2, s) 
>>> model._ngrams 
set([('to', 'make'), ('sample', 'data.'), ('the', 'words'), ('will', 'use'), ('some', 'sample'), ('', 'This'), ('use', 'the'), ('make', 'ngrams.'), ('ngrams.', 'I'), ('hope', 'that' 
), ('is', 'some'), ('is', 'useful.'), ('I', 'hope'), ('this', 'string'), ('Nltk', 'will'), ('words', 'in'), ('this', 'is'), ('data.', 'Nltk'), ('that', 'this'), ('string', 'to'), (' 
in', 'this'), ('This', 'is')]) 

Incluso tiene un método nltk.NaiveBayesClassifier

+0

gran respuesta +1 – Yavar

+3

NLTK parece increíble en muchos aspectos en comparación con lo que Ruby tiene para ofrecer. Python gana, ¡gracias! – babonk

+0

@babonk mi placer. He encontrado que nltk es un placer de usar e increíblemente poderoso, espero que te diviertas con él: D –

3
>> s = "She sells sea shells by the sea shore" 
=> "She sells sea shells by the sea shore" 
>> s.split(/ /).each_cons(2).to_a.map {|x,y| x + ' ' + y} 
=> ["She sells", "sells sea", "sea shells", "shells by", "by the", "the sea", "sea shore"] 

enumerables de Ruby tienen un método llamado enum_cons que devolverán cada uno de n elementos consecutivos de la enumerable. Con ese método, generar ngrams es un simple trazador de líneas.

+0

Thx. Tuve que usar 'each_cons' en lugar de' enum_cons'. – Dru

+0

Dru: Parece que enum_cons ha quedado en desuso. Lo reemplacé con each_cons en mi respuesta. ¡Gracias! –

Cuestiones relacionadas