Evaluación de nombre de dominio

25

El comercio de nombres de dominio es un gran negocio. Una de las herramientas más útiles para el comercio de nombres de dominio es una herramienta de evaluación automática, para que pueda estimar fácilmente cuánto vale un dominio determinado. Desafortunadamente, muchos servicios de evaluación automática requieren una membresía / suscripción para su uso. En este desafío, escribirá una herramienta de evaluación simple que puede estimar aproximadamente los valores de los dominios .com.

De entrada y salida

Como entrada, su programa debe tomar una lista de nombres de dominio, uno por línea. Cada nombre de dominio coincidirá con la expresión regular ^[a-z0-9][a-z0-9-]*[a-z0-9]$, lo que significa que se compone de letras minúsculas, dígitos y guiones. Cada dominio tiene al menos dos caracteres y no comienza ni termina con un guión. El .comse omite de cada dominio, ya que está implícito.

Como una forma alternativa de entrada, puede elegir aceptar un nombre de dominio como una matriz de enteros, en lugar de una cadena de caracteres, siempre que especifique la conversión de caracteres a enteros deseada.

Su programa debería generar una lista de enteros, uno por línea, que proporciona los precios de tasación de los dominios correspondientes.

Internet y archivos adicionales

Su programa puede tener acceso a archivos adicionales, siempre que proporcione estos archivos como parte de su respuesta. Su programa también puede acceder a un archivo de diccionario (una lista de palabras válidas, que no tiene que proporcionar).

(Editar) He decidido ampliar este desafío para permitir que su programa acceda a Internet. Hay un par de restricciones, ya que su programa no puede buscar los precios (o historiales de precios) de ningún dominio, y que solo utiliza servicios preexistentes (este último para cubrir algunas lagunas).

El único límite en el tamaño total es el límite de tamaño de respuesta impuesto por SE.

Entrada de ejemplo

Estos son algunos dominios vendidos recientemente. Descargo de responsabilidad: aunque ninguno de estos sitios parece malicioso, no sé quién los controla y, por lo tanto, desaconsejo visitarlos.

6d3
buyspydrones
arcader
counselar
ubme
7483688
buy-bikes
learningmusicproduction

Salida de ejemplo

Estos números son reales.

635
31
2000
1
2001
5
160
1

Tanteo

La puntuación se basará en la "diferencia de logaritmos". Por ejemplo, si un dominio se vendió por $ 300 y su programa lo evaluó en $ 500, su puntaje para ese dominio es abs (ln (500) -ln (300)) = 0.5108. Ningún dominio tendrá un precio inferior a $ 1. Su puntaje general es su puntaje promedio para el conjunto de dominios, con puntajes más bajos mejores.

Para tener una idea de qué puntajes debe esperar, simplemente adivinando una constante 36para los datos de entrenamiento a continuación se obtiene un puntaje de aproximadamente 1.6883. Un algoritmo exitoso tiene un puntaje menor que este.

Elegí usar logaritmos porque los valores abarcan varios órdenes de magnitud, y los datos se llenarán de valores atípicos. El uso de la diferencia absoluta en lugar de la diferencia al cuadrado ayudará a reducir el efecto de los valores atípicos en la puntuación. (Además, tenga en cuenta que estoy usando el logaritmo natural, no base 2 o base 10.)

Fuente de datos

He hojeado una lista de más de 1,400 dominios .com vendidos recientemente de Flippa , un sitio web de subastas de dominios. Estos datos conformarán el conjunto de datos de entrenamiento. Una vez finalizado el período de envío, esperaré un mes adicional para crear un conjunto de datos de prueba, con el que se puntuarán los envíos. También podría optar por recopilar datos de otras fuentes para aumentar el tamaño de los conjuntos de entrenamiento / prueba.

Los datos de entrenamiento están disponibles en el siguiente resumen. (Descargo de responsabilidad: aunque he utilizado un filtro simple para eliminar algunos dominios de NSFW descaradamente, aún podrían incluirse varios en esta lista. Además, le aconsejo que no visite ningún dominio que no reconozca ). Los números en el lado derecho son Los precios reales. https://gist.github.com/PhiNotPi/46ca47247fe85f82767c82c820d730b5

