Évaluation du nom de domaine


25

Le commerce de noms de domaine est une grosse affaire. L'un des outils les plus utiles pour le commerce de noms de domaine est un outil d'évaluation automatique, afin que vous puissiez facilement estimer la valeur d'un domaine donné. Malheureusement, de nombreux services d'évaluation automatique nécessitent un abonnement / abonnement pour être utilisés. Dans ce défi, vous écrirez un outil d'évaluation simple qui peut approximativement estimer les valeurs des domaines .com.

Entrée sortie

En entrée, votre programme doit prendre une liste de noms de domaine, un par ligne. Chaque nom de domaine correspondra à l'expression rationnelle ^[a-z0-9][a-z0-9-]*[a-z0-9]$, ce qui signifie qu'il est composé de lettres minuscules, de chiffres et de tirets. Chaque domaine comprend au moins deux caractères et ne commence ni ne se termine par un tiret. Le .comest omis de chaque domaine, car il est implicite.

Comme autre forme d'entrée, vous pouvez choisir d'accepter un nom de domaine comme un tableau d'entiers, au lieu d'une chaîne de caractères, tant que vous spécifiez la conversion de caractère en entier souhaitée.

Votre programme doit produire une liste d'entiers, un par ligne, qui donne les prix estimés des domaines correspondants.

Internet et fichiers supplémentaires

Votre programme peut avoir accès à des fichiers supplémentaires, tant que vous fournissez ces fichiers dans le cadre de votre réponse. Votre programme est également autorisé à accéder à un fichier de dictionnaire (une liste de mots valides que vous n'avez pas à fournir).

(Edit) J'ai décidé d'étendre ce défi pour permettre à votre programme d'accéder à Internet. Il y a quelques restrictions, étant donné que votre programme ne peut pas rechercher les prix (ou l'historique des prix) d'aucun domaine, et qu'il utilise uniquement des services préexistants (ce dernier pour combler certaines lacunes).

La seule limite sur la taille totale est la limite de taille de réponse imposée par SE.

Exemple d'entrée

Ce sont des domaines récemment vendus. Avertissement: Bien qu'aucun de ces sites ne semble malveillant, je ne sais pas qui les contrôle et déconseille donc de les visiter.

6d3
buyspydrones
arcader
counselar
ubme
7483688
buy-bikes
learningmusicproduction

Exemple de sortie

Ces chiffres sont réels.

635
31
2000
1
2001
5
160
1

Notation

La notation sera basée sur la "différence de logarithmes". Par exemple, si un domaine s'est vendu 300 $ et que votre programme l'a évalué à 500 $, votre score pour ce domaine est abs (ln (500) -ln (300)) = 0,5108. Aucun domaine n'aura un prix inférieur à 1 $. Votre score global est votre score moyen pour l'ensemble des domaines, avec des scores inférieurs meilleurs.

Pour avoir une idée des scores auxquels vous devez vous attendre, il suffit de deviner une constante 36pour les données d'entraînement ci-dessous pour obtenir un score d'environ 1.6883. Un algorithme réussi a un score inférieur à celui-ci.

J'ai choisi d'utiliser des logarithmes car les valeurs s'étendent sur plusieurs ordres de grandeur et les données seront remplies de valeurs aberrantes. L'utilisation de la différence absolue au lieu de la différence au carré aidera à réduire l'effet des valeurs aberrantes dans la notation. (Notez également que j'utilise le logarithme naturel, pas la base 2 ou la base 10.)

La source de données

J'ai parcouru une liste de plus de 1 400 domaines .com récemment vendus de Flippa , un site Web d'enchères de domaine. Ces données constitueront l'ensemble de données d'entraînement. Une fois la période de soumission terminée, j'attendrai un mois supplémentaire pour créer un ensemble de données de test, avec lequel les soumissions seront notées. Je pourrais également choisir de collecter des données à partir d'autres sources pour augmenter la taille des ensembles de formation / test.

Les données d'entraînement sont disponibles à l'essentiel suivant. (Avertissement: Bien que j'aie utilisé un filtrage simple pour supprimer certains domaines NSFW de manière flagrante, plusieurs peuvent encore être contenus dans cette liste. En outre, je déconseille de visiter un domaine que vous ne reconnaissez pas .) Les chiffres sur le côté droit sont les vrais prix. https://gist.github.com/PhiNotPi/46ca47247fe85f82767c82c820d730b5

Voici un graphique de la distribution des prix de l'ensemble de données de formation. L'axe des x représente le logarithme naturel du prix, l'axe des y étant compté. Chaque barre a une largeur de 0,5. Les pics à gauche correspondent à 1 $ et 6 $, car le site Web source requiert des enchères pour augmenter d'au moins 5 $. Les données de test peuvent avoir une distribution légèrement différente.

entrez la description de l'image ici

Voici un lien vers le même graphique avec une largeur de barre de 0,2. Dans ce graphique, vous pouvez voir des pics à 11 $ et 16 $.


Juste un avertissement, utiliser les digraphes les plus courants pour marquer un domaine fonctionne très mal! R² ≅ 0

2
Quelqu'un a évidemment besoin de faire une réponse au réseau neuronal pour cela.
user48538

1
Le programme peut-il créer un lien vers Internet (par exemple, interroger Google)? Explicitement non pas dans le but de rechercher des prix, mais pour collecter des données à utiliser comme caractéristique.
Joe

@Joe Désolé, je n'ai pas eu l'occasion de répondre, mais j'ai décidé d'autoriser l'accès à Internet.
PhiNotPi

Réponses:


3

Perl, 1.38605

J'ai pensé que je devrais aller de l'avant et publier ma propre soumission, dans l'espoir que cela stimule la concurrence. Son score de 1.38605signifie qu'il est généralement désactivé par un facteur de 3.999(c'était mon point d'arrêt). Je n'ai utilisé aucune bibliothèque d'apprentissage automatique, juste Perl. Il nécessite l'accès à un dictionnaire; J'ai utilisé celui d' ici .

N'hésitez pas à utiliser certains des chiffres / statistiques de mon programme dans le vôtre.

use strict;

my %dict;
my $dictname = "dict.txt";
open(my $dfh, '<', $dictname);
while (my $row = <$dfh>) {
  chomp $row;
  $dict{lc $row} = 1;
}

my $domain = <>;
chomp($domain);

my $guess = 1;

if($domain =~ /^[a-z]*$/){
    my @bylength = (200000,20001,401,45,45,41,26,26,26,26,26,24);
  if(length($domain) < ~~@bylength+2){
    $guess *= $bylength[length($domain)-2];
  } else {
    $guess *= 18;
  }
} elsif ($domain =~ /^[0-9]*$/){
  my @bylength = (300000,30001,6000,605,50);
  if(length($domain) < ~~@bylength+2){
    $guess *= $bylength[length($domain)-2];
  } else {
    $guess *= 7;
  }
} elsif ($domain =~ /^[a-z0-9]*$/){
  my @bylength = (52300,523,28);
  if(length($domain) < ~~@bylength+2){
    $guess *= $bylength[length($domain)-2];
  } else {
    $guess *= 23;
  }
} else {
  my @bylength = (50000,500,42,32,32,31);
  if(length($domain) < ~~@bylength+2){
    $guess *= $bylength[length($domain)-2];
  } else {
    $guess *= 12;
  }
}

my $wordfact = 1;

my $leftword = 0;
for(my $i = 1; $i <= length($domain); $i++){
  my $word = substr $domain, 0, $i;
  if(exists($dict{$word})){
    $leftword = $i;
  }
}

$wordfact *= ($leftword/length($domain))**2 * 0.8 + ($leftword/length($domain)) * -0.1 + 0.9;

if($leftword/length($domain) >= 0.8){
  $wordfact *= 2.4;
}

my $rightword = 0;
for(my $i = 1; $i <= length($domain); $i++){
  my $word = substr $domain, length($domain)-$i, $i;
  if(exists($dict{$word})){
    $rightword = $i;
  }
}

$wordfact *= ($rightword/length($domain))**2 * 0.9 + ($rightword/length($domain)) * -0.2 + 1;         

$guess *= $wordfact;

my $charfact = 1;
my %charfacts = (
  i => 1.12, #500
  l => 0.84,
  s => 1.09,
  a => 0.94,
  r => 1.03,
  o => 0.97, 
  c => 1.22, #400
  d => 0.88,
  u => 1.07,
  t => 0.95,
  e => 1.08,
  m => 0.91, #300
  p => 1.08,
  y => 0.92,
  g => 0.97,
  ne => 0.56, #100
  n => 1.13,
  z => 0.67,
  re => 1.30,
  es => 0.75,
);
while(my ($key,$value) = each %charfacts){
  if($domain =~ /$key/){
    $charfact *= $value;
  }
}
$guess *= $charfact;

$guess = int($guess + 0.5);
if($guess <= 0){
  $guess = 1;
}

print $guess;

Voici un graphique réalisé par mon programme de notation, montrant un nuage de points d'appréciation sur le prix réel et un histogramme des erreurs. Dans le diagramme de dispersion, les domaines .:oO@moyens 10, 20, 30, 40, 50à ce point, respectivement. Dans l'histogramme, chacun Oreprésente 16 domaines.

L'échelle est fixée à 1 character width = e^(1/3).

entrez la description de l'image ici

Ce programme comporte trois étapes principales. Les résultats de chaque étape sont multipliés ensemble.

  1. Catégorisation par classe de caractères et longueur. Il détermine si le domaine est composé de toutes les lettres, de tous les chiffres, lettres et chiffres, ou s'il contient un trait d'union. Il donne ensuite une valeur numérique déterminée par la longueur du domaine. J'ai trouvé qu'il y avait une étrange baisse de valeur autour de la longueur 5. Je soupçonne que cela est dû à l'échantillonnage: les domaines plus courts sont précieux en raison de leur longueur (même si les lettres sont absurdes), tandis que la plupart des domaines plus longs ont tendance à être des mots / phrases. Afin d'empêcher le surapprentissage, je mets une restriction en ce que les domaines ne peuvent pas être pénalisés pour être plus courts (donc la longueur 5 est au moins aussi bonne que la longueur 6).

  2. Évaluation du contenu des mots. J'utilise le dictionnaire pour déterminer la longueur des mots gauche et droit dans un nom de domaine. Par exemple myawesomesite -> my & site -> 2 & 4,. Ensuite, j'essaie de faire un ajustement en fonction de la proportion du nom de domaine qui est constituée par ces mots. Des valeurs faibles indiquent généralement que le domaine ne contient pas de mot, contient un mot pluralisé / modifié qui n'est pas dans le dictionnaire, contient un mot entouré d'autres caractères (les mots internes ne sont pas détectés, bien que j'aie essayé sans amélioration), ou contient un phrase de plusieurs mots. Des valeurs élevées indiquent qu'il s'agit d'un seul mot ou probablement d'une phrase de deux mots.

  3. Évaluation du contenu des personnages. J'ai cherché des sous-chaînes contenues dans de nombreux domaines et qui semblaient affecter les valeurs du domaine. Je crois que cela est dû au fait que certains types de mots sont plus populaires / plus attrayants, pour diverses raisons. Par exemple, la lettre iest apparue dans environ la moitié des domaines (741 d'entre eux) et augmente la valeur du domaine d'environ 12% en moyenne. Ce n'est pas exagéré; il y a quelque chose de réel là-bas, que je ne comprends pas bien. La lettre lapparaît dans 514 domaines et a un facteur de 0,84. Certaines des lettres / digraphes les moins courants, comme ceux nequi sont apparus 125 fois et ont un facteur très faible de 0,56, pourraient être trop adaptés.

Afin d'améliorer ce programme, j'aurais probablement besoin d'utiliser un apprentissage automatique d'une certaine sorte. De plus, je pourrais rechercher des relations entre la longueur, le contenu des mots et le contenu des caractères pour trouver de meilleures façons de combiner ces résultats distincts dans la valeur d'évaluation globale.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.