N-grammes: explication + 2 applications
je veux implémenter quelques applications avec n-grammes (de préférence en PHP).
quel type de n-grammes est le plus adéquat pour la plupart des utilisations? Un niveau de mot ou un niveau de caractère n-gram? Comment Pouvez-vous implémenter un n-gram-tokenizer en PHP?
tout d'abord, j'aimerais savoir ce que sont exactement les N-grammes. Est-ce correct? C'est comme ça que je comprends n-grams:
Phrase: "je vis à new york."
niveau des mots bigrammes (2 pour n): "# Je", "je vis", "vivre", "NY", 'NY #'
niveau de personnage bigrams (2 pour n): "#I", "I#", "#l", "li", "iv", "ve", "e#", "#i", "", "#", "#N", "new york", "Y#"
Quand vous avez ce tableau de n-gram-pièces, vous déposez le dupliquer et ajouter un compteur pour chaque partie donnant la fréquence:
niveau des mots bigrammes: [1, 1, 1, 1, 1]
niveau des caractères bigrammes: [2, 1, 1,...]
Est-ce - il correct?
en outre, je voudrais en savoir plus sur ce que vous pouvez faire avec n-grammes:
- Comment puis-je identifier la langue du texte à l'aide de n-grammes?
- est-il possible de faire la traduction automatique en n-grammes même si vous n'avez pas de corpus bilingue?
- comment créer un filtre de spam (spam, jambon)? Combiner n-grammes avec un filtre bayésien?
- Comment puis-je faire le repérage des sujets? Par exemple: Est-ce un texte sur de basket-ball ou des chiens? Mon approche (faire ce qui suit avec un article de Wikipedia pour "chiens" et "basket-ball"): construire les vecteurs n-gram pour les deux documents, les normaliser, calculer Manhattan/distance euclidienne, plus le résultat est proche de 1 Plus est la similarité
Que pensez-vous de mes approches d'application, en particulier la dernière?
j'espère que vous pourrez m'aider. Merci à l'avance!
2 réponses
le mot n-grammes sera généralement plus utile pour la plupart des applications d'analyse de texte que vous mentionnez à l'exception possible de la détection de langue, où quelque chose comme les trigrammes de caractères pourrait donner de meilleurs résultats. En effet, vous créeriez n-gram vecteur pour un corpus de texte dans chaque langue que vous êtes intéressé à détecter et ensuite comparer les fréquences de trigrammes dans chaque corpus aux trigrammes dans le document que vous classifiez. Par exemple, le trigramme the
apparaît probablement beaucoup plus fréquemment en anglais qu'en allemand et fournirait un certain niveau de corrélation statistique. Une fois que vous avez vos documents en format n-gram, vous avez le choix entre de nombreux algorithmes pour une analyse plus poussée, des filtres Baysiens, n - Plus proche voisin, Support Vector Machines, etc..
parmi les applications que vous mentionnez, la traduction automatique est probablement la plus farfelue, car n-grammes à elle seule ne vous mènera pas très loin dans le chemin. Convertir un fichier d'entrée en représentation n-gram est juste un moyen de mettre les données dans un format pour une analyse plus poussée des caractéristiques, mais comme vous perdez beaucoup d'informations contextuelles, il peut ne pas être utile pour la traduction.
une chose à surveiller, c'est qu'il ne suffit pas de créer un vecteur [1,1,1,2,1] pour un document et un vecteur [2,1,2,4] pour un autre document, si les dimensions ne correspondent pas. Qui est, la première entrée dans le vecteur ne peut pas être the
dans un document et is
dans un autre ou les algorithmes ne fonctionneront pas. Vous aurez le vent en avec des vecteurs comme [0,0,0,0,0,1,1,0,0,0,2,0,0,0,] car la plupart des documents ne contiennent pas la plupart des N-grammes qui vous intéressent. Cette "alignement" des caractéristiques est essentiel, et il exige que vous décidez "à l'avance" quels ngrams vous inclurez dans votre analyse. Souvent, il s'agit d'un algorithme à deux passes, qui permet de déterminer d'abord la signification statistique de divers n-grammes pour décider de ce qu'il faut conserver. Google "sélection de fonctionnalités" pour plus d'informations.
basé sur le mot n-grammes plus vecteur de Support Machines dans un excellent moyen pour effectuer rubrique spotting, mais vous avez besoin d'un grand corpus de texte pré classées en "sujet" et "hors sujet" pour former le classificateur. Vous trouverez un grand nombre de documents de recherche expliquant diverses approches à ce problème sur un site comme citeseerx. Je ne recommande pas l'approche euclidienne de la distance pour ce problème, car elle ne pondère pas les N-grammes individuels basés sur la signification statistique, donc deux documents qui comprennent tous les deux the
, a
,is
et of
serait considéré comme une meilleure correspondance que deux documents qui incluaient tous les deux Baysian
. Supprimer les mots d'arrêt de vos N-grammes d'intérêt améliorerait quelque peu cela.
vous avez raison sur la définition de n-grammes.
vous pouvez utiliser le niveau de mot n-grammes pour les applications de type de recherche. Personnage de niveau n-grammes peuvent être utilisées pour l'analyse du texte lui-même. Par exemple, pour identifier la langue du texte, je voudrais utiliser les fréquences des lettres par rapport aux fréquences de la langue. C'est-à-dire que le texte devrait grossièrement correspondre à la fréquence d'occurrence des lettres dans cette langue.
un tokenizer n-gram pour les mots en PHP peuvent être faits en utilisant strtok:
http://us2.php.net/manual/en/function.strtok.php
Pour les personnages utilisation de split:
http://us2.php.net/manual/en/function.str-split.php
alors vous pouvez simplement diviser le tableau comme vous le souhaitez à n'importe quel nombre de n-grammes.
les filtres bayésiens doivent être formés pour être utilisés comme filtres anti-spam, qui peuvent être utilisés en combinaison avec n-grammes. Cependant vous devez le donner l'abondance de l'entrée dans l'ordre pour qu'il puisse apprendre.
votre dernière approche semble décente en ce qui concerne l'apprentissage du contexte d'une page... cela reste cependant assez difficile à faire, mais n-grammes semble être un bon point de départ pour le faire.