域名评估


25

域名交易是一项大生意。自动评估工具是域名交易中最有用的工具之一,因此您可以轻松估算给定域名的价值。不幸的是,许多自动评估服务要求使用会员资格/订阅。在此挑战中,您将编写一个简单的评估工具,可以大致估算.com域的值。

输入输出

作为输入,您的程序应采用域名列表,每行一个。每个域名都将与正则表达式匹配^[a-z0-9][a-z0-9-]*[a-z0-9]$,这意味着它由小写字母,数字和连字符组成。每个域的长度至少为两个字符,并且都不能以连字符开头或结尾。在.com从每个域被省略,因为它是隐含的。

作为输入的另一种形式,只要指定所需的字符到整数的转换,就可以选择将域名接受为整数数组而不是字符串。

您的程序应输出一个整数列表,每行一个,它给出了相应域的评估价格。

互联网和其他文件

只要您提供这些文件作为答案的一部分,您的程序就可以访问其他文件。您的程序也被允许访问字典文件(无需提供有效单词的列表)。

(编辑)我已决定扩展此挑战,以允许您的程序访问Internet。有两个限制,即您的程序无法查询任何域的价格(或价格历史记录),并且它仅使用预先存在的服务(后者掩盖了某些漏洞)。

总大小的唯一限制是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为底。)

数据源

我已经从域名拍卖网站Flippa上浏览了最近出售的1400多个.com域名列表。该数据将构成训练数据集。提交期结束后,我将等待另外一个月的时间来创建测试数据集,并对提交的数据进行评分。我可能还会选择从其他来源收集数据,以增加训练/测试集的大小。

培训数据可在以下要点获得。(免责声明:尽管我使用了一些简单的过滤方法来删除了一些公然的NSFW域,但该列表中仍可能包含一些域。此外,我建议不要访问您不认识的任何域。)右侧的数字是真实的价格。 https://gist.github.com/PhiNotPi/46ca47247fe85f82767c82c820d730b5

这是训练数据集的价格分布图。x轴是价格的自然对数,y轴是计数。每个条的宽度为0.5。左侧的峰值分别对应$ 1和$ 6,因为来源网站要求出价至少增加$ 5。测试数据的分布可能略有不同。

在此处输入图片说明

这是条形图宽度为0.2的同一图形的链接。在该图中,您可以看到峰值分别为11美元和16美元。


只需抬起头,使用最常见的有向图对一个域评分就可以了!R 2≅0

2
显然,有人需要为此做一个神经网络答案。
user48538 '16

1
该程序可以链接到互联网(例如查询Google)吗?当然,明确不是为了查找价格,而是为了收集数据以用作特征。

@Joe对不起,我没有机会回应,但我决定允许互联网访问。
PhiNotPi

Answers:


3

Perl,1.38865

我认为我应该继续并发表自己的意见,希望它能刺激竞争。它的得分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,可能会过拟合。

为了改进该程序,我可能需要使用某种机器学习。另外,我可以寻找长度,单词内容和字符内容之间的关系,以找到更好的方法将这些单独的结果组合到总体评估值中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.