none
ふりがな取得 RRS feed

  • 質問

  • 漢字かな混じりの文字列からふりがなを取得したいのですが、

    Microsoft.Office.Interop.Excel.Applicationを利用することによって、

    例えば「これは試験です。」は「これはしけんです。」という風に全文をひらがななどにすることまでできるのですが、

    「これは試験(しけん)です。」などのように漢字の後ろに例えばカッコ付でふりがなを付けたいのですが、

    どのようにすればいいのでしょうか?

    VB2010です。
    2014年3月26日 6:53

回答

  • 原理的に不可能だと思います。
    まず、Excelにおけるフリガナの取得にはphonetic関数を使われていると思います。これは入力時に入力されたひらがなを記憶しておいて、それを表示させているだけです。ですから、漢字変換のためにわざわざ違う読みで入力していれば、それは間違ったふりがなになります。
    そして、もっと問題なのは、そのふりがなの記憶はセル単位であり、セル全体のフリガナしか取得できないということです。つまり、セルに入力された文字列から漢字部分のみを取り出し、改めてその漢字のみのフリガナを取得するということができません。
    ということは、セル全体のフリガナから漢字部分のフリガナを抜出し、それを漢字の後にカッコ付で付加しなければなりません。
    しかし、これは原理的に不可能なのです。なぜなら、どの部分が漢字のフリガナを判断する方法がないからです。この部分が漢字のフリガナというマークでもない限り、不可能です。例えば、以下の例を見て下さい。

    李も桃も桃のうち

    すもももももももものうち

    ここからどうやって漢字のフリガナ部分を見つけたら良いのでしょう?
    漢字以外をCSVのカンマのようにセパレータとして考えれば、
    李[も]桃[も]桃[のうち]
    になります。セパレータは[]で括っています。

    すもももももももものうち

    から、このセパレータである最初の2つの[も]を見つけることができないのです。
    いや、李は「すもも」で桃は「もも」だから、それを考慮すれば判断できると考えられるでしょうか?
    しかしこれは本末転倒な方法なのです。なぜなら実際に入力されたフリガナを取得するのではなく、その漢字の一般的な読みを利用するという不正確な情報を元にしているからです。もし、この方法で良いのであれば、phonetic関数など使わず、漢字部分のみ取り出して、その漢字をGetPhonetic関数で一般的なフリガナを取得すれば良いことになります。しかし、それでは不正確でしょう。ちなみに漢字部分のみを取り出すというのも簡単なことではありません。

    よって、
    1.そもそもPhonetic関数で得られるフリガナは正確とは限らない。(ただし、正確になるようにフリガナを正しく設定し直している場合は別)
    2.正確なフリガナが得られたとしても、原理的にそこから漢字部分のフリガナのみを抽出することが不可能。

    ということになると思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年3月27日 7:30
    • 回答としてマーク 星 睦美 2014年3月31日 1:41
    2014年3月27日 1:29
    モデレータ

