Se non hai problemi con l'utilizzo di una libreria esterna, consiglierei scikit-learn poiché probabilmente può farlo meglio e più velocemente di qualsiasi cosa tu possa programmare da solo. Farei qualcosa del genere:
Costruisci il tuo corpus. Ho fatto le comprensioni dell'elenco per chiarezza, ma a seconda di come vengono archiviati i tuoi dati potresti dover fare cose diverse:
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)
La cosa importante è che ti ritroverai con due elenchi che assomigliano a questo:
([['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])
[1, 1, 0, 0] rappresentano le etichette positive e negative.
Quindi, crei una pipeline! Pipeline è una classe di apprendimento scikit che semplifica il concatenamento delle fasi di elaborazione del testo in modo da dover chiamare solo un oggetto durante l'addestramento / previsione:
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
All'interno della pipeline ci sono tre fasi di elaborazione. CountVectorizer tokenizza le parole, le divide, le conta e trasforma i dati in una matrice sparsa. Il TfidfTransformer è opzionale e potresti volerlo rimuovere a seconda della valutazione dell'accuratezza (fare test di convalida incrociata e una ricerca sulla griglia dei parametri migliori è un po 'complicato, quindi non lo approfondirò qui). LinearSVC è un algoritmo di classificazione del testo standard.
Infine, prevedi la categoria dei tweet:
def predict(pipe, tweet):
prediction = pipe.predict([tweet])
return prediction
Di nuovo, il tweet deve essere in un elenco, quindi ho pensato che stesse inserendo la funzione come stringa.
Metti tutti quelli in una classe o qualsiasi altra cosa e il gioco è fatto. Almeno, con questo esempio molto semplice.
Non ho testato questo codice, quindi potrebbe non funzionare se copi e incolla, ma se vuoi usare scikit-learn dovrebbe darti un'idea di dove iniziare.
EDIT: ho cercato di spiegare i passaggi in modo più dettagliato.