2012-04-09 3 views
10

J'ai utilisé le Ruby Classifier library pour classify privacy policies. J'en suis venu à la conclusion que l'approche simple du sac-de-mots intégrée dans cette bibliothèque n'est pas suffisante. Pour augmenter ma précision de classification, je veux former le classificateur sur n-grammes en plus des mots individuels. Je me demandais s'il existait une bibliothèque pour le prétraitement des documents afin d'obtenir des n-grammes pertinents (et traiter correctement la ponctuation). Une pensée était que je pouvais prétraiter les documents et aliments pseudo-ngrams dans le Ruby classificateur comme:Formation Naive Bayes Classifier sur ngrams

wordone_wordtwo_wordthree

Ou peut-être il y a une meilleure façon de faire cela, comme une bibliothèque qui a Négame basé Naive Bayes Classification construit dans le getgo. Je suis ouvert à l'utilisation de langues autres que Ruby ici si elles font le travail (Python semble être un bon candidat si besoin est).

Répondre

11

Si vous êtes d'accord avec python, je dirais nltk serait parfait pour vous.

Par exemple:

>>> 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')]) 

Vous avez même une méthode nltk.NaiveBayesClassifier

+0

bonne réponse +1 – Yavar

+3

NLTK semble incroyable à bien des égards par rapport à ce que Ruby a à offrir. Python gagne, merci! – babonk

+0

@babonk mon plaisir. J'ai trouvé que nltk est un plaisir à utiliser et incroyablement puissant, j'espère que vous vous amuserez avec: 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"] 

Ruby enumerables ont une méthode appelée enum_cons qui renvoie chacun de n éléments consécutifs du dénombrable. Avec cette méthode générant ngrams est un simple doublure.

+0

Thx. A dû utiliser 'each_cons' au lieu de' enum_cons'. – Dru

+0

Dru: On dirait que enum_cons a été déprécié. Remplacé par each_cons dans ma réponse. Merci! –

Questions connexes