Text to html with ruby software

Forgive me if this is too far off topic, but it is computer and Japanese (if not translation) related.

Does anyone know of any software that will semi-automatically take Japanese text and produce bare-bones XHTML1.1 compliant code with ruby tags? (Having the ruby inserted would be useful but not strictly necessary, as I would still have to proofread the resulting file and correct cases where the wrong ruby was inserted.) Microsoft Word inserts entirely too much needless (and non-standards compliant) baggage in the HTML it generates. I know of some online tools that will do this on HTML files, but the HTML they generate doesn't include all the tags the W3C HTML validator expects for ruby, and besides, I would prefer something that does not require me to convert the file to HTML first and upload it somewhere, which adds extra work for me.

Example of what I want:
Original: この字にはルビがつける。
Output: <p>この<ruby><rb>字</rb><rp>(< /rp><rt>じ</rt><rp>)</rp></ruby>にはルビがつける。</p>
richvh Oct 29, 2008

3 comments


Nov 11, 2008 maimuzo
Hello, I'm Maimuzo.
I'm a programmer with Ruby.(in this case, Ruby is an interpreter. NOT YOMIGANA)
I don't know a software that you want.
But, I made a script because I'm interested in it.
If you want to execute this script, you need to install Ruby(an interpreter), MeCab(Japanese parser), and NKF(Japanese character converter).

ちょっと長いけど、ソース貼っても良いよね。(プログラマグループなんだし)

-----rubi.rb------
#!/usr/bin/ruby
$KCODE = 'u'

require 'MeCab'
require 'nkf'

def katakana_to_hiragana(line)
NKF.nkf('-h1wW', line)
end

def add_rubi(sentence)
begin
mecab = MeCab::Tagger.new
# for checking
puts mecab.parse(sentence)
n = mecab.parseToNode(sentence)

parsed_words = []

while n do
unless n.surface.empty?
feature_array = n.feature.split(',')
rubi = katakana_to_hiragana(feature_array[-2])
puts "surface : [#{n.surface}] / rubi : [#{rubi}] / replace? : #{'*' != rubi and n.surface != rubi and n.surface != feature_array[-2]}"
if '*' != rubi and n.surface != rubi and n.surface != feature_array[-2]
parsed_words << "<ruby><rb>#{n.surface}</rb><rp>(< /rp><rt>#{rubi}</rt><rp>)</rp></ruby>"
else
parsed_words << n.surface
end
end
n = n.next
end
rescue
sentence = "RuntimeError: #{$!}\n";
end
parsed_words.join
end

base = gets
while base do
puts "base: " + base.strip
puts "added: " + add_rubi(base.strip)
base = gets
end
-----end of rubi.rb------

examples..,
$ cat japanese_examples.txt
この字にはルビがつける。
今日、バラを買った。
誰か、半自動式に日本語テキストをとって、ルビーのタグで貧弱なXHTML1.1対応コードを生産するソフトウェアを知っていますか?