すべての返信

  • 原理的に不可能だと思います。
    まず、Excelにおけるフリガナの取得にはphonetic関数を使われていると思います。これは入力時に入力されたひらがなを記憶しておいて、それを表示させているだけです。ですから、漢字変換のためにわざわざ違う読みで入力していれば、それは間違ったふりがなになります。
    そして、もっと問題なのは、そのふりがなの記憶はセル単位であり、セル全体のフリガナしか取得できないということです。つまり、セルに入力された文字列から漢字部分のみを取り出し、改めてその漢字のみのフリガナを取得するということができません。
    ということは、セル全体のフリガナから漢字部分のフリガナを抜出し、それを漢字の後にカッコ付で付加しなければなりません。
    しかし、これは原理的に不可能なのです。なぜなら、どの部分が漢字のフリガナを判断する方法がないからです。この部分が漢字のフリガナというマークでもない限り、不可能です。例えば、以下の例を見て下さい。

    李も桃も桃のうち

    すもももももももものうち

    ここからどうやって漢字のフリガナ部分を見つけたら良いのでしょう?
    漢字以外をCSVのカンマのようにセパレータとして考えれば、
    李[も]桃[も]桃[のうち]
    になります。セパレータは[]で括っています。

    すもももももももものうち

    から、このセパレータである最初の2つの[も]を見つけることができないのです。
    いや、李は「すもも」で桃は「もも」だから、それを考慮すれば判断できると考えられるでしょうか?
    しかしこれは本末転倒な方法なのです。なぜなら実際に入力されたフリガナを取得するのではなく、その漢字の一般的な読みを利用するという不正確な情報を元にしているからです。もし、この方法で良いのであれば、phonetic関数など使わず、漢字部分のみ取り出して、その漢字をGetPhonetic関数で一般的なフリガナを取得すれば良いことになります。しかし、それでは不正確でしょう。ちなみに漢字部分のみを取り出すというのも簡単なことではありません。

    よって、
    1.そもそもPhonetic関数で得られるフリガナは正確とは限らない。(ただし、正確になるようにフリガナを正しく設定し直している場合は別)
    2.正確なフリガナが得られたとしても、原理的にそこから漢字部分のフリガナのみを抽出することが不可能。

    ということになると思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年3月27日 7:30
    • 回答としてマーク 星 睦美 2014年3月31日 1:41
    2014年3月27日 1:29
    モデレータ
  • 結論、総論については賛成なのですが、
    「Text Services Framework (TSF)」では、
    入力だけでなく、一般的な「読み」も一覧で取得できます。
    という部分について、やや強調しても良いかもしれません。
    2014年3月27日 2:52
  • 「Text Services Framework (TSF)」では、
    入力だけでなく、一般的な「読み」も一覧で取得できます。

    これについては知りませんでした。補足、ありがとうございます。

    ところで、結論については先に不可能と述べたのですが、100%を求めなくても、誤ってフリガナが付いた部分に関しては人間が直すという運用にすれば、そこそこ現実的な範囲でうまくいくのかもしれませんね。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年3月27日 4:04
    モデレータ
  • 実際に漢字入りのテキストファイルを読み込んで、漢字に「ルビ」をつけるという
    アプリケーションが存在します。
    似たようなことをするWebサイトもありました。
    ちなみに、入力したひらがなが戻ってくるように見えるのは、
    漢字変換が学習機能で保持したひらがな文字列を候補として戻す。
    という仕様のせいだと推測していたのですが、どうなんでしょう。
    2014年3月27日 4:48
  • >実際に漢字入りのテキストファイルを読み込んで、漢字に「ルビ」をつけるという
    >アプリケーションが存在します。
    >似たようなことをするWebサイトもありました。

    100%は無理だとしても、ある程度賢くしていけば実用に耐えられるものはできそうな気がしていましたが、やはりあるのですね。
    参考になります。

    >ちなみに、入力したひらがなが戻ってくるように見えるのは、
    >漢字変換が学習機能で保持したひらがな文字列を候補として戻す。
    >という仕様のせいだと推測していたのですが、どうなんでしょう。

    おそらく質問者さんはPhonetic関数、もしくはGetPhonetic関数を使用されていると思うのですが、そうであればフリガナ自身はExcelが記録していて、それを利用しているようです。SetPhonetic関数というのもあって、これを使うとExcelにフリガナに覚えこますことができます。また、フリガナ入力はExcel自身からGUIでも行うことができます。

    (参考)
    第19回PHONETIC関数のフリガナで名前をわかりやすく表示しよう!
    http://azby.fmworld.net/usage/excel-function/019/

    フリガナ欄を作っておけばよかった…でも大丈夫!【PHONETIC関数】
    http://itpro.nikkeibp.co.jp/article/COLUMN/20070709/277016/


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年3月27日 5:33
    モデレータ
  • 「すもももももももものうち」 には笑ってしまいましたが、

    なるほどそうなのですね。

    それにこの方法(Excel.Application)では、おっしゃられるように、「Excelにおけるフリガナの取得にはphonetic関数を使われていると思います。これは入力時に入力されたひらがなを記憶している」のであれば、他の人と違う結果になってしまうのであまり良くないですね。

    別途辞書を備えた方法とか考えてみます。

    ありがとうございました。

    2014年3月27日 5:34
  • 「Text Services Framework (TSF)」・・・勉強させていただきます。

    ありがとうございました。

    2014年3月27日 5:35
  • 実際に漢字入りのテキストファイルを読み込んで、漢字に「ルビ」をつけるという
    アプリケーションが存在します。
    似たようなことをするWebサイトもありました。
    形態素解析ですね。品詞を踏まえて分割しながら並行して漢字の読み仮名を推測します。読み仮名・活用形・送り仮名が相互に影響します。「話(はなし)」と「話(はな)す」とか。
    ちなみに、入力したひらがなが戻ってくるように見えるのは、
    漢字変換が学習機能で保持したひらがな文字列を候補として戻す。
    という仕様のせいだと推測していたのですが、どうなんでしょう。
    Excelの場合は、Excel上で入力中のふりがなを覚えておいて保持しているためですね。オートコンプリートの際にもふりがなで前方一致しますし。
    2014年3月27日 5:48
  • 形態素解析ですね。品詞を踏まえて分割しながら並行して漢字の読み仮名を推測します。読み仮名・活用形・送り仮名が相互に影響します。「話(はなし)」と「話(はな)す」とか。

    なるほど。勉強になりました。やはり個人で開発するのは難しそうですね。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年3月27日 7:05
    モデレータ
  • 辺りが有名ですね。.NET向けにライブラリが作られているものもあるようです。

    元質問者さんはふりがなが得られれば手段は問わないのでしょうか? であれば、ライセンスに問題なければこれらのライブラリを使うことも可能かもしれません。

    2014年3月27日 7:35
  • >Excelの場合は、Excel上で入力中のふりがなを覚えておいて保持しているためですね。オートコンプリートの際にもふりがなで前方一致しますし。

    なるほどです。了解しました。

    2014年3月27日 7:46