Ruby で平仮名またはカタカナをローマ字にする
ちょうどいいRubyのライブラリがないか調べたので備忘録。 昔はSuikyoというライブラリがあったはずだけど、今はメンテされていない様子。
ローマ字表記について
そもそも論として、いわゆるヘボン式と訓令式という2大派閥(?)に加えて外務省方式、駅名方式などかなりのバリエーションがある。ヘボン式についても、オリジナル版(Traditional Hepburn)と改訂版(Revised Hepburn)修正ヘボン式(Modified Hepburn)、日本人による改良版などの亜種があるらしい。
ヘボン式にすべきか訓令式にすべきかという議論はあるようですが、ソフトウェア開発者としてはユーザー次第としか言いようがない。 個人的には人名についてはヘボン式の方が字面がきれいに見えるので良いと思いますが。
その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
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
平仮名、カタカナからヘボン式ローマ字に。長音はハイフン-
に変換される。このライブラリは發音(ん)に対してn
とm
を使い分けるようにになっている。
しかし、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を参照。もしくはググって下さい。
TesseractのC/C++APIを使用するタイプと、tesseract
コマンドを呼び出すタイプの2系統があります。
Web APIなどの形式で使う場合、tesseract
コマンドを呼び出すタイプはリクエストの度にプロセスを生成することになるので好ましくないかと。
- Python 3
- pyocr
- pytesseract
- tesserocr
- Go
- gosseract:
- go-tesseract
- Ruby
- Java
- Tess4J
- Swift(iOS)
- Windows
- Android
- tess-two
- APIとして完成しているもの
- OpenOCR
- 番外編(Tesseract-OCRとは別)
はてなブログの見出しと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
やっつけ作業用のスクリプト
以下のように動作するやっつけ作業用のスクリプトを作成します。
- 月別アーカイブのURLを適当に生成(2015/01-2016/12)
- ブログ開始から今月までの記事を対象にするので、対象となる記事が存在しない月のURLを捨てる
- それぞれの月の記事一覧ページのHTMLから各ブログ記事のURLをNokogiriで取り出す
- それぞれの記事の本文のHTMLを取得し、不適切な
<h1>
タグを含むページを探す
やっつけURL一覧取得スクリプト(Ruby)。
対象のはてなブログの各エントリにおいて、見出しにh1タグが使われているURLを見つけ出すやっつけ作業 ...
あとは出力されたURLにアクセスして、個別に修正する作業を繰り返すことになります。 同じ要領で「だ・である体」のエントリも検出することもできるけど後回し。
幸か不幸か、リストアップされた修正が必要なエントリは合計39エントリ……。
パトラッシュ…、(やる前から)僕もう疲れたよ?
修正作業はこれからですが以上です。
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
- 作者: 佐々木拓郎,るびきち
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/08/23
- メディア: 単行本
- この商品を含むブログ (10件) を見る
JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック
- 作者: クジラ飛行机
- 出版社/メーカー: ソシム
- 発売日: 2015/08/31
- メディア: 単行本
- この商品を含むブログ (2件) を見る
*1:ランタイムというべきなのか実行エンジンというべきなのか?