- PR -

StringTokenizerを使って日本語切り分け

1
投稿者投稿内容
ニック名前
会議室デビュー日: 2005/03/24
投稿数: 11
投稿日時: 2005-03-31 14:35
ども、お世話になっております。
今回、長い文字列を画面に表示する際に折り返して表示したく下記のようなメソッドを作ってみました。
コード:
ArrayList getDividString(String d_str, int disp_len, FontMetrics font_m, ArrayList str_ary){
    if((d_str == null) || (d_str.trim().equals(""))) { return str_ary; }

    String strToken = "";
    StringTokenizer st = new StringTokenizer(d_str);
    while (st.hasMoreTokens()) {
      if(font_m.stringWidth(strToken) >= disp_len) {
        str_ary.add(strToken);
        strToken = "";
      }
      strToken = strToken + " " + st.nextToken();
    }
    str_ary.add(strToken);
    return str_ary;
  }



上記のメソッドで英語の文字列の場合は問題なく単語単位で折り返し表示できました。
しかし日本語ではあたりまえなんですが文字列がスペースで区切られていない為に文字列全部が一つのTokenとされてしまいます。
StringTokenizerを使って日本語切り分けするにはどのようにすればできるのでしょうか?
jack_pma
常連さん
会議室デビュー日: 2002/11/15
投稿数: 35
お住まい・勤務地: 埼玉
投稿日時: 2005-03-31 14:47
うーん、StringTokenizerは特定の文字によって文字列を区切る、ってことしかやってくれないので、日本語の単語境界を検出するのはちょっと無理ですね。

何を使えばいいか?ちょっと思いつかないですが・・・
java.util.regexを見てみると、正規表現の中に単語境界をマッチするエスケープシーケンスがあるようです。もしかしたらある程度まではこれでできるかも?、でも使ってみたことないので確証はないです。

自力でやるとしたら・・・一文字ずつ走査して、同一の文字種(漢字とかひらがなとか)の連続をひとつの単語としてみなす・・・っていう、テキストエディタの単語選択なんかがよくこういう動きをしますが、それで折り返しに不自然のないくらいにはなんとかなるかもしれませんね。

何かいい解決策知ってる方がいたら僕も知りたいです。

[ メッセージ編集済み 編集者: jack_pma 編集日時 2005-03-31 14:54 ]
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-03-31 15:03
単純に文字数制限じゃダメなのでしょうか?

メールとかみたいに。


それ以外だと思いつきません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-03-31 15:28
http://ultimania.org/sen/
形態素解析エンジンのsenというのがあります。
jakarta luceneとsenを組み合わせて
日本語による全文検索に使われたりしていますね。
jack_pma
常連さん
会議室デビュー日: 2002/11/15
投稿数: 35
お住まい・勤務地: 埼玉
投稿日時: 2005-03-31 15:30
あ、確かに、目的が折り返しなだけなら、単純に一定の文字数で改行、でもいい気がしますね。それで済むならそのほうがずっと簡単ですしね。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-03-31 15:33
禁則処理クラス
http://www.kanazawa-net.ne.jp/~pmansato/kinsoku.htm
参考に。
検索用語としては 段落整形 とかはエディターに多いです。整形マクロも多数ある。
UNIX の古代のコマンドも発掘はできると思いますが。
あるいは
表示部品を使い、文字列をそこに投げ込む、最近のブラウザは禁則してます。
印刷なら XSL-FO(アンテナハウス) や http://CSSJ.JP/ など。
ニック名前
会議室デビュー日: 2005/03/24
投稿数: 11
投稿日時: 2005-03-31 16:48
jack_pmaさん、(株)ぽちさん、かつのりさん、MMXさん、ご意見ありがとうございました。

やっぱ、簡単にはいきませんね・・・
「単純に一定の文字数で改行」といかせてもらいます。
コード:
      int intStrLen = 0;
      int intStrDispLen = 0;
      int intStart = 0;
      int intEnd   = 0;
      String dispStr  = "";
      intStrLen = font_m.stringWidth(d_str);
      if(intStrLen > disp_len) {
        while (true) {
          dispStr = String.valueOf(d_str.substring(intStart, intEnd));
          intStrDispLen = FontM.stringWidth(dispStr);
          if(intStrDispLen > disp_len) {
            str_ary.add(dispStr);
            if(intEnd >= d_str.length()) { break; }
            intStart = intEnd;
          }
          intEnd++;
          if(intEnd > d_str.length()) { str_ary.add(dispStr); break; }
        }
      } else {
        str_ary.add(d_str);
      }
      return (String[])str_ary.toArray(new String[str_ary.size()]);




禁則処理クラス、形態素解析エンジンのsenも今からじっくり参考にします。
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2005-03-31 23:21
日本語の切り出しを標準ライブラリで扱っているのは java.text.BreakIterator
くらいな物でしょうかね。。
これを使うと単純な分解程度であるなら可能かもしれません。
もう少し高度な処理をしたい場合は、IBMのICU4JのRuleBasedBreakIteratorなんか
利用すれば突っ込んだ処理も可能かもしれませんね。

実際に試したうえで報告したいのですが、、最近、疲労で、、疲労で、、w
1

スキルアップ/キャリアアップ(JOB@IT)