2009-08-22 5 views
6

Disons que j'ai une liste de noms de domaine que je voudrais analyser. À moins que le nom de domaine ne soit coupé, je ne vois pas de moyen particulièrement facile d '«extraire» les mots-clés utilisés dans le domaine. Pourtant, je le vois faire sur des sites tels que DomainTools.com, Estibot.com, etc. Par exemple:Extraction par programme de mots-clés à partir de noms de domaine

ilikecheese.com becomes "i like cheese" 
sanfranciscohotels.com becomes "san francisco hotels" 
... 

Toutes les suggestions pour y parvenir efficacement et efficacement?

Editer: Je voudrais écrire ceci en PHP.

+0

Quel langage de programmation? – rahul

+0

PHP, édité ma question pour inclure cela, merci. – Kevin

+0

exécuter sur la chaîne à l'envers avec pspell check - eseehc = fromage, soustraire le fromage de la chaîne, ekil = like, soustraire comme de la chaîne = like; s, sl, sle, slet, sleto, sletoh = hôtels, soustraire des hôtels ... etc vous pouvez également l'exécuter plusieurs fois et inclure les dernières trouvailles sans les enlever. chaîne inverse pspell est un moyen très facile de trouver des mots "réels" dans n'importe quelle langue. – Tobias

Répondre

6

Ok, j'ai exécuté le script que j'ai écrit pour this SO question, avec quelques changements mineurs - en utilisant les probabilités log pour éviter les débordements, et en le modifiant pour lire plusieurs fichiers en tant que corpus.

Pour mon corpus, j'ai téléchargé un tas de fichiers du projet Gutenberg - pas de véritable méthode pour cela, j'ai juste saisi tous les fichiers en anglais depuis etext00, etext01, et etext02.

Voici les résultats, j'ai enregistré les trois premiers pour chaque combinaison.

 
expertsexchange: 97 possibilities 
- experts exchange -23.71 
- expert sex change -31.46 
- experts ex change -33.86 

penisland: 11 possibilities 
- pen island -20.54 
- penis land -22.64 
- pen is land -25.06 

choosespain: 28 possibilities 
- choose spain -21.17 
- chooses pain -23.06 
- choose spa in -29.41 

kidsexpress: 15 possibilities 
- kids express -23.56 
- kid sex press -32.65 
- kids ex press -34.98 

childrenswear: 34 possibilities 
- children swear -19.85 
- childrens wear -25.26 
- child ren swear -32.70 

dicksonweb: 8 possibilities 
- dickson web -27.09 
- dick son web -30.51 
- dicks on web -33.63 
+0

On dirait que le seul qui ne passe pas était «l'usure des enfants», mais je ne m'attendais pas à ce que cette automatisation soit précise à 100%. Et je suis d'accord, vous méritez la prime :) Pourriez-vous poster la source avec vos changements? – Kevin

+0

Il est fondamentalement le même que sur mon blog - il suffit de remplacer la multiplication dans find_word_seq_score avec $ score + = log ($ DICT- > {$ _}/$ TOTAL); ' – SquareCog

+0

um > est censé être le plus grand alors signe. – SquareCog

0

Vous devez utiliser un moteur de dictionnaire contre une entrée de domaine pour trouver des mots valides et exécuter ce moteur de dictionnaire sur le résultat pour vous assurer que le résultat est un mot valide.

+0

Des exemples de comment cela serait fait? – Kevin

+0

Vous devez obtenir une liste de dictionnaire. Ensuite, vous devez convertir cette liste dans un format qui vous est favorable que ce soit un tableau d'une certaine syntaxe, une liste de csv ou quoi que ce soit. Ensuite, vous devez écrire un programme qui évalue votre entrée de domaine par rapport à cette liste. –

1

Si vous avez une liste de mots valides, vous pouvez parcourir votre chaîne de domaine et essayer de couper un mot valide à chaque fois avec un algorithme de retour arrière. Si vous avez réussi à utiliser tous les mots, vous avez terminé. Sachez que le temps de la complexité ce n'est pas optimale :)

+1

Pour ne pas dire désastreux. – Dykam

+0

Vrai, mais cela aurait pu être implémenté en une heure, et il aurait déjà cinq jours d'avance pour diviser les noms de domaine du monde :) – Zed

2

choosespain.com kidsexpress.com childrenswear.com dicksonweb.com

Amusez-vous (et un bon avocat) si vous allez essayez d'analyser l'URL avec un dictionnaire.

Vous pourriez faire mieux si vous pouvez trouver les mêmes caractères mais séparés par des espaces blancs sur leur site Web.

