今日も微速転進

ここではないどこかへ

Ruby で平仮名またはカタカナをローマ字にする

ちょうどいいRubyのライブラリがないか調べたので備忘録。 昔はSuikyoというライブラリがあったはずだけど、今はメンテされていない様子。

ローマ字表記について

そもそも論として、いわゆるヘボン式訓令式という2大派閥(?)に加えて外務省方式、駅名方式などかなりのバリエーションがある。ヘボン式についても、オリジナル版(Traditional Hepburn)と改訂版(Revised Hepburn)修正ヘボン式(Modified Hepburn)、日本人による改良版などの亜種があるらしい。

ヘボン式にすべきか訓令式にすべきかという議論はあるようですが、ソフトウェア開発者としてはユーザー次第としか言いようがない。 個人的には人名についてはヘボン式の方が字面がきれいに見えるので良いと思いますが。

参考:ローマ字 - Wikipedia

その2:Hepburn romanization - Wikipedia, the free encyclopedia

とりあえずヘボン式訓令式か、長音をどう扱うかをメインにirbで試した結果。

Rubyのライブラリ

主な違いは長音をどうするか、入力に平仮名、カタカナの両方を受け付けるかどうかなど。適当に検索した範囲では、以下の3つ。

  • romkan
  • romankana
  • romaji

romkan

平仮名からローマ字に変換およびローマ字から平仮名に変換。長音はハイフン-に変換される。

romkan | RubyGems.org | your community gem host

Ruby/Romkan: a Romaji/Kana conversion library for Ruby

ヘボン式から訓令式への変換用のメソッドto_kunreiがある。

irb(main):001:0> require 'romkan'
=> true
irb(main):002:0> "にほんばし".to_roma
=> "nihonbashi"
irb(main):007:0> "にほんばし".to_roma.to_kunrei
=> "nihonbasi"
irb(main):009:0> "らーめん".to_roma
=> "ra-men"
irb(main):010:0> "おーいにっぽん".to_roma
=> "o-inippon"

最終更新日が2011年でちょっと不安。irbでは問題なく動いている。

romankana

平仮名からローマ字に変換およびローマ字から平仮名に変換。

romankana | RubyGems.org | your community gem host

GitHub - ymrl/romankana

irb(main):004:0> require 'romankana'
=> true
irb(main):005:0> "ニホンバシ".to_roman
=> "nihonbashi"
irb(main):006:0> "ジュンイチ".to_roman
=> "junichi"
irb(main):009:0> "ラーメン".to_roman
=> "raamen"
irb(main):010:0> "おーいにっぽん".to_roman
=> "ooinippon"

長音は直前の母音を重ねるタイプ。下記のようなケースを区別できない。

irb(main):012:0> "さあどうする".to_roman
=> "saadousuru"
irb(main):013:0> "さーどうする".to_roman
=> "saadousuru"

入力文字列がリアル鬼ごっこのような文体でない限り問題にはならないかも知れない。

参考:ローマ字とひらがなを変換する - Ruby Tips!

romaji

平仮名、カタカナからヘボン式ローマ字に。長音はハイフン-に変換される。このライブラリは發音(ん)に対してnmを使い分けるようにになっている。 しかし、nの後ろに母音またはyが来るケースについては考慮されてない。

romaji | RubyGems.org | your community gem host

GitHub - makimoto/romaji: Romaji-Kana transliterator

irb(main):001:0> require "romaji"
=> true
irb(main):002:0> require "romaji/core_ext/string"
=> true
irb(main):003:0> "にほんばし".romaji
=> "nihombashi"
irb(main):004:0> "ニホンバシ".romaji
=> "nihombashi"
irb(main):005:0> "ジュンイチ".romaji
=> "junichi"
irb(main):006:0> "ラーメン".romaji
=> "ra-men"
irb(main):007:0> "おーいにっぽん".romaji
=> "o-inippon"

課題など

romkan以外のライブラリにはnの次に母音(a,i,u,e,o)やyが来た場合にアポストロフィを入れる処理はないように見える。また、訓令式との切り替えはromkanにしかない。

なお、長音を文字の上にマクロン(またはサーカムフレックス)をつけて表記したい場合は後処理で一工夫必要。

漢字仮名交じりの文字列からローマ字化したい場合は、zipangというライブラリもある。

参考:日本語をURL用ローマ字に変換するgem Zipangを作った - Qiita

簡単ですがここまで。

Tesseractの各言語のラッパーいろいろ(随時更新)

TesseractというのはGoogleが開発を支援しているオープンソースOCRエンジンです。

Tesseract本体のインストールについては公式のWikiを参照。もしくはググって下さい。

