Neo Inspiration

Avatar

中の人:jakkrokk (HN統一しました) がphp,javascript,air,flex などなど好き勝手書いてます。仕事は主にWEBシステムの設計と開発、SEO全般など。

Air-Seo Scouter をバージョンアップしました

http://neoinspire.net/air-seo-download ←こちらに移動しました

リリースしてたいしてたってないのに、
反響大きくてびっくりです。
使ってくれてる皆様に感謝です。

で まあ早速いくつかコメントとかもらったものに関して
追加してみたりしたので、
Ver1.1としてアップしてあります。

追加機能

・ドメインエイジの取得
・ヤフカテ登録のチェック

の2点

ドメインエイジに関しては
すげー綿密に作ることも可能だったんですが、
一般的に出回ってるほぼ全てと同じように
web archive を元に抽出しているので、
実際に取得した日付よりも若干後(ようはweb archiveが初めてキャッシュした日付)
から起算する形になっています。

あとドメインエイジに関しては結構重たいので、
ロードしっぱなしにしておいて
どんどんURL突っ込んでもらって大丈夫です。
(Ajaxで処理ってるんで、時間がたてば全部ちゃんとロードします)

バグフィックス

・直接フォームに書き込めなかった(致命的すぐるww)

の1点です。
なぜか return false してたので
クリックしても書き込めないという。

ということで

ということでこちらからダウンロードどうぞ

http://neoinspire.net/air-seo/air_seo_ver1.1.air

以下初めての方の為に

インストール方法

Adobe Airがインストールされていないと動きませんので、
まずはここからAdobe Airをインストールしてください。
(Flashプレイヤーみたいなもんです)
 ⇒デスクトップガジェットとか入れてる方は既に入ってる可能性もあります。

http://get.adobe.com/jp/air/

1,2分で終わりますので、
インストールが終わったら、これをダウンロード
http://neoinspire.net/air-seo/air_seo_ver1.1.air

で、ダウンロードしたものをダブルクリックでオワリ。

WebSiteAnalyzer を更新しました

WebSiteAnalyzer

一日100アクセスくらいあって割とユーザさんがいたので、
仕事の合間に改良しつづけたクラスを使ってリンク解析プログラムを作ってみました。

解析するといっても単純に、
リンク元のURLにアクセスして、
・アンカーテキストの文字列(Googleと同じく最初の1個のみ)
・アンカーテキストの前後にある文字列
を取得してくるだけです。

外部->内部リンク数の部分が表示されたら、
「バックリンク分析」というリンクを押してみてください。
それでも結構処理が遅いので、まあゆっくり使ってみてください。

なんでこんな遅いかっていうと
処理する部分じゃなくて、
相手のWEBサーバにアクセスする部分がボトルネックなんですよね。
fsockopenにタイムアウト2秒、さらにヘッダが決まったバイト数以上きたらカット

などなど仕込んでるのにそれでもやっぱり遅いです。
もうちょいここはチューニングしないとなぁ。。

http://neoinspire.net/seotools/

Ngramを利用したページ類似度チェッカー+Ngram計算のphpクラス

Ngramを利用したページ類似度チェッカー+Ngram計算のphpクラス

Ngram

まあ何がやりたかったって
スパムチェック的な類似度チェッカーです。

こんなかんじ。
類似度チェッカー

全く違うURLだと5~10%くらいになって
ちょっと関係がある(リンク紹介してたり)すると20%くらいかな
同じブログの違う記事とかだと40%くらいになって
60%超えたらかなり似てるページってかんじのラインです。

例えば wikiの アイスランドのページとアイルランドのページとかでやると
重複度77%とかになります。

Googleは言語にとらわれない解析方法を使っているとのことなので、
高確率で、どっかにNgramは使ってると思うので、
デュプリケイトコンテンツとかの参考に使えるかなーと。

一応ソース公開

たいしたものじゃないんですが、たいしたものじゃないだけに
ソースくらい出しとけというお話です。

アルゴリズム的には単純に
・URLからタグを引っぺがす
・出てきたテキストのNgram(3)を抽出
・2個URLの共通項を出す(php の array_instersect 使っただけ)
・(共通項の数 / Ngram(3)の個数) %

まあなんか array_intersect とarray_diff がま逆の動きをしないので
あやしいんですが。。
ソースを追うのもめんどいので後で検証。

使い方

Newして(引数でNgram2,3とかコントロール)
RunメソッドにURL突っ込むだけです。

こんなかんじです。
(以下見やすくする為にインデントを全角スペースに変換してあります。)

$Ngram = new CreateNgram();
if($Ngram->run(“http://neoinspire.net/archives/92″,”http://neoinspire.net/archives/90″)){
  print($Ngram->result);
  echo”<pre>”;
  print_r($Ngram->mainNgram);
  print_r($Ngram->checkNgram);
  echo”</pre>”;
}else{
  echo “対象のURLを解析できませんでした。”;
}

以下ソースです。コピペしてUTF8で保存してください。

<?php
/*
*2つのURLのNgramを比較して類似度を出すクラス
*引数を一つで出した場合単純に対象URLのNgramを抽出する
*/
Class CreateNgram{

  var $mainNgram; //第一引数URLのNgram
  var $checkNgram; //第二引数URLのNgram

  var $ngram; //Ngramをいくつでやるか
  var $result; //類似度

  function CreateNgram($ngram=3){
    $this->ngram = $ngram;
  }

  function run($mainUrl=null,$checkUrl=null){
    if(!empty($mainUrl) && !empty($checkUrl)){
      if($mainHtml = mb_convert_encoding(@file_get_contents($mainUrl), ‘UTF-8′, ‘auto’))
        $this->mainNgram = $this->_ngram($this->_solid($mainHtml));

      if($checkHtml = mb_convert_encoding(@file_get_contents($checkUrl), ‘UTF-8′, ‘auto’))
        $this->checkNgram = $this->_ngram($this->_solid($checkHtml));

      if(!empty($this->mainNgram) && !empty($this->checkNgram)){
        $mainResult = @array_intersect($this->mainNgram,$this->checkNgram);
        $checkResult = @array_intersect($this->checkNgram,$this->mainNgram);
        $result1 = count($mainResult);
        $result2 = count($checkResult);
        $cnt1 = count($this->mainNgram);
        $cnt2 = count($this->checkNgram);
        $this->result = @round((($result1 + $result2) / ($cnt1 + $cnt2)),3);
        return true;
      }else{
        return false;
      }
    }else{
      return false;
    }
  }

  function _ngram($query=null){
    $query = trim($query);
    if(!empty($query)){
      $len = mb_strlen($query,’UTF-8′);
      for($i=0; $i< $len; $i++){
        $buf = trim(mb_substr($query, $i, $this->ngram,’UTF-8′));
        if(isset($buf))$ngrams[] = $buf;
      }
    }else{
      $ngrams = “”;
    }
    return $ngrams;
  }

  function _solid($html=null){
    if($html){
      $pat[]=”/<script.+?\/script>/is”;
      $pat[]=”/<style.+?\/style>/is”;
      $pat[]=”/<\!\-\-.+?\-\->/is”;
      $pat[]=”/<.*?>/is”;
      $pat[]=”/\r|\n|\s/is”;
      $rep=”";
      return preg_replace($pat,$rep,$html);
    }else{
      return “”;
    }
  }
}
?>

Continue Next page

Twitter