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。日本語でいうひらがなみたいなものだ。割と誤解している人は多いが。
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.
(多分満員になるだろうから、座りたければ早く来てくれ)
とあったのだが、何気にちらほら席は空いていた(ガラガラということはないが)。
Wikipedia の Jimmy 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".
わはは。
エンコーディング達人判定
ふと、文字エンコーディングの問題に詳しい人間は'\'の ASCII コードを 0x5c だと即答できるんじゃなかろうかと思った。逆に言えば*1、即答できない人間は詳しくないだろうと思うわけだが、さてどうだろう。
あと、FULLWIDTH TILDE と WAVE DASH がなにか分かる人は Unicode とレガシーエンコーディングの変換周りで苦労しているに違いない、とか。
まぁ、どうでもいいけどね。
*1:より正確には逆ではなく対偶だけど
Google Corpus #2
まとめお疲れ様です。
あー、やっぱオリジナルを復元できないことが前提で、単語 n-gram なんかになるのね。とりあえず機械学習方面には使いにくそうだ。自分も使うかどうかといえば微妙なところだなぁ。
大規模Webデータといっても,かなり学術的なデータになるようで,言語処理やそこに関わる研究分野としては,今までになかった*1「書き言葉・話し言葉」での大規模なコーパスデータは歓迎できるものではないでしょうか.
なくはない。NTCIR-4 WEBとか、CSJとか。
なお,コーパスとか著作権,係り受け解析などの専門的な内容は誰かが解説してくれるのではないかと期待しつつ書いてみるメソッドを発動します.
じゃ、とりあえず Wikipedia にリンクしておく。
- ref:コーパス - Wikipedia
- ref:構文解析 - Wikipedia