2016-11-20 5 views
1

J'ai une liste de textes qui contient des noms de marque (Coca-Cola, Pepsi, 7Up ect.). J'ai écrit un script python qui trie et compte toutes les cellules qui ont le même contenu (le même texte, après minuscules tout le texte) et réordonne la liste par le nombre de chaque texte, de sorte que les textes qui apparaissent le plus seront les premiers, parce que je suppose que la plupart des gens vont écrire le nom de marque correctement. Par exemple, si je la liste suivante:Comparer la chaîne pour correspondre à la marque et supprimer les fautes d'orthographe

texts = ['Coca-Cola', 'Pepsi', 'Coca-Cola', 'Coca-Cola', 'Pepsi', 'Pespi', 'Pepsi', '7Up', '7up', 'Cola', 'Pepsi'] 

Après la première étape, la liste sera:

ordered_text = [ 
    {'text': 'Pepsi', count: 4}, 
    {'text': 'Coca-Cola', count: 3}, 
    {'text': '7Up', count: 2}, 
    {'text': 'Cola', count: 1}, 
    {'text': 'Pespi', count: 1}, 
] 

Dans la deuxième étape, j'utilise le paquet ngram pour essayer de correspondre plus textes pour corriger les fautes d'orthographe. Note importante: l'une de mes demandes clés est d'avoir une solution agnostique à la langue.

Mon problème est que le NGRAM fonctionne très bien sur les textes longs mais fonctionne mal sur les textes courts. Par exemple lors de l'exécution:

ngram.NGram.compare('Pepsi', 'Pespi') 

le résultat sera:

0.2727272727272727 

C'est une très faible « score », mais comme vous pouvez voir la chaîne est très proche et il y a seulement 1 lettre est égaré.

Que puis-je faire pour améliorer ma dépose? Ai-je besoin d'utiliser un algorithme différent? Ou peut-être spécifier différents paramètres pour ce test? J'ai pensé à ajouter un dictionnaire qui contient tous les «nouveaux» mots que j'ai trouvés, les ajouter, puis je peux comparer chaque mot par rapport à cela, mais ensuite je perds la granularité du script.

+1

Pour les fautes de frappe, [levenshtein distance] (https://fr.wikipedia.org/wiki/Levenshtein_distance) fonctionnerait-il? – Aufziehvogel

+0

Peut-être "faible = bon"? Quoi qu'il en soit, personnellement, je préfère utiliser la distance de Levenshtein pour vérifier l'orthographe. Par exemple, le LD de "missplaed" vs "mal placé" est '2'. Divisant par la longueur des mots, c'est 2/9, ce qui est "assez proche". – usr2564301

+0

Dans 'NGRAM', vous voulez que le score soit aussi proche de 1, c'est-à-dire que les chaînes sont identiques. En général, pensez-vous qu'il vaudrait mieux lancer l'algorithme NGRAM et s'il n'a pas trouvé de correspondance pour essayer d'exécuter la distance levenshtein ou simplement utiliser la distance levenshtein dans ce cas? –

Répondre

1

De votre question, il n'est pas évident de vérifier si les entrées sont correctes ou si vous voulez juste les regrouper. Par exemple, si votre entrée ressemble à ['coka-cola', 'coak-cola', 'coca-coca'], que devrait faire votre algorithme?

  • Faut-il les regrouper tous comme {'coka-cola': 3}? La signification compare toujours les entrées à la première occurrence? Dans ce cas, modifier la distance a du sens, vous pouvez facilement trouver de nombreuses implémentations python pour cela.

  • Faut-il les regrouper sur une orthographe correcte, donc {'coka-cola': 3}? Dans ce cas, vous avez besoin d'un bon correcteur orthographique. Il y a quelques options ici, vous pouvez jeter un coup d'oeil au paquet autocorrect, ou pour une solution plus impliquée, le paquet NLTK. Une autre option consiste à utiliser Google. Je ne pense pas qu'il existe une API prise en charge par Google pour corriger les corrections orthographiques. Par conséquent, vous devrez procéder à des scrapbooking pour obtenir les résultats suggérés lors de l'envoi d'une demande à Google.

+0

Le résultat final de l'algorithme devrait être tous les textes qui sont regroupés de façon similaire, dans votre exemple: '[{'coka-cola': 2}, {'' coca-coca ': 1}]' parce que le premier et le second les chaînes sont similaires et la troisième est moins similaire. est-ce logique? –

+0

On ne voit pas très bien pourquoi vous pensez que 'coka-cola' et 'coak-cola' sont plus semblables les uns aux autres que 'coca-coca'. Si vous utilisez la distance d'édition, par exemple, il y aura un maximum de deux modifications les unes par rapport aux autres, ce qui est un seuil d'édition très faible. – yelsayed