2010-05-13 6 views
1

C'est le cas d'utilisation que j'essaie de comprendre.Repérage des similitudes et des motifs dans une chaîne - Python

J'ai une liste d'abonnements de spam à un service et ils sont en train de tuer le taux de conversion et d'autres études d'utilisabilité.

Les e-mails regard inséré comme suit:

[email protected]

[email protected]

[email protected]

roger [... ] _surname [...] @ hotmail.com


Quelles seraient vos suggestions pour repérer ces entrées en utilisant un script automatisé? C'est un peu plus compliqué que ça en a l'air.

Une aide serait grandement appréciée!

Répondre

3

Je ne pense pas que vous pouvez facilement vérifier cela.Il ne s'agira probablement pas d'un simple problème de correspondance de chaînes sur lequel vous pouvez lancer une expression régulière, car j'imagine que votre utilisation du nom "Roger" n'était qu'un exemple, et qu'un nombre quelconque de noms pouvait apparaître dans cette position. Vous pouvez également exécuter l'une des expressions régulières fournies par les autres affiches, en la paramétrant avec chaque permutation du prénom et du nom de famille. Cela prendra probablement quelque part entre "trop ​​long" et "pour toujours", et signalera beaucoup de faux positifs.

Une autre approche, qui fonctionne avec le modèle que vous avez posté ci-dessus, serait de prendre les 4 dernières lettres du nom d'utilisateur, et les comparer à quelque chose. Repérer les caractères aléatoires plutôt que disposés raisonnablement (en fonction d'une langue spécifique) peut être fait en entraînant une chaîne de Markov sur un texte légitime qui peut alors vous permettre de calculer la probabilité de 4 lettres apparaissant dans cet ordre dans cette langue. Pour les lettres aléatoires, cette probabilité sera généralement beaucoup plus faible que pour un nom légitime (bien qu'il y ait des caractères spéciaux ou des chiffres, tous les paris sont désactivés). Une autre façon pourrait être d'utiliser un filtre bayésien (par exemple quelque chose comme Reverend en Python, bien qu'il y en ait d'autres) formés sur les 4 dernières lettres d'adresses e-mail légitimes. Ce serait probablement 95% de ceux qui étaient tout à fait aléatoire, à condition que vous avez rendu les données utilisables. par exemple. Soumettre non seulement les 4 lettres mais chacune des sous-chaînes de 2 et 3 lettres à l'intérieur, pour capturer le contexte de chaque lettre. Je ne pense pas que cela fonctionnerait aussi bien que la méthode de Markov. Quel que soit le contrôle que vous effectuez, vous pouvez réduire les faux positifs en ne soumettant que certaines adresses e-mail (par exemple celles des adresses webmail, qui contiennent un trait de soulignement, avec au moins 3 caractères avant le trait de soulignement et 5 caractères après. Mais en fin de compte, vous ne pouvez jamais savoir si c'est une adresse de spam ou une vraie adresse de courrier indésirable jusqu'à ce qu'elle soit utilisée dans un but ou dans l'autre. Donc, si possible, je suggérerais de renoncer à essayer d'analyser le contenu et de corriger le problème ailleurs. De quelle manière sont-ils en train de tuer le taux de conversion? Si vous comptez ces comptes factices dans une sorte de mesure, il est préférable d'ajouter une étape de vérification en premier et de vous soucier uniquement des statistiques pour les comptes ayant réussi la vérification. Certaines personnes ont vraiment des adresses comme [email protected], après tout.

+0

Révérend semble tout à fait génial, et merci pour la réponse génial! – RadiantHex

1

Je ne pense pas que vous pouvez faire plus que marquer comme un problème potentiel, en vérifiant:

^roger([a-z]{2})_([a-z]+)@hotmail.com

utilisant regular expressions, si c'est le modèle que le spammeur utilise à plusieurs reprises.

On dirait qu'ils utilisent 2 caractères alphabétiques en minuscules après roger, donc j'ai construit cela. Vous ne savez pas comment vous allez faire correspondre le dictionnaire de noms de famille qu'ils utilisent, donc en faisant correspondre la dernière partie (qui semble être le nom puis 4 minuscules caractères alphabétiques) peut être difficile, mais vous pourriez peut-être faire.

^roger([a-z]{2})_([a-z]{5,})@hotmail.com

qui suppose que tous leurs noms au moins ont un caractère dans

1

Ressemble un emploi pour les expressions régulières:

if re.match("^roger[a-z]+_[a-z][email protected]$", email_address): 
    # might be your spammer 

(Si vous ne l'avez jamais utilisé des expressions régulières, voici un rapide aperçu de ce que cela signifie: ^ correspond au début de la chaîne et $ correspond à la fin, donc nous exigeons que tout entre ces symboles est un modèle décrivant toute la chaîne. [a-z] correspond à une lettre minuscule, et + signifie "une ou plusieurs fois", donc [a-z]+ correspond à une ou plusieurs lettres minuscules. En résumé, notre regex correspond si la chaîne peut être décrite comme "le début de la chaîne, suivie par les lettres roger, suivie d'une ou plusieurs lettres minuscules, suivies d'un trait de soulignement, suivi d'une ou plusieurs lettres minuscules lettres suivies de @hotmail.com, suivies de la fin de la chaîne. " Si la regex correspond, l'adresse e-mail correspond au modèle que vous avez décrit dans votre question.)

Bien sûr, s'il attrape et modifie son modèle (par exemple, en changeant de prénoms), cette méthode échouera et vous Il faudra se rabattre sur des techniques plus traditionnelles de prévention du spam, comme l'utilisation d'un CAPTCHA.

Questions connexes