github.com

TesseractのC/C++APIを使用するタイプと、tesseractコマンドを呼び出すタイプの2系統があります。

Web APIなどの形式で使う場合、tesseractコマンドを呼び出すタイプはリクエストの度にプロセスを生成することになるので好ましくないかと。

続きを読む

はてなブログの見出しとMarkdownモード、そしてスクレイピング

今更ではあるけれど……。 (はてなダイアリーとの互換性だかなんか知らないけど、)はてなブログでは<h2>タグは使わない前提になってるらしい。

なんの話かというと、現状このブログの記事のほとんどは見出しに<h1>タグを使っているエントリが複数ある状態で色々と好ましくないということです。

はてなブログには「はてな記法」「Markdown」「見たまま」の三つの編集モードがあり、そしてこのブログはMarkdownモードで書いています。

一般的なMarkdownの記法では、見出しは#の後ろに一つ以上の半角記号が続く独立した行で、#の数で見出しの階層を表現します。

# 見出し1

## 見出し2

### 見出し3

上記の例で言うと最初の「見出し1」の部分は<h1>タグに、2つ目の「見出し2」は<h2>タグになる。

ほとんどのブログテーマはh2タグの見た目を規定してないか、使わない前提でデザインしているように見える。何も考えずに、見出しとして# ...という書式で記事を書くと、テーマによっては見出しの見た目がイマイチになってしまう。

編集ページのメニューから見出しを入力しようとすると、### ...となるので、 システム側としては###、つまり<h3>タグを使わせたい模様。 少なくとも一般的なはてなブログのテーマを使う限り、見出しは###にしたほうが見た目が自然になる。

参考:http://www.letstouch.tech/entry/2016/03/22/000000

ところがこれをやるとHTML5としては<h1>の次に<h2>を飛ばして<h3>になるのでHTMLとしては不自然になる。一説によるとSEOの面から不利かもしれないとのこと。

Markdownモードの方はお気をつけください、ということです。

<h1>タグは記事のタイトル用ということでさすがにまずいので意図せずに<h1>タグになっている箇所だけ<h2>になるように記事を修正したい。


以前から実は気づいていましたが、そもそもこのブログ、文体が「ですます体」だったり「だ・である体」だったり非常に読みにくい。……できればそっちもなんとかしたい。

修正対象ページをリストアップする

というわけでまずは対象ページをリストアップ。

APIで全ページ取り出す方法もあるみたいだけど…。

ブログのURLの末尾に/archiveをつけると全ページの一覧(ただしページネーションあり)が取得できるようです。ただ、ページネーションのリンクをたどるの少々面倒なので、月別アーカイブから取り出す方向で。

はてなブログでは"http://ブログURL/archives/年/月"という形式でその月の記事が(ページネーションなしで)取り出せるようなのでこれを使います。。

準備

Rubyで適当なスクリプトを作る。Ruby については複数バージョンのRubyを共存させるためにrbenvを使ってインストールしている。Ruby 2.3.1を使うものとし、HTMLおよびXMLのパースようのライブラリとしてNokogiriもインストールする。rbenv local 2.3.1というのはこのディレクトリ以下では2.3.1という名称でインストールされているRubyのインタプリタ*1を使うように設定するよ、というrbenvのコマンド。2.3.1の部分を使用したいインストール済みのRubyインタプリタを指定。

$ rbenv install 2.3.1
$ rbenv local 2.3.1
$ rbenv exec gem install nokogiri

やっつけ作業用のスクリプト

以下のように動作するやっつけ作業用のスクリプトを作成します。

  1. 月別アーカイブのURLを適当に生成(2015/01-2016/12)
  2. ブログ開始から今月までの記事を対象にするので、対象となる記事が存在しない月のURLを捨てる
  3. それぞれの月の記事一覧ページのHTMLから各ブログ記事のURLをNokogiriで取り出す
  4. それぞれの記事の本文のHTMLを取得し、不適切な<h1>タグを含むページを探す

やっつけURL一覧取得スクリプト(Ruby)。

対象のはてなブログの各エントリにおいて、見出しにh1タグが使われているURLを見つけ出すやっつけ作業 ...

あとは出力されたURLにアクセスして、個別に修正する作業を繰り返すことになります。 同じ要領で「だ・である体」のエントリも検出することもできるけど後回し。


幸か不幸か、リストアップされた修正が必要なエントリは合計39エントリ……。

パトラッシュ…、(やる前から)僕もう疲れたよ?


修正作業はこれからですが以上です。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

*1:ランタイムというべきなのか実行エンジンというべきなのか?

広告