도메인 네임 감정


25

도메인 네임 거래는 큰 사업입니다. 도메인 이름 거래에 가장 유용한 도구 중 하나는 자동 평가 도구이므로 지정된 도메인의 가치를 쉽게 추정 할 수 있습니다. 불행히도 많은 자동 평가 서비스를 이용하려면 회원 / 가입이 필요합니다. 이 과제에서는 .com 도메인의 값을 대략적으로 추정 할 수있는 간단한 평가 도구를 작성합니다.

입출력

입력으로 프로그램은 한 줄에 하나씩 도메인 이름 목록을 가져와야합니다. 각 도메인 이름은 정규식과 일치하므로 ^[a-z0-9][a-z0-9-]*[a-z0-9]$소문자, 숫자 및 하이픈으로 구성됩니다. 각 도메인은 2 자 이상이며 하이픈으로 시작하거나 끝나지 않습니다. 는 .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이 아닌 자연 로그를 사용하고 있습니다.)

데이터 소스

도메인 경매 웹 사이트 Flippa 에서 최근에 판매 한 1,400 개가 넘는 .com 도메인 목록을 정리했습니다 . 이 데이터는 교육 데이터 세트를 구성합니다. 제출 기간이 끝나면 시험 데이터 세트를 작성하기 위해 한 달 더 기다릴 것입니다. 교육 / 테스트 세트의 크기를 늘리기 위해 다른 소스에서 데이터를 수집하도록 선택할 수도 있습니다.

훈련 데이터는 다음 요점에서 사용할 수 있습니다. (면책 조항 : 일부 명백한 NSFW 도메인을 제거하기 위해 간단한 필터링을 사용했지만 일부는 여전히이 목록에 포함될 수 있습니다. 또한 인식하지 못하는 도메인을 방문하지 않는 것이 좋습니다.) 오른쪽의 숫자는 실제 가격. https://gist.github.com/PhiNotPi/46ca47247fe85f82767c82c820d730b5

다음은 훈련 데이터 세트의 가격 분포 그래프입니다. x 축은 가격의 자연적인 로그이며 y 축은 계산됩니다. 각 막대의 너비는 0.5입니다. 소스 웹 사이트에서 최소 5 달러 씩 입찰해야하므로 왼쪽의 급상승은 1 달러와 6 달러에 해당합니다. 테스트 데이터는 분포가 약간 다를 수 있습니다.

여기에 이미지 설명을 입력하십시오

다음은 막대 너비가 0.2 인 동일한 그래프에 대한 링크 입니다. 이 그래프에서 $ 11과 $ 16에 급등을 볼 수 있습니다.


도메인을 점수 매기기 위해 가장 일반적인 digraphs를 사용하여 머리를 숙여! R² ≅ 0

2
누군가 분명히 이것을 위해 신경망 답변을해야합니다.
user48538

1
프로그램을 인터넷에 연결할 수 있습니까 (예 : Google 검색어)? 물론 가격을 찾아보기위한 것이 아니라 특성으로 사용할 데이터를 수집하기위한 것입니다.
Joe

@Joe 죄송 합니다만 응답 할 기회가 없었지만 인터넷 액세스를 허용하기로 결정했습니다.
PhiNotPi

답변:


3

펄, 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합니다. 히스토그램에서 각각 O16 개의 도메인을 나타냅니다.

스케일은로 설정됩니다 1 character width = e^(1/3).

여기에 이미지 설명을 입력하십시오

이 프로그램에는 세 가지 주요 단계가 있습니다. 각 단계의 결과가 서로 곱해집니다.

  1. 문자 클래스 및 길이별로 분류합니다. 도메인이 모든 문자, 모든 숫자, 문자 및 숫자인지 또는 하이픈을 포함하는지 여부를 판별합니다. 그런 다음 도메인 길이에 따라 결정된 숫자 값을 제공합니다. 나는 길이 5에 대한 값의 이상한 하락이 있음을 발견했다. 나는 이것이 샘플링 때문이라고 생각한다. 더 짧은 도메인은 길이 때문에 (문자가 말이 아닌 경우에도) 가치가 있지만, 가장 긴 도메인은 단어 / 구절 인 경향이있다. 과적 합을 막기 위해 도메인을 짧게해서 불이익을받을 수 없다는 제한을 두었습니다 (길이 5는 길이 6 이상).

  2. 단어 내용의 평가. 사전을 사용하여 도메인 이름에서 왼쪽 및 오른쪽 단어의 길이를 결정합니다. 예를 들면 다음과 같습니다 myawesomesite -> my & site -> 2 & 4. 그런 다음 해당 단어로 구성되는 도메인 이름의 비율에 따라 약간의 피팅을 시도합니다. 낮은 값은 일반적으로 도메인에 단어가 포함되어 있지 않거나 사전에없는 복수 / 수정 된 단어가 포함되어 있거나 다른 문자로 둘러싸인 단어가 포함되어 있거나 (내부 단어는 검색되지 않았지만 개선없이 시도했지만) 여러 단어로 된 문구. 값이 크면 단일 단어이거나 두 단어로 된 것입니다.

  3. 캐릭터 내용의 평가. 많은 도메인에 포함되어 있고 도메인 값에 영향을 미치는 것으로 보이는 하위 문자열을 찾았습니다. 나는 이것이 여러 가지 이유로 특정 유형의 단어가 더 인기 있고 매력적이라고 ​​생각합니다. 예를 들어, 편지 i는 도메인의 약 절반 (741 개)에 나타 났으며 도메인 값은 평균 약 12 ​​% 상승했습니다. 지나치게 적합하지 않습니다. 내가 완전히 이해하지 못하는 것이 있습니다. 이 편지 l는 514 개의 도메인에 나타나며 계수는 0.84입니다. ne125 배로 나타나고 실제로 0.56의 낮은 요소를 갖는 것과 같이 덜 일반적인 글자 / 문구는 과도하게 적합 할 수 있습니다.

이 프로그램을 향상시키기 위해서는 일종의 기계 학습을 사용해야 할 것입니다. 또한 길이, 단어 내용 및 문자 내용 사이의 관계를 찾아 별도의 결과를 전체 평가 값으로 결합하는 더 나은 방법을 찾을 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.