Si vous n'avez pas de problème à utiliser une bibliothèque extérieure, je vous recommande scikit-learn puisqu'il peut probablement faire cela mieux et plus rapidement que tout ce que vous pourriez coder par vous-même. Je ferais juste quelque chose comme ça :
Construisez votre corpus. J'ai fait les compréhensions de liste pour la clarté, mais selon la façon dont vos données sont stockées, vous pourriez avoir besoin de faire des choses différentes :
def corpus_builder(apple_inc_tweets, apple_fruit_tweets):
corpus = [tweet for tweet in apple_inc_tweets] + [tweet for tweet in apple_fruit_tweets]
labels = [1 for x in xrange(len(apple_inc_tweets))] + [0 for x in xrange(len(apple_fruit_tweets))]
return (corpus, labels)
L'important est que vous vous retrouviez avec deux listes qui ressemblent à ceci :
([['apple inc tweet i love ios and iphones'], ['apple iphones are great'], ['apple fruit tweet i love pie'], ['apple pie is great']], [1, 1, 0, 0])
Les [1, 1, 0, 0] représentent les étiquettes positives et négatives.
Ensuite, vous créez une Pipeline ! Pipeline est une classe scikit-learn qui facilite le chaînage des étapes de traitement de texte afin de n'avoir à appeler qu'un seul objet lors de la formation/prédiction :
def train(corpus, labels)
pipe = Pipeline([('vect', CountVectorizer(ngram_range=(1, 3), stop_words='english')),
('tfidf', TfidfTransformer(norm='l2')),
('clf', LinearSVC()),])
pipe.fit_transform(corpus, labels)
return pipe
Dans le pipeline, il y a trois étapes de traitement. Le CountVectorizer tokenise les mots, les divise, les compte et transforme les données en une matrice éparse. Le TfidfTransformer est facultatif, et vous pourriez vouloir le supprimer en fonction de l'évaluation de la précision (effectuer des tests de validation croisée et une recherche de grille pour les meilleurs paramètres est un peu compliqué, donc je ne m'y attarderai pas ici). Le LinearSVC est un algorithme standard de classification de texte.
Enfin, vous prédisez la catégorie des tweets :
def predict(pipe, tweet):
prediction = pipe.predict([tweet])
return prediction
Encore une fois, le tweet doit être dans une liste, donc j'ai supposé qu'il entrait dans la fonction comme une chaîne.
Mettez tout ça dans une classe ou autre, et vous avez terminé. Du moins, avec cet exemple très basique.
Je n'ai pas testé ce code, il se peut donc qu'il ne fonctionne pas si vous faites un simple copier-coller, mais si vous voulez utiliser scikit-learn, cela devrait vous donner une idée de par où commencer.
EDIT : j'ai essayé d'expliquer les étapes plus en détail.
18 votes
Vous voulez essentiellement ça : fr.wikipedia.org/wiki/Bayesian_spam_filtering
1 votes
Vous étiquetez vos données à la main, mais vous voulez des bibliothèques à l'échelle. S'agit-il de données supervisées ou non supervisées ?
0 votes
Elle commencerait par être supervisée, l'objectif étant de la laisser se dérouler sans supervision.
1 votes
Eddi, merci pour le commentaire. Voir l'email sur le filtrage du courrier a vraiment aidé à ce que quelque chose clique dans mon cerveau. J'ai pu voir un exemple concret de ce que j'essayais de faire, mais appliqué différemment.
5 votes
Reconnaissance d'entités nommées : nlp.stanford.edu/software/CRF-NER.shtml .
1 votes
Fascinant @NeilMcGuigan. J'ai collé une partie du texte de leur démo ( nlp.stanford.edu:8080/ner/processus ) et j'ai été impressionné par la façon dont les différents modèles classaient les mots.
0 votes
Vous pouvez en fait obtenir des prédictions remarquablement bonnes, même avec le plus naïf des algorithmes bayésiens. Si vous avez besoin d'un coup de pouce dans la bonne direction, vous pouvez jeter un coup d'œil à un analyseur d'audience de films que j'ai écrit pour un cours d'intelligence artificielle. .
0 votes
Une approche simple qui fonctionne sur la quasi-totalité des données de test consiste à vérifier la présence d'autres mots pour désigner la nourriture.