Avaliação de Nome de Domínio


25

A negociação de nomes de domínio é um grande negócio. Uma das ferramentas mais úteis para negociação de nomes de domínio é uma ferramenta de avaliação automática, para que você possa estimar facilmente quanto vale um determinado domínio. Infelizmente, muitos serviços de avaliação automática exigem uma associação / assinatura para serem usados. Nesse desafio, você escreverá uma ferramenta de avaliação simples que pode estimar aproximadamente os valores dos domínios .com.

Entrada / Saída

Como entrada, seu programa deve ter uma lista de nomes de domínio, um por linha. Cada nome de domínio corresponderá ao regex ^[a-z0-9][a-z0-9-]*[a-z0-9]$, o que significa que ele é composto de letras minúsculas, dígitos e hífens. Cada domínio tem pelo menos dois caracteres e nem começa nem termina com um hífen. O .comé omitido de cada domínio, pois está implícito.

Como uma forma alternativa de entrada, você pode optar por aceitar um nome de domínio como uma matriz de números inteiros, em vez de uma sequência de caracteres, desde que você especifique a conversão desejada de caractere para inteiro.

Seu programa deve gerar uma lista de números inteiros, um por linha, que fornece os preços avaliados dos domínios correspondentes.

Internet e arquivos adicionais

Seu programa pode ter acesso a arquivos adicionais, desde que você os forneça como parte de sua resposta. Seu programa também tem permissão para acessar um arquivo de dicionário (uma lista de palavras válidas, que você não precisa fornecer).

(Editar) Decidi expandir esse desafio para permitir que seu programa acesse a Internet. Existem algumas restrições: o seu programa não pode procurar os preços (ou históricos de preços) de nenhum domínio e usa apenas serviços preexistentes (o último para cobrir algumas brechas).

O único limite para o tamanho total é o limite de tamanho da resposta imposto pelo SE.

Exemplo de entrada

Esses são alguns domínios vendidos recentemente. Isenção de responsabilidade: Embora nenhum desses sites pareça malicioso, não sei quem os controla e, portanto, desaconselho a visitá-los.

6d3
buyspydrones
arcader
counselar
ubme
7483688
buy-bikes
learningmusicproduction

Saída de exemplo

Esses números são reais.

635
31
2000
1
2001
5
160
1

Pontuação

A pontuação será baseada na "diferença de logaritmos". Por exemplo, se um domínio foi vendido por US $ 300 e seu programa o avaliou em US $ 500, sua pontuação nesse domínio é abs (ln (500) -ln (300)) = 0,5108. Nenhum domínio terá um preço inferior a US $ 1. Sua pontuação geral é a pontuação média para o conjunto de domínios, com pontuações mais baixas melhores.

Para ter uma idéia de quais pontuações você deve esperar, basta adivinhar uma constante 36para os dados de treinamento abaixo, resultando em uma pontuação de aproximadamente 1.6883. Um algoritmo de sucesso tem uma pontuação menor que isso.

Eu escolhi usar logaritmos porque os valores abrangem várias ordens de magnitude e os dados serão preenchidos com valores discrepantes. O uso da diferença absoluta em vez da diferença ao quadrado ajudará a reduzir o efeito dos valores discrepantes na pontuação. (Observe também que estou usando o logaritmo natural, não a base 2 ou a base 10.)

Fonte de dados

Passei por uma lista de mais de 1.400 domínios .com recentemente vendidos da Flippa , um site de leilão de domínios. Esses dados formarão o conjunto de dados de treinamento. Depois que o período de envio terminar, esperarei um mês adicional para criar um conjunto de dados de teste, com o qual os envios serão pontuados. Também posso optar por coletar dados de outras fontes para aumentar o tamanho dos conjuntos de treinamento / teste.

Os dados do treinamento estão disponíveis na seguinte essência. (Isenção de responsabilidade: embora eu tenha usado alguma filtragem simples para remover alguns domínios flagrantemente NSFW, vários ainda podem estar nessa lista. Além disso, eu aconselho a não visitar qualquer domínio que você não reconheça .) Os números à direita são os verdadeiros preços. https://gist.github.com/PhiNotPi/46ca47247fe85f82767c82c820d730b5