$ ruby rubi.rb japanese_examples.txt
base: この字にはルビがつける。
この 連体詞,*,*,*,*,*,この,コノ,コノ
字 名詞,一般,*,*,*,*,字,アザナ,アザナ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
ルビ 名詞,一般,*,*,*,*,ルビ,ルビ,ルビ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
つける 動詞,自立,*,*,一段,基本形,つける,ツケル,ツケル
。 記号,句点,*,*,*,*,。,。,。
EOS
surface : [この] / rubi : [この] / replace? : false
surface : [字] / rubi : [あざな] / replace? : true
surface : [に] / rubi : [に] / replace? : false
surface : [は] / rubi : [は] / replace? : false
surface : [ルビ] / rubi : [るび] / replace? : false
surface : [が] / rubi : [が] / replace? : false
surface : [つける] / rubi : [つける] / replace? : false
surface : [。] / rubi : [。] / replace? : false
added: この<ruby><rb>字</rb><rp>(< /rp><rt>あざな</rt><rp>)</rp></ruby>にはルビがつける。
base: 今日、バラを買った。
今日 名詞,副詞可能,*,*,*,*,今日,コンニチ,コンニチ
、 記号,読点,*,*,*,*,、,、,、
バラ 名詞,一般,*,*,*,*,バラ,バラ,バラ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
買っ 動詞,自立,*,*,五段・ワ行促音便,連用タ接続,買う,カッ,カッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS
surface : [今日] / rubi : [こんにち] / replace? : true
surface : [、] / rubi : [、] / replace? : false
surface : [バラ] / rubi : [ばら] / replace? : false
surface : [を] / rubi : [を] / replace? : false
surface : [買っ] / rubi : [かっ] / replace? : true
surface : [た] / rubi : [た] / replace? : false
surface : [。] / rubi : [。] / replace? : false
added: <ruby><rb>今日</rb><rp>(< /rp><rt>こんにち</rt><rp>)</rp></ruby>、バラを<ruby><rb>買っ</rb><rp>(< /rp><rt>かっ</rt><rp>)</rp></ruby>た。
base: 誰か、半自動式に日本語テキストをとって、ルビーのタグで貧弱なXHTML1.1対応コードを生産するソフトウェアを知っていますか?
誰 名詞,代名詞,一般,*,*,*,誰,タレ,タレ
か 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ
、 記号,読点,*,*,*,*,、,、,、
半 接頭詞,名詞接続,*,*,*,*,半,ハン,ハン
自動 名詞,一般,*,*,*,*,自動,ジドウ,ジドー
式 名詞,接尾,一般,*,*,*,式,シキ,シキ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
日本語 名詞,一般,*,*,*,*,日本語,ニッポンゴ,ニッポンゴ
テキスト 名詞,一般,*,*,*,*,テキスト,テキスト,テキスト
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
とっ 動詞,自立,*,*,五段・ラ行,連用タ接続,とる,トッ,トッ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
、 記号,読点,*,*,*,*,、,、,、
ルビー 名詞,一般,*,*,*,*,ルビー,ルビー,ルビー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
タグ 名詞,一般,*,*,*,*,タグ,タグ,タグ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
貧弱 名詞,形容動詞語幹,*,*,*,*,貧弱,ヒンジャク,ヒンジャク
な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
XHTML 名詞,固有名詞,組織,*,*,*,*
1 名詞,数,*,*,*,*,*
. 名詞,サ変接続,*,*,*,*,*
1 名詞,数,*,*,*,*,*
対応 名詞,サ変接続,*,*,*,*,対応,タイオウ,タイオー
コード 名詞,一般,*,*,*,*,コード,コード,コード
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
生産 名詞,サ変接続,*,*,*,*,生産,セイサン,セイサン
する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
ソフトウェア 名詞,一般,*,*,*,*,ソフトウェア,ソフトウェア,ソフトウェア
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
知っ 動詞,自立,*,*,五段・ラ行,連用タ接続,知る,シッ,シッ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
い 動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
か 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ
? 記号,一般,*,*,*,*,?,?,?
EOS
surface : [誰] / rubi : [たれ] / replace? : true
surface : [か] / rubi : [か] / replace? : false
surface : [、] / rubi : [、] / replace? : false
surface : [半] / rubi : [はん] / replace? : true
surface : [自動] / rubi : [じどう] / replace? : true
surface : [式] / rubi : [しき] / replace? : true
surface : [に] / rubi : [に] / replace? : false
surface : [日本語] / rubi : [にっぽんご] / replace? : true
surface : [テキスト] / rubi : [てきすと] / replace? : false
surface : [を] / rubi : [を] / replace? : false
surface : [とっ] / rubi : [とっ] / replace? : false
surface : [て] / rubi : [て] / replace? : false
surface : [、] / rubi : [、] / replace? : false
surface : [ルビー] / rubi : [るびー] / replace? : false
surface : [の] / rubi : [の] / replace? : false
surface : [タグ] / rubi : [たぐ] / replace? : false
surface : [で] / rubi : [で] / replace? : false
surface : [貧弱] / rubi : [ひんじゃく] / replace? : true
surface : [な] / rubi : [な] / replace? : false
surface : [XHTML] / rubi : [*] / replace? : false
surface : [1] / rubi : [*] / replace? : false
surface : [.] / rubi : [*] / replace? : false
surface : [1] / rubi : [*] / replace? : false
surface : [対応] / rubi : [たいおう] / replace? : true
surface : [コード] / rubi : [こーど] / replace? : false
surface : [を] / rubi : [を] / replace? : false
surface : [生産] / rubi : [せいさん] / replace? : true
surface : [する] / rubi : [する] / replace? : false
surface : [ソフトウェア] / rubi : [そふとうぇあ] / replace? : false
surface : [を] / rubi : [を] / replace? : false
surface : [知っ] / rubi : [しっ] / replace? : true
surface : [て] / rubi : [て] / replace? : false
surface : [い] / rubi : [い] / replace? : false
surface : [ます] / rubi : [ます] / replace? : false
surface : [か] / rubi : [か] / replace? : false
surface : [?] / rubi : [?] / replace? : false
added: <ruby><rb>誰</rb><rp>(< /rp><rt>たれ</rt><rp>)</rp></ruby>か、<ruby><rb>半</rb><rp>(< /rp><rt>はん</rt><rp>)</rp></ruby><ruby><rb>自動</rb><rp>(< /rp><rt>じどう</rt><rp>)</rp></ruby><ruby><rb>式</rb><rp>(< /rp><rt>しき</rt><rp>)</rp></ruby>に<ruby><rb>日本語</rb><rp>(< /rp><rt>にっぽんご</rt><rp>)</rp></ruby>テキストをとって、ルビーのタグで<ruby><rb>貧弱</rb><rp>(< /rp><rt>ひんじゃく</rt><rp>)</rp></ruby>なXHTML1.1<ruby><rb>対応</rb><rp>(< /rp><rt>たいおう</rt><rp>)</rp></ruby>コードを<ruby><rb>生産</rb><rp>(< /rp><rt>せいさん</rt><rp>)</rp></ruby>するソフトウェアを<ruby><rb>知っ</rb><rp>(< /rp><rt>しっ</rt><rp>)</rp></ruby>ていますか?
Nov 12, 2008 richvh
Looks interesting. A couple of questions:

