Оценка доменного имени

25

Торговля доменными именами - это большой бизнес. Одним из наиболее полезных инструментов для торговли доменными именами является инструмент автоматической оценки, позволяющий легко оценить, сколько стоит данный домен. К сожалению, многие службы автоматической оценки требуют членства / подписки для использования. В этом задании вы напишите простой инструмент оценки, который может приблизительно оценить значения доменов .com.

Ввод, вывод

В качестве входных данных ваша программа должна взять список доменных имен, по одному на строку. Каждое доменное имя будет соответствовать регулярному выражению ^[a-z0-9][a-z0-9-]*[a-z0-9]$, что означает, что оно состоит из строчных букв, цифр и дефисов. Каждый домен имеет длину не менее двух символов и не начинается и не заканчивается дефисом. Значение .comопускается в каждом домене, поскольку оно подразумевается.

В качестве альтернативной формы ввода вы можете принять доменное имя в виде массива целых чисел, а не строки символов, если вы указываете желаемое преобразование символа в целое число.

Ваша программа должна вывести список целых чисел, по одному на строку, в котором указаны оценочные цены соответствующих доменов.

Интернет и дополнительные файлы

Ваша программа может иметь доступ к дополнительным файлам, если вы предоставите эти файлы как часть вашего ответа. Ваша программа также имеет доступ к файлу словаря (список допустимых слов, которые вы не должны предоставлять).

(Изменить) Я решил расширить эту задачу, чтобы позволить вашей программе получить доступ к Интернету. Есть пара ограничений: ваша программа не может искать цены (или историю цен) каких-либо доменов и использует только ранее существующие сервисы (последний скрывает некоторые лазейки).

Единственное ограничение на общий размер - это ограничение размера ответа, установленное SE.

Пример ввода

Это несколько недавно проданных доменов. Отказ от ответственности: хотя ни один из этих сайтов не выглядит вредоносным, я не знаю, кто их контролирует, и поэтому советую не посещать их.

6d3
buyspydrones
arcader
counselar
ubme
7483688
buy-bikes
learningmusicproduction

Пример вывода

Эти цифры реальны.

635
31
2000
1
2001
5
160
1

счет

Оценка будет основана на «разнице логарифмов». Например, если домен продан за 300 долларов, а ваша программа оценила его в 500 долларов, ваш счет для этого домена будет равен abs (ln (500) -ln (300)) = 0,5108. Ни один домен не будет иметь цену менее $ 1. Ваш общий балл - это ваш средний балл для набора доменов, с более низкими баллами.

Чтобы получить представление о том, каких результатов вы должны ожидать, просто угадав константу 36для приведенных ниже данных о тренировках, вы получите оценку около 1.6883. Успешный алгоритм имеет оценку меньше, чем это.

Я решил использовать логарифмы, потому что значения охватывают несколько порядков, и данные будут заполнены выбросами. Использование абсолютной разности вместо квадрата разницы поможет уменьшить влияние выбросов в оценке. (Также обратите внимание, что я использую натуральный логарифм, а не основание 2 или основание 10.)

Источник данных

Я просмотрел список из более чем 1400 недавно проданных доменов .com с Flippa , веб-сайта аукциона доменов. Эти данные составят набор обучающих данных. После того, как период подачи заявок закончится, я подожду еще месяц, чтобы создать тестовый набор данных, с помощью которого будут оцениваться заявки. Я мог бы также выбрать сбор данных из других источников, чтобы увеличить размер учебных / тестовых наборов.

Данные об обучении доступны по следующей теме. (Отказ от ответственности: хотя я использовал некоторую простую фильтрацию для удаления некоторых явных доменов NSFW, некоторые из них все еще могут содержаться в этом списке. Кроме того, я не советую посещать любой домен, который вы не узнаете .) Цифры справа настоящие цены. https://gist.github.com/PhiNotPi/46ca47247fe85f82767c82c820d730b5

Вот график распределения цен на обучающий набор данных. Ось X - натуральный логарифм цены с осью Y, считая. Каждая полоса имеет ширину 0,5. Пики слева соответствуют 1 и 6 долл. США, поскольку исходному веб-сайту требуются ставки, чтобы увеличить их как минимум на 5 долл. США. Тестовые данные могут иметь немного другое распределение.

