2018年 03月の投稿を表示しています

textlint のルールを作ってみた

先日、textlint というめちゃ便利な text を lint するツールの追加ルールを作ってみた話。ちょっと前にやったんだけど記事にしかけたまま止まってたのでいい加減に書いた次第。

作ったルール

sters/textlint-rule-a3rt-proofreading: [Unofficial] textlint rule that using A3RT Proofreading API.
textlint-rule-a3rt-proofreading - npm

A3RT という機械学習 API サービスの文章校正を textlint から利用できるようにしたもの。
文章校正 API は万能なものではなく、特定ドメインに特化しているので、こういった文章にも上手く適合してくれないこともあるが、とりあえず textlint から呼べるようにしてみるか、というくらいの気持ちでやった。

textlint とは

textlint/textlint: The pluggable natural language linter for text and markdown.

text を lint するツール。いろんな人の作ったいろんなルールを組み合わせて、最強の文章を作っていけるようになるはず。

prh と web+db ルールを入れるとたのしい。

textlint-rule/textlint-rule-prh: textlint rule for prh.

rules/WEB+DB_PRESS.yml at master · prh/rules

A3RT

A3RT
ABOUT|A3RT

A3RT(アート)は「ANALYTICS & ARTIFICIAL INTELLIGENCE API VIA RECRUIT TECHNOLOGIES」の略称です。
...
当初はA3RTについても、リクルートグループ内に限って導入してきましたが、以下のような理由からこのたびグループ外への提供を決意しました。

ちなみにこれ超重要なんですけど、私自身はリクルート社とは関係ないです。
今回作った textlint ルールは勝手にやったものなので何か問題があれば削除するなり対応するので連絡ください。

textlint ルールの作り方

textlint の中にツールがあるのでそれを使うとスケルトンが出来上がります(すごい)

参考: textlintのルールを簡単に作り始めることができるツールを作りました | Web Scratch

基本セットを作れるやつ
textlint/create-textlint-rule: Create textlint rule project with no configuration.

ビルドしたりテストしたりを出来る便利な子
textlint/textlint-scripts: textlint npm-run-scripts CLI help to create textlint rule.

textlint-scripts が超便利で、基本的にはテストの云々を何も気にしないで、ルールのロジックに集中してテストを書けたり。npm へ上げるときに、何も気にせず babel してくれたりするので、とりあえず ES2015+ なコードを書くと動いてくれるのですごい楽。

あとはドキュメントを見たり、データ構造を見たり、他のルールを見たりして、実装する。実装にあたってはヘルパーライブラリがあるので、これも使っていくと AST をこねこねするような込み入ったルールも簡単に書けそう。

ルールの作り方(データ構造とか)
textlint/rule.md at master · textlint/textlint

ヘルパーライブラリ
textlint/textlint-rule-helper: This is helper library for creating textlint rule.

おわり

独自のルール作るのが思いのほか簡単だったので、何か思うところがあれば作ってみるとよいのではー!
特に正規表現ベースのルールとかは作るのがめちゃんこ楽なのでーーーーー!!!

あいまいな VLOOKUP 関数。レーベンシュタイン距離を添えて。

完全に一致するものを探す VLOOKUP 関数ではなく、ある程度あいまいな VLOOKUP 関数がほしい状況になったので、やってみた件。

レーベンシュタイン距離を使うとお手軽にあいまい検索っぽいことができそうなので、これを利用する。
すげーざっくり言うと 2 つの文字列を比べて、片方から見た時に何文字変更したら一緒になりますか?ってもの。
レーベンシュタイン距離 - Wikipedia

Google Spreadsheet で使いたかったので Google App Script なのだけど VBA に移したら Excel でも同様に利用できるはず。Excel だと配列を返して出力はできないが。

function fuzzyVlookup(targetList, searchItem, showDistance, showNth) {
  showDistance = showDistance || 0;
  showNth = showNth || 1;
  
  searchItem = searchItem.toString().split("");
  
  var results = targetList.map(function(targetItem, idx) {
    targetItem = targetItem.toString().split("");
    
    if(targetItem.join("") == "") {
      return null;
    }

    if(searchItem.join("") == targetItem.join("")) {
      return {distance:0, idx:idx};
    }
    
    var leven = []; 
    for (var i = 0; i <= targetItem.length; i++) { 
      leven[i] = []; 
      leven[i][0] = i; 
    } 
    for (var i = 0; i <= searchItem.length; i++) { 
      leven[0][i] = i; 
    } 

    for (var i = 1; i <= targetItem.length; i++ ) { 
      for (var j = 1; j <= searchItem.length; j++ ) { 
        var cost = targetItem[i - 1] == searchItem[j - 1] ? 0 : 1; 
        
        leven[i][j] = Math.min(
          leven[i - 1][j] + 1,
          leven[i][j - 1] + 1,
          leven[i - 1][j - 1] + cost
        ); 
      }
    }
    
    return {
      distance: leven[targetItem.length][searchItem.length],
      idx: idx,
    };
    
  }).filter(function(x) {
    return x !== null;
  }).sort(function(a, b) {
    return a.distance - b.distance;
  });
  
  if (results.length === 0) {
    throw new Error("要素が見つかりませんでした");
  }
  
  results = results.slice(0, showNth).map(function(x){
    var str = targetList[x.idx][0];
    if (showDistance === 1) {
      str += " dist=" + x.distance;
    }
    return str;
  });
  
  return [results];
}

↓こんな感じで使える。良好。

ごみばこいんブログをガラッと作り直した

作り直したよ。
Chrome と Firefox の最新版くらいでしか動き見てないので、だめだったらごめんね。

変わったところざっくりまとめ

  • トップページを廃止、 /blog/ がトップページ
  • テーマを一から作り直して左右逆のレイアウトに
  • カテゴリとかタグの見た目をそれっぽくした
  • テーマ作り直しにあたってプラグイン頼みだったところをセルフで書いた(SNSボタンとか)
  • Twitter Bootstrap をやめて FLOCSS におおむね乗って 1 から CSS を書いた
  • JS 側でやっていたことを PHP に移した(目次とか Mikan とか)
  • PC 限定でゲームコンテンツを刷新した(コントローラーが付きました!キーボードで操作しよう!)
  • モバイルのページも作り直した、スマホサイトっぽくした、レスポンシブではない
  • JS の記載を ES2015+ にした。いまいちまだよくわかってない(古いブラウザごめんね)
  • HTML にメタデータ突っ込んでたのをやめて JSON-LD にした。あってるかわからないけどね!

さて、リニューアルを完走した感想ですが。

最初に作業を始めてから半年以上たってて、時間かかりすぎ^-^
もちべの上げ下げもあってやるぞ~~~って日と、やだぞ~~~~って日があったのは仕方ないね。

ゲームコンテンツのところは気が向いたら拡充していきたいな