Algorithme pour déterminer positif ou négatif d'une déclaration/texte
J'ai besoin d'un algorithme pour déterminer si une phrase, un paragraphe ou un article est négatif ou positif... ou mieux encore, comment négatif ou positif.
Par exemple:
Jason est le pire utilisateur que j'ai jamais vu (-10)
Jason est un utilisateur SO (0)
Jason est le meilleur utilisateur SO que j'ai jamais vu (+10)
Jason est le meilleur à sucer avec (-10)
Alors que, d'accord à So, Jason est le pire à faire mal (+10)
Pas facile, hein? :)
Je ne m'attends pas à ce que quelqu'un m'explique cet algorithme, mais je suppose qu'il y a déjà beaucoup de travail sur quelque chose comme ça dans les universités quelque part. Si vous pouvez me pointer vers des articles ou des recherches, je l'adorerais.
Merci.
13 réponses
Il existe un sous-domaine du traitement du langage naturel appelé Analyse des sentiments qui traite spécifiquement de ce domaine problématique. Il y a une bonne quantité de travail commercial effectué dans la région parce que les produits de consommation sont si fortement examinés dans les forums d'utilisateurs en ligne (ugc ou contenu généré par l'utilisateur). Il existe également une plate-forme prototype pour l'analyse de texte appelée GATE de l'Université de sheffield, et un projet python appelé nltk. Les deux sont considérés comme flexibles, mais pas de très haute performance. L'un ou l'autre pourrait être bon pour élaborer vos propres idées.
Dans mon entreprise, nous avons un produit qui fait cela et fonctionne également bien. J'ai fait la plupart du travail dessus. Je peux donner une brève idée:
Vous devez diviser le paragraphe en phrases, puis diviser chaque phrase en sous-phrases plus petites-fractionnement basé sur des virgules, trait d'Union, point-virgule, deux-points, 'et', 'ou', etc. Chaque sous-phrase montrera un sentiment totalement séparé dans certains cas.
Certaines phrases, même si elles sont divisées, devront être réunies.
Par exemple: Le produit est incroyable, super et fantastique.
Nous avons développé un ensemble complet de règles sur le type de phrases qui doivent être divisées et qui ne devraient pas l'être (basé sur les balises POS des mots)
Au premier niveau, vous pouvez utiliser un sac d'approche de mots, ce qui signifie-avoir une liste de mots/phrases positifs et négatifs et vérifier dans chaque sous-phrase. En faisant cela, regardez aussi les mots de négation comme "non", "non", etc. qui changeront la polarité de la phrase.
Même dans ce cas, si vous ne trouvez pas le sentiment, vous pouvez opter pour une approchenaïve bayes . Cette approche n'est pas très précise (environ 60%). Mais si vous appliquez cela à la seule phrase qui ne parvient pas à passer à travers le premier ensemble de règles - vous pouvez facilement obtenir une précision de 80-85%.
La partie importante est la liste de mots positifs/négatifs et la façon dont vous divisez les choses. Si vous le souhaitez, vous pouvez aller encore plus haut en implémentant HMM (modèle Markov caché) ou CRF (champs aléatoires conditionnels). Mais je ne suis pas un pro en PNL et quelqu'un d'autre peut vous remplir dans cette partie.
Pour les curieux, nous avons implémenté tout cela est python avec NLTK et le module Révérend Bayes.
Assez simple et gère la plupart des phrases. Vous pouvez cependant rencontrer des problèmes lorsque vous essayez de marquer le contenu du web. La plupart des gens n'écrivent pas des phrases appropriées sur le web. La manipulation du sarcasme est également très difficile.
Cela tombe sous le parapluie de Traitement du langage naturel, et donc la lecture à ce sujet est probablement un bon endroit pour commencer.
Si vous ne voulez pas entrer dans un problème très compliqué, vous pouvez simplement créer des listes de mots" positifs "et" négatifs " (et les pondérer si vous le souhaitez) et faire des comptes de mots sur des sections de texte. Évidemment, ce n'est pas une solution "intelligente", mais cela vous donne des informations avec très peu de travail, où faire de la PNL sérieuse serait très Temps consommer.
Un de vos exemples serait potentiellement marqué positif alors qu'il était en fait négatif en utilisant cette approche ("Jason est le meilleur à sucer avec SO") à moins que vous ne pesiez plus "sucer" que "meilleur".... Mais c'est aussi un petit échantillon de texte, si vous regardez des paragraphes ou plus de texte, alors la pondération devient plus fiable à moins que quelqu'un essaie délibérément de tromper votre algorithme.
Comme indiqué, cela relève de l'analyse des sentiments sous traitement du langage naturel.
Afaik GATE n'a aucun composant qui fait l'analyse des sentiments.
D'après mon expérience, j'ai implémenté un algorithme qui est une adaptation de celui de L'article "Recognizing Contextual Polarity in Phrase-Level Sentiment Analysis" de Theresa Wilson, Janyce Wiebe, Paul Hoffmann (this) en tant que plugin GATE, ce qui donne de bons résultats raisonnables. Il pourrait vous aider si vous voulez bootstrap l'implémentation.
En fonction de votre application, vous pouvez le faire via un algorithme filtrage bayésien (qui est souvent utilisé dans les filtres anti-spam).
Une façon de le faire serait d'avoir deux filtres. Un pour les documents positifs et un autre pour les documents négatifs. Vous devez semer le filtre positif avec des documents positifs (quels que soient les critères que vous utilisez) et le filtre négatif avec des documents négatifs. L'astuce serait de trouver ces documents. Peut-être que vous pourriez le configurer pour que vos utilisateurs évaluent efficacement document.
Le filtre positif (une fois ensemencé) chercherait des mots positifs. Peut-être qu'il finirait avec des mots comme l'amour, la paix, etc. Le filtre négatif serait également ensemencé de manière appropriée.
Une fois que vos filtres sont configurés, vous exécutez le texte de test à travers eux pour obtenir des scores positifs et négatifs. Basé sur ces scores et une certaine pondération, vous pourriez venir avec votre score numérique.
Les filtres bayésiens, bien que simples, sont étonnamment efficace.
, Vous pouvez faire comme ceci:
Jason is the worst SO user I have ever witnessed (-10)
Pire (-), le reste est (+). donc, ce serait (-) + (+) = (-)
Jason is an SO user (0)
( ) + ( ) = ( )
Jason is the best SO user I have ever seen (+10)
Meilleur ( + ), le reste est (). donc, ce serait (+) + ( ) = (+)
Jason is the best at sucking with SO (-10)
Meilleur ( + ), sucer ( -). donc, (+) + (-) = (-)
While, okay at SO, Jason is the worst at doing bad (+10)
Pire ( - ), faire mal ( -). donc, (-) + (-) = (+)
Il existe de nombreuses approches d'apprentissage automatique pour ce type d'analyse des sentiments. J'ai utilisé la plupart des algorithmes d'apprentissage automatique, qui sont déjà implémentés. mon cas, j'ai utilisé
Weka algorithmes de classification
- SVM
- naïf basien
-
J48
Seulement vous devez faire ceci former le modèle à votre contexte, ajouter le vecteur vedette et la mise au point basée sur les règles. Dans mon cas, j'en ai eu (61% de précision). Donc, nous passons dans stanford core nlp (ils ont formé leur modèle pour les critiques de films) et nous avons utilisé leur ensemble d'entraînement et ajouté notre ensemble d'entraînement. nous pourrions atteint 80-90% précision.
C'est une vieille question, mais je suis arrivé à la recherche d'un outil qui pourrait analyser le ton de l'article et trouvé Watson Tone Analyzer par IBM. Il permet 1000 appels api par mois gratuitement.
Tout est une question de contexte, je pense. Si vous cherchez les gens qui sont les meilleurs à sucer avec SO. Sucer le meilleur peut être une chose positive. Pour déterminer ce qui est mauvais ou bon et combien je pourrais recommander de regarder dans la logique floue.
C'est un peu comme être grand. Quelqu'un qui mesure 1,95 M peut être considéré comme grand. Si vous placez cette personne dans un groupe avec des gens de plus de 2,10 m, il a l'air court.
Peut-être un logiciel de notation d'essai pourrait-il être utilisé pour estimer le ton? article câblé .
Référence possible . (Je ne pouvais pas le lire.)
ce rapport compare les compétences en écriture au niveau de Flesch-Kincaid requis pour le lire!
Page 4 de e-rator dit qu'ils regardent mal orthographié et tel. (Peut-être que le mauvais message est mal orthographié aussi!)
Slashdot article.
Vous pouvez également utiliser un filtre d'email de quelque sorte pour la négativité au lieu de spam-ness.
Que diriez-vous de sarcasme:
- Jason est le meilleur utilisateur SO que j'ai jamais vu, pas
- Jason est le meilleur utilisateur SO que j'ai jamais vu, non
use Algorithm::NaiveBayes;
my $nb = Algorithm::NaiveBayes->new;
$nb->add_instance
(attributes => {foo => 1, bar => 1, baz => 3},
label => 'sports');
$nb->add_instance
(attributes => {foo => 2, blurp => 1},
label => ['sports', 'finance']);
... repeat for several more instances, then:
$nb->train;
# Find results for unseen instances
my $result = $nb->predict
(attributes => {bar => 3, blurp => 2});