Autres possibilités: extraire des données du certificat ssl; interroger le serveur de noms de domaine de premier niveau; Accéder au serveur de noms de domaine (TLD); ou utilisez l'un des outils ou services "whois" (il suffit de google "whois").

+0

Les domaines que j'analyse n'ont généralement pas de site. Je ne suis pas sûr de ce que vous voulez dire en utilisant DNS/whois pour trouver les mots-clés utilisés dans les domaines. – Kevin

+1

ne pas oublier penisland.com;) –

+0

@Kevin. Le trafic sur Internet n'est pas routé en utilisant les noms, mais en utilisant des adresses IP, par ex. 213.171.218.121. Un serveur de nom de domaine traduit le nom en adresse IP. TLD est le serveur de noms de domaine de premier niveau. Pour obtenir un nom de domaine, une entreprise doit s'enregistrer et il existe des moyens d'obtenir certaines de ces informations. Évidemment, ce n'est pas le cas pour les domaines sur un réseau privé, donc cela pourrait ne pas s'appliquer à ce que vous essayez de faire. – Dipstick

3

Pourrait vouloir vérifier this SO question.

+0

Ceci est le plus proche que j'ai vu à une solution :) Bounty est en train de basculer dans votre direction. – Kevin

+1

Mec, ça devrait être MY Bounty :-) Je suppose que je vais lancer le script Perl et vous faire savoir ce qu'il extrait .. – SquareCog

3

Vous devez développer une heuristique qui obtiendra des correspondances probables hors du domaine. La façon dont je le ferais est d'abord de trouver un grand corpus de texte. Par exemple, vous pouvez télécharger Wikipedia.

Ensuite, prenez votre corpus, et combinez tous les deux mots adjacents. Par exemple, si votre phrase est:

quick brown fox jumps over the lazy dog 

Vous allez créer une liste:

quickbrown 
brownfox 
foxjumps 
jumpsover 
overthe 
thelazy 
lazydog 

Chacun de ces facteurs pourrait avoir un compte d'une. En analysant votre corpus, vous garderez trace des paires de fréquences de deux mots. De plus, pour chaque paire, vous devrez trier les deux mots d'origine.

Triez cette liste en fonction de la fréquence, puis tentez de trouver des correspondances dans votre domaine en fonction de ces mots.

Enfin, effectuez un contrôle de domaine pour les deux phrases de mots qui ne sont pas enregistrés!

Je pense que les sites comme DomainTool prennent une liste des mots les mieux classés. Ils essaient ensuite d'analyser ces mots en premier. Selon le but, vous pouvez envisager d'utiliser MTurk pour faire le travail. Différentes personnes analyseront différemment les mêmes mots et ne le feront peut-être pas proportionnellement à la fréquence des mots.

+0

Je ne suis pas sûr que MTurk serait le bon outil pour le travail que je vais être traiter des milliers de domaines par jour. Cependant, j'aime la méthode que vous avez suggérée! – Kevin

+0

L'algorithme de Viterbi est probablement bien meilleur que celui que j'ai suggéré. WRT, MTurk, cela dépend de la valeur que votre division de mots ajoute. Vous pourriez avoir un hit MTurk pour diviser 10 œuvres, et cela pourrait vous coûter 0,015 $. C'est environ 15 $ par 1000 noms. Si le site 'expert sex change' avait testé leur domaine en premier, ils auraient pu commencer par le trait d'union au milieu. – brianegge

1
function getwords($string) { 
    if(strpos($string,"xn--") !== false) { 
     return false; 
    } 
    $string = trim(str_replace('-', '', $string)); 
    $pspell = pspell_new('en'); 
    $check = array(); 
    $words = array(); 
    for($j = 0; $j < (strlen($string) - 5); $j++) { 
     for($i = 4; $i < strlen($string); $i++) { 
      if(pspell_check($pspell, substr($string, $j, $i))) { 
       $check[$j]++; 
       $words[] = substr($string, $j, $i); 
      } 
     } 
    } 
    $words = array_unique($words); 
    if(count($check) > 0) { 
     return $words; 
    } 
    return false; 
} 

print_r(getwords('ilikecheesehotels')); 

Array 
(
    [0] => like 
    [1] => cheese 
    [2] => hotel 
    [3] => hotels 
) 

comme un simple départ avec pspell. vous pourriez vouloir comparer les résultats et voir si vous avez obtenu le stemm d'un mots sans le "s" à la fin et les fusionner.

Questions connexes