введите описание изображения здесь

Вот ссылка на тот же график с шириной бара 0,2. На этом графике вы можете увидеть пики в $ 11 и $ 16.

PhiNotPi
источник
Просто один на один, использование самых распространенных орграфов для оценки домена работает ужасно! R² ≅ 0
2
Кто-то, очевидно, должен сделать ответ нейронной сети для этого.
user48538
1
Может ли программа связаться с интернетом (скажем, запросить в Google)? Явно, конечно, не с целью поиска цен, а для сбора данных для использования в качестве характеристики.
Джо
@Joe Извините, у меня не было возможности ответить, но я решил разрешить доступ в Интернет.
PhiNotPi

Ответы:

3

Perl, 1.38605

Я подумал, что должен пойти дальше и опубликовать свое собственное представление, в надежде, что это подстегнет конкуренцию. Его оценка 1.38605означает, что он, как правило, отключен 3.999(это был мой остановочный пункт). Я не использовал никаких библиотек машинного обучения, просто прямо на Perl. Требуется доступ к словарю; Я использовал один отсюда .

Пожалуйста, не стесняйтесь использовать некоторые цифры / статистику из моей программы самостоятельно.

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;

Вот график, сделанный моей оценочной программой, показывающий разброс графика оценки по фактической цене и гистограмму ошибок. На диаграмме рассеяния .:oO@обозначены 10, 20, 30, 40, 50домены в этой точке соответственно. На гистограмме каждый Oпредставляет 16 доменов.

Масштаб установлен на 1 character width = e^(1/3).

введите описание изображения здесь

Есть три основных шага к этой программе. Результаты каждого шага умножаются вместе.

  1. Категоризация по классу символов и длине. Он определяет, является ли домен всеми буквами, всеми цифрами, буквами и цифрами или содержит ли он дефис. Затем он дает числовое значение, определяемое длиной домена. Я обнаружил, что при длине 5 наблюдается странное падение значения. Я подозреваю, что это связано с выборкой: более короткие домены ценны из-за их длины (даже если буквы бессмысленны), в то время как большинство более длинных доменов, как правило, являются словами / фразами. Я приказываю предотвратить переоснащение, я накладываю ограничение на то, что домены не могут быть оштрафованы за то, что они короче (поэтому длина 5 по крайней мере так же хороша, как длина 6).

  2. Оценка содержания слова. Я использую словарь, чтобы определить длину левого и правого слова в доменном имени. Например, myawesomesite -> my & site -> 2 & 4. Затем я пытаюсь выполнить некоторые настройки, основываясь на том, какая доля доменного имени состоит из этих слов. Низкие значения обычно указывают на то, что домен не содержит слова, содержит множественное / измененное слово, отсутствующее в словаре, содержит слово, окруженное другими символами (внутренние слова не обнаружены, хотя я пытался это сделать без улучшения), или содержит Фраза из нескольких слов. Высокие значения указывают, что это одно слово или, скорее всего, фраза из двух слов.

  3. Оценка содержания персонажа. Я искал подстроки, которые содержались во многих доменах и которые, казалось, влияли на значения домена. Я полагаю, что это вызвано тем, что определенные типы слов более популярны / более привлекательны по разным причинам. Например, письмо iпоявилось примерно в половине доменов (741 из них) и увеличивает стоимость домена в среднем примерно на 12%. Это не переоснащение; там что-то настоящее, чего я не до конца понимаю. Письмо lпоявляется в 514 доменах и имеет коэффициент 0,84. Некоторые из менее распространенных букв / орграфов, neкоторые появляются 125 раз и имеют очень низкий коэффициент 0,56, могут быть переобучены.

Чтобы улучшить эту программу, мне, вероятно, понадобится какое-то машинное обучение. Кроме того, я мог бы искать взаимосвязи между длиной, содержанием слов и содержанием символов, чтобы найти более эффективные способы объединения этих отдельных результатов в общую ценность оценки.

PhiNotPi
источник