Unicode 正規化と文字種判定

この処理は、 もともと、Web page が英語なのかどうかを判定したいという目的があるのだが、 実際にこのメソッドで処理したら、 例えば、見た感じは全部英語っぽいのだが、 いわゆる全角空白が使われている、 というページが出てくる。 どう見ても英語なのだが、 これを日本語ページという判定にしていいのか?

あと、ABC は日本語でないとして、「ABC」(全角)はどっちなんだ、 みたいなのも。 中身は全部英語なのだがなぜか「無題ドキュメント」というタイトルのページもある。 「MS ゴシック」というフォント名が指定されているとか、 なかなか奥が深い。

フォントの指定と「無題ドキュメント」の問題はがんばって HTML を parse する*1しかないと思うが、いわゆる全角アルファベット、全角空白の問題は正規化してしまえば解決する問題だと思う。
Java SE 6 以降であれば java.text.Normalizer を使ってこんなメソッドを用意すればよい。

    public static boolean isJapanaese(String str) {
        Pattern pattern = Pattern.compile("[\\p{InHiragana}\\p{InKatakana}\\p{InCJKUnifiedIdeographs}\\p{InCJKSymbolsAndPuctuation}]+");
        String normalized = Normalizer.normalize(str, Normalizer.Form.NFKC);
        Matcher matcher = pattern.matcher(normalized);
        return matcher.find();
    }

前のエントリでは安易に Character.UnicodeBlock を使えばいい、みたいなことを書いたが、よく考えれば java.util.regex.Pattern は Unicode Block をサポートしているわけで、こちらの方がシンプルに済む。
あと、厳密に考えればCJK統合漢字拡張A、B も追加したほうがいいかもしれないが、日本語の文章判定と考えればなくても特に問題ないだろう。というか、普通、ひらがなを使わずに現代日本語の文章を書くのは無理なので、\\p{InHiragana} だけでも結構実用になるかもしれない。まぁ、サイトマップのページとかではまりそうだが。
ところで。

気分的にハングルとか中国語で誤判定しそうな気がするが、 ソレはソレ、コレはコレ、ということで今回は気にしない。

ハングルはまったく別の Unicode Block に納められているので、問題ないはずだ。韓国語の文章で漢字や、句読点の類がどう使われるかはよく知らないが、ハングルを誤認識することはないだろう。
念のため書いておくと、ハングルとは字種の名前であって言語そのものの名前ではない*2。日本語でいうひらがなみたいなものだ。割と誤解している人は多いが。

*1:TagSoupなどが使えるかも

*2:日本では政治的な事情によりハングルと呼称することもあるらしい

RMS #2

Richard Stallman の講演を聴いてきたわけだが、とりたてて書くようなこともないかなぁ。
と思ったけどちょっとだけ書く。ちょっと自信がないが、こんなことを言っていたと思う。

GPL defends freedom. Non GPL open source license respects freedom, but does not defend freedom.

あと、Spyware とか back door を引き合いに出して、プロプライエタリは中身が分からないから信頼できないよね、みたいなことを言っていた(と思う。正直自分のヒアリングに自信なし)。ついでに GNU の G は G にすると funny だから、みたいな感じだったかな。

追記

そういえば通知メールには

We expect a full house, so please arrive early in order to ensure you get a seat.
(多分満員になるだろうから、座りたければ早く来てくれ)

とあったのだが、何気にちらほら席は空いていた(ガラガラということはないが)。
WikipediaJimmy Wales が講演に来たときは満員で、廊下に並んでいたらしいけど、えらい違いだな。
結局 GNU より Wikipedia の方が人気があると。当たり前といえば、当たり前か。

アンダーバー

ふーん、と思って「Underbar」で検索したら _summer - Wikipedia, the free encyclopedia が出てきて笑った。
そんでもって、Discussion*1 のページにはこうある。

The name of the game is _summer or "アンダーバーサマー", which is "Underbar Summer". Not "Underscore Summer".

わはは。

*1:日本語版 Wikipedia でいうところのノート

エンコーディング達人判定

ふと、文字エンコーディングの問題に詳しい人間は'\'の ASCII コードを 0x5c だと即答できるんじゃなかろうかと思った。逆に言えば*1、即答できない人間は詳しくないだろうと思うわけだが、さてどうだろう。
あと、FULLWIDTH TILDE と WAVE DASH がなにか分かる人は Unicodeレガシーエンコーディングの変換周りで苦労しているに違いない、とか。
まぁ、どうでもいいけどね。

*1:より正確には逆ではなく対偶だけど

zsh の色設定

大将、zsh には colors ってのがありやすぜ。とよく分からないノリではじめてみる。

autoload -U colors; colors

とすれば、使える。あとは、

PROMPT="${fg[white]}[${fg_bold[blue]}%n@%M${fg[white]}] "'%(!.#.$) '"${reset_color}"

とかで。

Google Corpus #2

まとめお疲れ様です。
あー、やっぱオリジナルを復元できないことが前提で、単語 n-gram なんかになるのね。とりあえず機械学習方面には使いにくそうだ。自分も使うかどうかといえば微妙なところだなぁ。

大規模Webデータといっても,かなり学術的なデータになるようで,言語処理やそこに関わる研究分野としては,今までになかった*1「書き言葉・話し言葉」での大規模なコーパスデータは歓迎できるものではないでしょうか.

なくはない。NTCIR-4 WEBとか、CSJとか。

なお,コーパスとか著作権係り受け解析などの専門的な内容は誰かが解説してくれるのではないかと期待しつつ書いてみるメソッドを発動します.

じゃ、とりあえず Wikipedia にリンクしておく。

ミスヒット

検索において検索要求と関係のない結果を出力してしまうことをミスヒットと呼ぶらしいのだが、これってどこから来たのだろう。情報検索(Information Retrieval)の世界ではそういうのは「false positive」と呼ぶのが普通だと思うが、「miss hit」という表記はあまり見ない気がする。
キャッシュ機構でデータ要求時にデータがキャッシュ上にないことをキャッシュミスヒットといったりもするが、これは単に「cache miss」の方が一般的だと思う。検索すれば「cache miss hit」も出てくるけど。