nDiki : AutomaticLink

AutomaticLink (自動リンク)

WikiPage 中に既存のページ名が出現した場合に、(WikiNameBracketName でなくても)自動的にそのページへのリンクにする機能。

自動リンク規則

WiKicker では次の規則によりページ名を抽出する:

  • テキスト中から非最左最長一致する既存ページ名を自動的にリンクにする。
    • ページ名がテキスト中にオーバーラップして出現した場合は長い方を優先する。
  • 同じ長さのページ名が複数出現している場合は、先に現われた方を優先的にリンクにする。
  • 1文字以上あけずにページ名が連続して出現した場合は、片方は自動的にリンクにしない。
  • '/' で区切られたページ名は('/' で区切られた単位で)接尾辞がマッチすれば自動的にリンクになる。ただし複数のページ名がマッチする場合は自動的にリンクにしない。'/'を含まないページ名があれば、そちらを優先する。

自動リンク規則

サーバ負荷状態による AutomaticLink の無効化

サーバの負荷が高い時はレスポンスの低下を避けるため自動的に AutomaticLink が無効化されるように設定する事が可能(WiKicker 0.17 より)。 NaneyOrgWiki では load average が 3 を越えている場合は AutomaticLink が一時的に無効化される。

AutomaticLink の他のプログラムでの利用 (experimental)

WiKicker で運用されている WikiForum への AutomaticLink を他のCGIプログラムなどで行う事が可能。

Naney's Diary (ハイパー日記システム) と現在連携中。 hns の記事中に、存在するPageName があると自動的に WikiPage へのリンクになる (load average 3未満で有効)

外部ページリストの利用

WiKicker 0.22 より、指定したキーワードファイルに含まれている文字列を、AutomaticLink に使用できるようになる予定。 この文字列がページ中に現れた場合は指定したInterWikiURIに変換してリンク化される。

スポンサード リンク

関連情報

実装

「文字列から、辞書中に含まれる語を非最左最長一致のものから順に、各語が重ならないように検索する」のに最適なアルゴリズムを検討する。 特に Wiki に適した時間・空間効率のものを。

文字列
WikiPage 中の各テキスト。途中WikiNameがあった場合は、そこで分割されているので比較的短い。
辞書
PageName の集合 (数百~数万語を想定)
PageName (あるいはそれに準ずるもの)

現在の実装

  • 変形trieを利用してページ名の集合を受理するオートマトンを構築
  • 後方一致でAutomaticLinkできるようにページ名をreverseしたものを受理する文字列とする
  • 最初の1文字毎に別のオートマトンを構築する
  • AutomaticLinkマークアップ時、最初の遷移文字に対するオートマトンがまだ未構築であればその時点で構築する(遅延構築)
  • 対象テキストの全文字を開始文字としてAutomaticLink可能な文字列を取得。その中から最長のものを順に選択する

コメント

辞書trieが定番だと思うんですが、trie 構築・管理のコストと検索時間での係数を考えると、力技で各接頭辞をhash検索してもあまり変わらない感じもします。辞書中の語の最大長にもよりますが。

HierarchicalWikiPage への略記を自動的にリンクさせたりするために、trie を使うようにしました。現在はページ表示毎にページリストから trie を構築しているため、出力が遅くなってしまっています。近日中に trieキャッシュするようにする予定。

trie を利用してのキーワード抽出自体はそれほど大きく処理時間に影響を与えていないようです。

現在は trie を遅延構築するようにし、AutomaticLink のための初期化処理時間を大幅に節約しています。

関連情報

2004年2月26日 (木)

[ DiKicker ] AutomaticLink・転置インデックス自動更新

日記の記事が追加・更新されると、キーワード集合(索引語集合)も変更される(ことがある)。 当然過去の記事すべて再インデックス化する必要が出てくる。

このあたりをCGI プログラムの呼び出し毎にちょっとずつ更新していく処理を実装

[ 2月26日全て ]

2004年3月3日 (水)

ハイパー日記システム(hns) のキャッシュを有効に

Naney's Diaryの方、NaneyOrgWiki からエクスポートしたページをインクルードしたり、AutomaticLink をしたりなどいろいろ動的処理をつけ加えてあるのでハイパー日記システムキャッシュ機能をオフにしてあった。

しかし最近日に日にレスポンスが悪くなっている感じ。 最新日記の公開はこのnDikiに移行したのにともない、Naney's Diary の方は過去ログ表示専用になるためキャッシュ有効に戻しておくことにした。

