6
votes

Groupe flou de, regroupant des mots similaires

Cette question est posée ici avant

Qu'est-ce que c'est Une bonne stratégie pour grouper des mots similaires?

mais aucune réponse claire n'est donnée sur la manière de "grouper". La solution basée sur DIFFLIB est essentiellement la recherche, pour un élément donné, DIFFLIB peut renvoyer le mot le plus similaire sur une liste. Mais comment cela peut-il être utilisé pour le groupement?

Je voudrais réduire xxx

à xxx

ou XXX

Une idée que j'ai essayée était, pour chaque article, itérer via la liste, si get_close_matches renvoie plus d'une correspondance, utilisez-la, s'il ne contient pas le mot tel quel. Cela a participé en partie, mais il peut suggérer Apple pour appel, puis appel pour Apple, ces mots changeraient simplement des endroits et rien ne changerait.

J'apprécierais tous les pointeurs, noms des bibliothèques, etc.

Remarque: aussi en termes de performances, nous avons une liste de 300 000 articles et get_close_matches semble un peu lent. Est-ce que quelqu'un connaît une solution basée sur C / ++?

Merci,

Remarque: une enquête supplémentaire révélée Koredoid est l'algorithme de droite (ainsi que la clustering hiérarchique), puisque Kmedoid n'exige pas de "centres", il faut / utilise des points de données eux-mêmes En tant que centres (ces points sont appelés médoines, d'où le nom). Dans l'affaire de groupe de mots, le Médoïdien serait l'élément représentatif de ce groupe / groupe.


0 commentaires

5 Réponses :


5
votes

Vous devez normaliser les groupes. Dans chaque groupe, choisissez un mot ou un codage qui représente le groupe. Puis regroupez les mots par leur représentant.

Quelques manières possibles:

  • Choisissez le premier mot rencontré.
  • Choisissez le premier mot lexicographique.
  • dérive un motif pour tous les mots.
  • Choisissez un index unique.
  • Utilisez le Soundex comme modèle.

    regrouper les mots pourrait être difficile, cependant. Si A est similaire à B, et B est similaire à C, A et C n'est pas nécessairement similaire à l'autre. Si B est le représentant, les deux A et C pourraient être inclus dans le groupe. Mais si A ou C est le représentant, l'autre n'a pas pu être inclus.


    aller à la première alternative (premier mot rencontré): xxx < p> Exemple: xxx

    sortie: xxx


4 commentaires

Trouver les groupes serait la partie difficile. Je suppose que je pourrais utiliser un algorithme de clustering qui prend E.G. LEVENSHTEIN Distance en tant que mesure de distance. Après identification des clusters, je choisis, je choisis l'un des mots (l'un d'entre eux) en tant que représentant pour ce groupe.


En variante, vous pouvez utiliser la distance moyenne paire duevensehtein entre les mots en deux groupes comme mesure de distance entre eux (de nombreux algorithmes de clusters hiérarchiques fonctionnent de cette façon). La distance maximale paires peut également fonctionner.


Belle explication du représentant du groupe. Cependant, je recommanderais (double) métaphone sur Soundex. +1


Markus, pourriez-vous ajouter la ligne principale au script ci-dessus? J'ai ajouté une mesure de distance à votre code (sera ajoutée à ma question principale), j'ai eu des problèmes d'affichage des groupes.



3
votes

Vous devez décider des mots de correspondance fermés, quels mots que vous souhaitez utiliser. Peut être le premier élément de la liste qui get_close_matches renvoie ou utilisez simplement une fonction aléatoire sur cette liste et obtenez un élément à partir de correspondances fermées.

Il doit y avoir une sorte de règle, pour cela .. xxx

Supprimer c de la liste initiale, c'est-à-dire ... Pour C ++, vous pouvez utiliser Levenshtein_distance


0 commentaires

0
votes

Voici une approche basée sur les médicaments. D'abord installer mlpy. Sur Ubuntu xxx

alors xxx

la sortie est xxx

le mot grand liste et en utilisant k = 10 xxx


0 commentaires

1
votes

Une autre méthode pourrait utiliser la factorisation matricielle, à l'aide de SVD. Nous créons d'abord une matrice de distance de mots, pour 100 mots ce serait 100 x 100 matrix représentant la distance de chaque mot à tous les autres mots. Ensuite, SVD est couru sur cette matrice, l'U dans les U, S, V, V, V, VE VEUT ÊTRE CONSIDÉRÉ COMME FORCE DE L'ADHÉSION À CHAQUE CLUSSION.

code xxx

le résultat xxx

La sélection de K pour nombre de clusters est importante, K = 25 donne beaucoup de résultats meilleurs que k = 20 par exemple.

Le code sélectionne également un mot représentatif pour chaque cluster en choisissant le mot dont la coordonnée U [..] est la plus proche de la centrale de cluster.


0 commentaires

3
votes

Voici une autre version utilisant l'algorithme de propagation d'affinité. XXX

Les distances devaient être converties en similitudes, je l'ai fait en prenant le négatif de la distance. La sortie est xxx


1 commentaires

Tout d'abord, disons merci que vous me sauverez pour les longs jours de recherche! J'ai ajouté une amélioration de votre code au lieu d'utiliser la distance d'euclidienne par défaut dans l'algorithme de propagation affinity que je le change: précompousted donc je change la ligne dans cette AF = affinitéPropagation (affinité = "précomptes"). Ajuster (A) et Obtenez de meilleurs résultats qu'avec la valeur par défaut.