閲覧ありがとうございます。
「コンソール上に入力した文章に私の名字を呼び捨てで書いている部分があれば さん付けに修正してコンソール上に表示させる」というプログラムを作っています。
patternとmatcherを使って文章を洗い出して、ヒットした部分をmatcherのreplaceAllで変換しています。
しかし、元々さん付けしているものにも さん付けされてしまったり、フルネームや地名や建物の名前にも さん付けされてしまいます。
『さん付けする必要のないものはさん付けさせないようにする』方法について、アドバイスお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
この種の問題は「さんを付ける/付けないをどのように定義するか?」に掛かります。
ちょっと考えただけで、完璧に定義するのはかなり困難なことが分かります。
例えば「岡山が日本一です」とあった時、岡山さんが陸上競技などの日本記録を持っているのか、
それとも、岡山県が何かの産出量が日本一位だといっているのか、文脈を見ないと判断できません。
・既にさんがついているものへの対処は、マッチしたらその後の語がさんかどうかを判定する
・フルネームについては、「名前らしきものの一覧」を持って、その一覧表に後続の語があるかどうかを判定
・地名やその他の固有名詞も「さんを付けない語の一覧」を持って、さんを付ける前に、その表を参照する
ぐらいでしょうか?
あと、心配なのは、改行の取り扱いは?
「コンソール上」というので、対象となる文に改行は入ってないとしていいのでしょうか?
改行などが入る可能性があるなら、対応しないとダメですね。
投稿2016/07/23 02:23
編集2016/07/23 02:30総合スコア711
0
その名前にさんづけするかどうかの判断は人間がするのが一番手っ取り早いです。ビッグデータから抽出して会社名かどうか判断したり、ニューラルネットワークで人名と地名を判別したりなど、手間がかかりすぎますし、どちらにしても人間ほど正確にはできません。
敬称をつけるデータにはあらかじめ敬称を登録しておき、それらと一致したらつけるようにするのが一般的な手法と思います。敬称にしても「さん」「様」「御中」「社長」「先生」など使い分けが存在しますが、間違えた時のリスクの高さを考えると、それらを含めて機械に判断させるのは避けたほうが良いかと思います。
投稿2016/07/23 00:35
総合スコア28660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
すっごい手間かかるけど
Java
1public class Main{ 2 public static void main(String[] args){ 3 Pearson p=new SanPearson(); 4 System.out.println(p.san()); 5 Pearson p=new NotSanPearson(); 6 System.out.println(p.san()); 7 } 8 public static String san(Pearson p){ 9 if(p.name.matches(".*さん")){ 10 //この条件ならendsWith("さん")でも動きます 11 //最後にさんがつく名前の人だったら正しく動きません 12 p.name+"さん";//足し算の代わりにBuilder BufferでもOK 13 //formatを使うならnameの横に%sが必要です 14 //String.format(p.name,"さん")でOK 15 } 16 return p.name; 17 } 18} 19/**さんをつける人間*/ 20class SanPearson extends Pearson{ 21 public String name = "Mori"; 22 public boolean isSan=true; 23} 24/**つけない人間*/ 25class NotSanPearson extends Pearson{ 26 public String name = "Satouさん" 27 public boolean isSan = false; 28} 29/**人間*/ 30abstract class Pearson{ 31 public String name; 32 public boolean isSan; 33} 34/**人間じゃないもの*/ 35class House{ 36 public String name = "我が家"; 37}
みたいにインスタンスにしちゃって識別するとか。
後は文脈から判断するとか。でもとても難しいです。
投稿2016/07/23 00:53
総合スコア113
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
さん付けとフルネームはできると思います。
さん付けとフルネームはひとつでしょうから、
そちらを先にパターンマッチで探して、
文字列の出現位置など区別する情報を
禁止リストに入れて、さん付けを回避します。
地名や建物となると段違いに難しいです。
たとえば名前が「原」さんで、
「秋葉原」などの地名に引っかかる場合、
地名をやはり禁止リストに入れようとすると、
こうした固有名には限りがないので困ります。
大ざっぱな判定でいいなら名前の前後を
漢字かどうかで区別する方法があります。
たとえば「秋葉原」は不可で、「経理の原が処理」は可です。
もしものすごく重要なプログラムであれば、
国内の地名などを何百、何千でもリスト化して、
大体でいいなら漢字判定で済ませるとか。
けっきょく、コストとリターンによる判断だと思います。
追記:
もし入力が独自形式になっても良ければ、
「<原>」のようにタグ付けで入力して
タグをパターンマッチで探せば、ほぼ100%対応できます。
タグ付けの手間がかかり、汎用性は下がりますが。
投稿2016/07/23 00:35
編集2016/07/23 01:07総合スコア5592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/23 11:56
2016/07/23 12:13