Question

Je souhaite implémenter certaines applications avec n-grammes (de préférence en PHP).

Quel type de n-grammes est plus approprié dans la plupart des cas? Un niveau de mot ou un niveau de caractère n-gramme? Comment pouvez-vous implémenter un tokenizer n-gram en PHP?

Tout d'abord, j'aimerais savoir ce que sont exactement les N-grammes. Est-ce correct? C'est ainsi que je comprends les n-grammes:

Phrase: "Je vis à New York".

Bigrams au niveau des mots (2 pour n): "# I", "I live", "live in", "in NY", 'NY #'

Bigrams au niveau du personnage (2 pour n): "# I", "I #", "# l", "li", "iv", "ve", "e #". , "# i", "in", "n #", "# N", "NY", "Y #"

Lorsque vous avez ce tableau de parties de n-grammes, supprimez les doublons et ajoutez un compteur pour chaque partie, en indiquant la fréquence:

bigrammes au niveau des mots: [1, 1, 1, 1, 1]

Bigrams au niveau du personnage: [2, 1, 1, ...]

Est-ce correct?

De plus, j'aimerais en savoir plus sur ce que vous pouvez faire avec n-grammes:

  • Comment identifier la langue d'un texte à l'aide de n-grammes?
  • Est-il possible de faire une traduction automatique à l'aide de n-grammes même si vous n'avez pas de corpus bilingue?
  • Comment puis-je créer un filtre anti-spam (spam, ham)? Combiner des n-grammes avec un filtre bayésien?
  • Comment puis-je repérer des sujets? Par exemple: un texte concerne-t-il le basket ou les chiens? Mon approche (procédez comme suit avec un article Wikipedia pour "chiens" et "basketball"): créez les vecteurs n-gramme pour les deux documents, normalisez-les, calculez la distance Manhattan / Euclidienne, plus le résultat est proche de 1 plus élevé. est la similitude

Que pensez-vous de mes approches applicatives, en particulier de la dernière?

J'espère que vous pourrez m'aider. Merci d'avance!

Était-ce utile?

La solution

Les n-grammes de mots seront généralement plus utiles pour la plupart des applications d’analyse de texte que vous mentionnez, à l’exception possible de la détection de la langue, où des trigrammes de caractères pourraient donner de meilleurs résultats. Effectivement, vous créeriez un vecteur n-gramme pour un corpus de texte dans chaque langue que vous souhaitez détecter, puis comparez les fréquences des trigrammes de chaque corpus aux trigrammes du document que vous classifiez. Par exemple, le trigramme le apparaît probablement beaucoup plus souvent en anglais qu'en allemand et offrirait un certain niveau de corrélation statistique. Une fois que vous avez vos documents au format n-gramme, vous avez le choix entre de nombreux algorithmes pour une analyse plus approfondie, filtres bayésiens, N-voisin le plus proche, machines à vecteurs de support, etc.

Parmi les applications que vous mentionnez, la traduction automatique est probablement la plus farfelue, car les n-grammes à eux seuls ne vous mèneront pas très loin dans le chemin. La conversion d'un fichier d'entrée en une représentation en n-grammes constitue simplement un moyen de mettre les données dans un format permettant une analyse approfondie des fonctionnalités, mais si vous perdez beaucoup d'informations contextuelles, il se peut que cela ne soit pas 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. Autrement dit, la première entrée du vecteur ne peut pas être , le dans un document et est dans un autre, sinon les algorithmes ne fonctionneront pas. Vous vous retrouverez avec des vecteurs tels que [0,0,0,0,1,1,0,0,2,0,0,1], car la plupart des documents ne contiennent pas le plus grand nombre de n-grammes qui vous intéressent. Il est essentiel de disposer de nombreuses fonctionnalités, ce qui vous oblige à décider "à l'avance" des ngrammes que vous allez inclure dans votre analyse. Ceci est souvent implémenté sous la forme d'un algorithme à deux passes, pour décider d'abord de la signification statistique de divers n-grammes et décider de ce qu'il faut conserver. "Sélection des fonctionnalités" de Google pour plus d'informations.

Les n-grammes basés sur Word ainsi que les machines à vecteurs de support sont un excellent moyen de repérer les sujets, mais vous avez besoin d’un corpus de texte volumineux préalablement classé en "sujet" et "hors sujet" pour former le classificateur. Vous trouverez un grand nombre d'articles de recherche expliquant diverses approches de ce problème sur un site tel que citeseerx . . Je ne recommanderais pas l'approche de la distance euclidienne à ce problème, car elle ne pondère pas les n-grammes individuels en fonction de la signification statistique. Deux documents qui incluent tous les deux le , a , est , et sur serait considéré comme une correspondance meilleure que deux documents qui incluaient tous deux Baysian . Supprimer les mots vides de vos n-grammes d’intérêt pourrait améliorer quelque peu cette situation.

Autres conseils

Vous avez raison sur la définition de n-grammes.

Vous pouvez utiliser des n-grammes au niveau des mots pour les applications de type recherche. Le niveau de caractère n-grammes peut être davantage utilisé pour l'analyse du texte lui-même. Par exemple, pour identifier la langue d’un texte, j’utiliserais les fréquences des lettres par rapport aux fréquences établies de la langue. Autrement dit, le texte doit correspondre approximativement à la fréquence d'apparition de lettres dans cette langue.

Un générateur de jeton n-gramme pour les mots en PHP peut être créé à l'aide de strtok:

http://us2.php.net/manual/en/function .strtok.php

Pour les personnages, utilisez split:

http://us2.php.net/manual/en /function.str-split.php

Ensuite, vous pouvez simplement diviser le tableau à votre guise en un nombre quelconque de n-grammes.

Les filtres bayésiens doivent être formés pour pouvoir être utilisés comme filtres anti-spam, qui peuvent être utilisés en combinaison avec n-grammes. Cependant, vous devez lui donner beaucoup d’informations pour qu’il puisse apprendre.

Votre dernière approche semble décente pour ce qui est d’apprendre le contexte d’une page ... C’est quand même assez difficile à faire, mais n-grammes semble être un bon point de départ pour le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top