1) I'm working in Windows, not Linux. What do I have to do to install the MeCab and NKF extensions?
2) Could the code be tweaked so that for instance 買った generates <ruby><rb>買</rb><rp>(< /rp><rt>か</rt><rp>)</rp></ruby>った rather than <ruby><rb>買っ</rb><rp>(< /rp><rt>かっ</rt><rp>)</rp></ruby>た?
Nov 13, 2008 maimuzo
Hi richvh.

> 1) I'm working in Windows, not Linux. What do I have to do to install the MeCab and NKF extensions?

MeCab:
You can find a windows version at here:
http://sourceforge.net/projects/mecab/
and here (but Japanese only):
http://mecab.sourceforge.net/

windowsバージョンはここで見つけることが出来ます
http://sourceforge.net/projects/mecab/
あとココ(でも日本語だけ)
http://mecab.sourceforge.net/


NKF:
Maybe, installing NKF on Windows is difficult.
So I changed a part of the script:

たぶん、Windows上にNKFをインストールするのは難しいです。
だから私はスクリプトの一部を変更しました。

before:
def katakana_to_hiragana(line)
NKF.nkf('-h1wW', line)
end

after:
require 'jcode'
def katakana_to_hiragana(line)
line.tr('ァ-ン', 'ぁ-ん')
end

But, I don't still test this code. =-p

でも、このコードはまだテストしていません

If you can use Linux or an other Unix family, I recommend that you use Linux with VMWare.
Because Linux has a package system, you can easy install it.

もしあなたがLinuxか他のUnix系列を使えるなら、VMWareでLinuxを使うことをお勧めします。
なぜならLinuxにはパッケージシステムがあって、簡単にインストールできるからです。

I'm using MaxOSX 10.5.
This OS is like Unix because Mac has a package system.

私はMacOSX 10.5を使っています。
マックにはパッケージシステムがあるので、このOSはUnixのような感じです。

> 2) Could the code be tweaked so that for instance 買った generates rubyrb買/rbrp( /rprtか/rtrp)/rp/rubyった rather than rubyrb買っ/rbrp( /rprtかっ/rtrp)/rp/rubyた?

It is possible. but it may be difficult for us.
If you want to change a result of parsing, you need to tune up MeCab's dictionary.
MeCab uses a particular dictionary that made from many Japanese sentences.
Normally, we use a dictionary (mecab-ipadic) that IPA made.
We can build it too, but I think that tuning up to your wish is very difficult.

可能ですが、私たちには難しいかも知れません。
もし解析結果を変えたければ、MeCabの辞書を調整する必要があります。
MeCabはたくさんの日本語文から作った特別な辞書を使っています。
ふだん、私たちはIPAが作った辞書を使っています。
私たちはそれを作ることも出来ますが、あなたの思うように調整するのは難しいと思います。