これでレスポンスがよくなるかな?

[ 3月3日全て ]

2004年5月3日 (月)

[ WiKicker ] プレビューをレンダリング中も逐次出力するように

WiKicker での編集プレビューが「HTMLフラグメントを生成し終わってから出力する」ようになっていたためサーバの負荷が高い時にかなり待たされてしまっていたので、これを修正。 それからプレビューでも AutomaticLink を有効にしておいた。

その他HTMLフラグメントのキャッシュバグ(目次部分をキャッシュしていなかった)を修正。

[ 5月3日全て ]

2004年6月20日 (日)

[ 6月20日全て ]

2004年10月7日 (木)

過去の今ごろ

過去の10月7日より。

[ 10月7日全て ]

2005年1月26日 (水)

DiKicker にそろそろコメント機能を実装するか

くっつき BBS

nDiki では、たつを氏が公開しているくっつき BBSを利用してコメント機能をつけている。 くっつき BBSは自前でBBS機能を実装しなくても、JavaScript Include を使うことでコメントをページに貼りつけられるという優れもの。

CGI プログラム経由の JavaScript Include 方式は遅い/負荷がかかる

nDiki では JavaScript Include する際、コメントがない(=JavaScriptファイルがない)場合でも404にならないようにCGI プログラム経由で貼りつけていた。 しかし、この方法だと1ページに多くのコメント領域があると何度もCGI プログラムが実行されるのでサーバへ負荷がかかる。

また Web ブラウザHTMLの途中でscript要素が出てくると、そのスクリプトファイルを読み込んで処理するまで残りをレンダリングできない。 このためサーバが重かったりして、途中スクリプトファイルの読み込みでひっかかるとユーザ側でのページ表示完了が遅くなってしまう。

ということでこの方式をやめて、単純にコメントJavaScriptファイルのURIを指定するようにした。 その使わなくなったCGI プログラムで、tDiaryテーマ用の「commentshortクラスdiv要素」を書き出していたので、この部分は DiKicker に戻す。 現在のコードでは、コメントが無くてもこのdiv要素が出力されてしまうので、ちょっとみぐるしいがしばらくご容赦。

やはりDiKickerでネイティブにコメント機能を実装しよう

コメント内の AutomaticLink 処理や cookie の連動など、前からやりたいとは思っていたのでこれを機会に実装するかな。 いろいろ決めないといかん。

[ 1月26日全て ]

2007年3月1日 (木)

WiKicker / DiKickerAutomaticLink 長を可変にした

「が」や「は」など頻出する文字の WikiPage を作ってしまった場合、それらに対して自動リンクが働いてしまうと大変なことになるので、WiKicker では2文字以上のみ対象とするようにしていた。

しかし nDiki を書いていて、1文字のキーワードも自動リンクしたいという風に思えてきていた。 誰でも書ける Wiki の場合には危険で制約が必要だけれど、全てのキーワードが著者のコントロール化にある DiKicker では1文字のキーワードに対して自動リンクが働いても問題ないだろう。

ということで自動リンクが働く最低文字列長をプロパティで設定できるようにした。 2004年ぐらいからほとんど手をつけていなかった、AutomaticLink 処理モジュールを久しぶりにメンテナンス。 もともと2文字以上を前提でコーディングしてあったので、trie 部分などが1文字できちんと動くか確認した上で、文字列長チェックを可変に修正。 WiKickerDiKicker 両方で設定で変えられるようにした。

またあわせて、英単語の部分文字列に対して自動リンクしないようにする処理も改善。 今までは `downloaded' に対して `loaded' はマッチしないようにしていたものの、'download' はマッチしてしまっていた。 このあたりを改善。

[ 3月1日全て ]

2007年5月30日 (水)

WiKicker 0.420 リリース - 変更いろいろ

去年の12月3日以来、約半年ぶりのリリース。 リリースしそびれて、随分変更を累積してしまった。 以下主な変更点。

バージョン番号形式を変更

前回の 0.41 に対して、今回は 0.420 とした。 浮動小数点数的には、増分 0.01 で今まで通り。

今後 version.pm が普及した時のことと、developer release を出す時のことを考えて小数点以下3桁ずつのスタイルに移行することにした (関連記事)。

<meta name="robots" content="noindex,nofollow">

2007年1月に実装。 編集ページや履歴ページが検索エンジンに登録されないようにするための機能。