Aquí hay un gráfico de la distribución de precios del conjunto de datos de capacitación. El eje x es el logaritmo natural del precio, con el eje y contando. Cada barra tiene un ancho de 0.5. Los picos a la izquierda corresponden a $ 1 y $ 6 ya que el sitio web fuente requiere que las ofertas incrementen al menos $ 5. Los datos de la prueba pueden tener una distribución ligeramente diferente.

ingrese la descripción de la imagen aquí

Aquí hay un enlace al mismo gráfico con un ancho de barra de 0.2. En ese gráfico puedes ver picos a $ 11 y $ 16.

PhiNotPi
fuente
Solo un aviso, ¡usar los dígrafos más comunes para calificar un dominio funciona abismalmente! R² ≅ 0
2
Obviamente, alguien necesita hacer una respuesta de red neuronal para esto.
user48538
1
¿Se puede vincular el programa a internet (por ejemplo, consultar google)? Explícitamente no con el propósito de buscar precios, por supuesto, sino para recopilar datos para usar como característica.
Joe
@ Joe Perdón, no he tenido la oportunidad de responder, pero he decidido permitir el acceso a Internet.
PhiNotPi

Respuestas:

3

Perl, 1.38605

Pensé que debería seguir adelante y publicar mi propia presentación, con la esperanza de que estimule la competencia. Su puntaje 1.38605significa que generalmente está desactivado por un factor de 3.999(ese fue mi punto de parada). No utilicé ninguna biblioteca de aprendizaje automático, solo directamente Perl. Requiere acceso a un diccionario; Usé el de aquí .

Siéntase libre de usar algunos de los números / estadísticas de mi programa en los suyos.

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;

Aquí hay un gráfico hecho por mi programa de puntuación, que muestra un diagrama de dispersión de la evaluación sobre el precio real y un histograma de los errores. En el diagrama de dispersión dominios .:oO@medios 10, 20, 30, 40, 50en ese punto, respectivamente. En el histograma cada uno Orepresenta 16 dominios.

La escala se establece en 1 character width = e^(1/3).

ingrese la descripción de la imagen aquí

Hay tres pasos principales para este programa. Los resultados de cada paso se multiplican juntos.

  1. Categorización por clase de personaje y longitud. Determina si el dominio es todas las letras, todos los números, letras y números, o si contiene un guión. Luego da un valor numérico determinado por la longitud del dominio. Descubrí que hay una caída extraña en el valor alrededor de la longitud 5. Sospecho que esto se debe al muestreo: los dominios más cortos son valiosos debido a su longitud (incluso si las letras no tienen sentido), mientras que la mayoría de los dominios más largos tienden a ser palabras / frases. Para evitar el sobreajuste, pongo una restricción en que los dominios no pueden ser penalizados por ser más cortos (por lo que la longitud 5 es al menos tan buena como la longitud 6).

  2. Evaluación del contenido de palabras. Utilizo el diccionario para determinar la longitud de las palabras de la izquierda y la derecha en un nombre de dominio. Por ejemplo, myawesomesite -> my & site -> 2 & 4. Luego, trato de hacer algunos ajustes basados ​​en qué proporción del nombre de dominio está compuesto por esas palabras. Los valores bajos generalmente indican que el dominio no contiene una palabra, contiene una palabra pluralizada / modificada que no está en el diccionario, contiene una palabra rodeada de otros caracteres (no se detectan palabras internas, aunque lo intenté sin ninguna mejora) o contiene un frase de varias palabras Los valores altos indican que es una sola palabra o probablemente una frase de dos palabras.

  3. Evaluación del contenido del personaje. Busqué subcadenas que estaban contenidas en muchos dominios y que parecían afectar los valores del dominio. Creo que esto es causado por ciertos tipos de palabras que son más populares / más atractivas, por varias razones. Por ejemplo, la carta iapareció en aproximadamente la mitad de los dominios (741 de ellos) y aumenta el valor del dominio en aproximadamente un 12% en promedio. Eso no es sobreajustar; Hay algo real allí, que no entiendo completamente. La letra laparece en 514 dominios y tiene un factor de 0,84. Algunas de las letras / dígrafos menos comunes, como las neque aparecieron 125 veces y tienen un factor realmente bajo de 0,56, podrían ser demasiado adecuadas.

Para mejorar este programa, probablemente necesite usar algún tipo de aprendizaje automático. Además, podría buscar relaciones entre longitud, contenido de palabras y contenido de caracteres para encontrar mejores formas de combinar esos resultados separados en el valor de evaluación general.

PhiNotPi
fuente