Si vous ne rencontrez pas de problème lors de l'utilisation d'une bibliothèque externe, je vous recommande scikit-learn car il peut probablement le faire mieux et plus rapidement que tout ce que vous pourriez coder vous-même. Je ferais juste quelque chose comme ça:
Construisez votre corpus. J'ai fait la liste des compréhensions pour plus de clarté, mais en fonction de la façon dont vos données sont stockées, vous devrez peut-être faire différentes choses:
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 retrouvez 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 un pipeline! Pipeline est une classe scikit-learn qui facilite l'enchaînement des étapes de traitement de texte afin que vous n'ayez à appeler qu'un seul objet lors de l'apprentissage / de la 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
À l'intérieur du 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 clairsemée. Le TfidfTransformer est facultatif, et vous voudrez peut-être le supprimer en fonction de la note de précision (faire des tests de validation croisée et une recherche de grille pour les meilleurs paramètres est un peu impliqué, donc je ne vais pas y entrer ici). Le LinearSVC est un algorithme de classification de texte standard.
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, j'ai donc supposé qu'il entrait la fonction sous forme de chaîne.
Mettez tout cela 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 peut donc ne pas fonctionner si vous faites simplement un copier-coller, mais si vous souhaitez utiliser scikit-learn, cela devrait vous donner une idée de par où commencer.
EDIT: essayé d'expliquer les étapes plus en détail.