Aqui está um gráfico da distribuição de preços do conjunto de dados de treinamento. O eixo x é o logaritmo natural de preço, com o eixo y sendo contado. Cada barra tem uma largura de 0,5. Os picos à esquerda correspondem a US $ 1 e US $ 6, pois o site de origem exige que os lances aumentem pelo menos US $ 5. Os dados do teste podem ter uma distribuição ligeiramente diferente.

insira a descrição da imagem aqui

Aqui está um link para o mesmo gráfico com uma largura de barra de 0,2. Nesse gráfico, você pode ver picos de US $ 11 e US $ 16.


Apenas um aviso, usar os dígrafos mais comuns para classificar um domínio funciona de maneira horrível! R² ≅ 0

2
Alguém obviamente precisa fazer uma resposta da rede neural para isso.
user48538

1
O programa pode se conectar à Internet (por exemplo, consultar o google)? Explicitamente não com o objetivo de procurar preços, é claro, mas de coletar dados para usar como uma característica.
218 Joe Joe

@ Joe Desculpe, não tive a chance de responder, mas decidi permitir o acesso à Internet.
PhiNotPi 11/07/16

Respostas:


3

Perl, 1.38605

Achei que deveria ir em frente e postar minha própria inscrição, na esperança de que isso provoque concorrência. Sua pontuação 1.38605significa que normalmente é desativado por um fator de3.999 (esse foi o meu ponto de parada). Não usei nenhuma biblioteca de aprendizado de máquina, apenas o Perl. Requer acesso a um dicionário; Eu usei o daqui .

Sinta-se à vontade para usar alguns dos números / estatísticas do meu programa por conta própria.

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;

Aqui está um gráfico feito pelo meu programa de pontuação, mostrando um gráfico de dispersão da avaliação sobre o preço real e um histograma dos erros. No gráfico de dispersão .:oO@, os 10, 20, 30, 40, 50domínios médios nesse ponto, respectivamente. No histograma, cada um Orepresenta 16 domínios.

A escala está definida em 1 character width = e^(1/3).

insira a descrição da imagem aqui

Existem três etapas principais para este programa. Os resultados de cada etapa são multiplicados juntos.

  1. Categorização por classe e comprimento de caractere. Determina se o domínio é todas as letras, todos os números, letras e números ou se contém um hífen. Em seguida, fornece um valor numérico determinado pelo comprimento do domínio. Descobri que há uma queda estranha no valor em torno do comprimento 5. Suspeito que isso se deva à amostragem: domínios mais curtos são valiosos devido ao seu comprimento (mesmo que as letras sejam absurdas), enquanto os domínios mais longos tendem a ser palavras / frases. Para impedir o sobreajuste, coloquei uma restrição em que os domínios não podem ser penalizados por serem mais curtos (o comprimento 5 é pelo menos tão bom quanto o comprimento 6).

  2. Avaliação do conteúdo da palavra. Uso o dicionário para determinar os comprimentos das palavras da esquerda e da direita em um nome de domínio. Por exemplo,myawesomesite -> my & site -> 2 & 4 ,. Então, tento fazer alguns ajustes com base em que proporção do nome de domínio é composta por essas palavras. Valores baixos geralmente indicam que o domínio não contém uma palavra, contém uma palavra pluralizada / modificada que não está no dicionário, contém uma palavra cercada por outros caracteres (palavras internas não são detectadas, embora eu tenha tentado isso sem aprimoramento) ou contém um frase de várias palavras. Valores altos indicam que é uma palavra única ou provavelmente uma frase de duas palavras.

  3. Avaliação do conteúdo do personagem. Procurei substrings que estavam contidos em muitos domínios e que pareciam afetar os valores do domínio. Acredito que isso seja causado pelo fato de certos tipos de palavras serem mais populares / mais atraentes, por várias razões. Por exemplo, a carta iapareceu em cerca da metade dos domínios (741 deles) e aumenta o valor do domínio em cerca de 12%, em média. Isso não é demais; há algo real lá, que eu não entendo completamente. A letra laparece em 514 domínios e tem um fator de 0,84. Algumas das letras / dígrafos menos comuns, como as neque apareceram 125 vezes e têm um fator realmente baixo de 0,56, podem estar se ajustando demais.

Para melhorar esse programa, eu provavelmente precisaria usar algum tipo de aprendizado de máquina. Além disso, eu poderia procurar relações entre comprimento, conteúdo de palavras e conteúdo de caracteres para encontrar maneiras melhores de combinar esses resultados separados no valor geral da avaliação.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.