<a rel="nofollow">

2007年1月に実装。 リンク spam 対応。

AutomaticLink 長を可変にした

2007年3月に実装。 特に DiKicker で1文字キーワードによる自動リンクを有効にするために追加した。

'/' の前を省略した自動リンクを有効にするか無効にするかを設定できるように

前述の機能で1文字での自動リンクを有効にしたら、不便な面が出た。

WiKicker / DiKicker では '/' を階層の区切り文字としても扱うことができるようになっていて、サフィックス部分だけでも自動リンクするようになっている。 自動リンクを1文字にしたら「OS/2」というキーワードに対して '2' でも自動リンクが働き、望まないリンクが張られるようになってしまった。 DiKicker では階層的キーワードは無くてもあまり困らないので、'/' の前を省略した自動リンクを無効にできるようにした。

JSON 形式データ出力

2007年4月に実装

(DiKicker) はてなブックマーク数表示機能を追加

2007年1月に実装

(DiKicker) はてなブックマークエントリーページへのボタン表示機能を追加

2007年1月に実装

(DiKicker) grep 検索機能を追加

2007年2月に実装。自分としては重宝している。

(DiKicker) キーワード記事の下部への文字列挿入機能

Google AdSense 挿入用。

(DiKicker) サーバの負荷が高くなったら 503 を返して沈静化を待つようにした

2007年4月に実装 load average をチェックして負荷が高い時は、503 を返すようにした。

内部コードの結構な書き換え

ソースコードを結構いじった。 deprecated なメソッドの削除も実施したので、0.41 以前から派生しているソフトウェアは多くの場合修正が必要。

[ 5月30日全て ]

2017年1月3日 (火)

WikiName の特別扱いをついに停止

この日記日記システム(DiKicker)は WikiEngine からの派生で作られた生い立ちをもっていて、現時点でも WikiName を特別扱いし自動的にそのキーワードへのリンクになるようになっていました。今日はコードを修正してその特別扱いをやめることにしました。

実装ですがまず WikiName を先に抽出し、そのあとに他のキーワードを AutomaticLink するようになっていました。このため例えば MacBook Pro という文字列はまず MacBook という WikiName として抽出されてしまうため MacBook Pro という文字列で自動的にリンクさせることができていませんでした(それだと困るので明示的に BracketName で書いていました)。

WikiNameWikiWiki というコンセプト的に良いものでしたが AutomaticLink実装している日記システムではもう不要な表現です。

ようやく重い腰を上げて今回のコード修正となりました(いじったのは数行なのですけれども)。

[ 1月3日全て ]

2017年1月29日 (日)

nNote 始めました

永続的に残しておくほどではないちょっとしたノートを置いておくスペースとして nNote を始めることにしました。

nDiki と同じく自作の DiKicker を使用しています。

Medium であったり note であったりその他の Blog サービスであったりと「何か」を書いて公開しておけるサービスを触ってみるたびに「この nDiki とは別に書くとしたら何だろう? 何を書きたいんだろう?」と考えを巡らせていました。

この nDiki は長く続けてきた中で

  • 永続的に残すことを前提にきちんとした URL (記事 ID) にする。
  • 誤読されないように、ある程度自分なりに推敲する。
  • AutomaticLink のために正確な用語で書く。
  • フィードが拾われて消費されることを前提に、きちんと書けてから公開する。

といった縛りが自分の中にできてきているので、もっと自由なスペースが自分は欲しいのではと思えてきました。

  • 必要が無くなったら 404 を恐れずさくっと消して良い。
  • まだ自分としてこうだという結論に至っていない考えだったり何かの断片だったりを書いて良い。
  • 最初から用語の正確性を追わなくて良い。
  • 頻繁に更新して良い。

そういったノートを書き留めておく場所が欲しいんだなと。

そのためのサービス・プラットフォームで何がいいかと考えると、やはりテキストファイルでさっと新規作成・再編集をしてサーバに同期して公開・更新できるものがいいなぁという結論に至って、結局欲しいと思って自作して使っているこれ (DiKicker) じゃないですかと。日付有りノート中心になってしまいますが、まあいいかなと。

ということでさくっと設定だけ増やして nNote を立てるに至りました。

[ 1月29日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィでマネージャー・プロダクトオーナーをしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

follow us in feedly

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.497305s / load averages: 0.97, 1.04, 0.85
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker