質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

1481閲覧

java 呼び捨ての部分に さん付けするプログラム

otabeb

総合スコア26

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/07/22 23:42

閲覧ありがとうございます。
「コンソール上に入力した文章に私の名字を呼び捨てで書いている部分があれば さん付けに修正してコンソール上に表示させる」というプログラムを作っています。

patternとmatcherを使って文章を洗い出して、ヒットした部分をmatcherのreplaceAllで変換しています。

しかし、元々さん付けしているものにも さん付けされてしまったり、フルネームや地名や建物の名前にも さん付けされてしまいます。

『さん付けする必要のないものはさん付けさせないようにする』方法について、アドバイスお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

この種の問題は「さんを付ける/付けないをどのように定義するか?」に掛かります。
ちょっと考えただけで、完璧に定義するのはかなり困難なことが分かります。
例えば「岡山が日本一です」とあった時、岡山さんが陸上競技などの日本記録を持っているのか、
それとも、岡山県が何かの産出量が日本一位だといっているのか、文脈を見ないと判断できません。

・既にさんがついているものへの対処は、マッチしたらその後の語がさんかどうかを判定する
・フルネームについては、「名前らしきものの一覧」を持って、その一覧表に後続の語があるかどうかを判定
・地名やその他の固有名詞も「さんを付けない語の一覧」を持って、さんを付ける前に、その表を参照する

ぐらいでしょうか?
あと、心配なのは、改行の取り扱いは?
「コンソール上」というので、対象となる文に改行は入ってないとしていいのでしょうか?
改行などが入る可能性があるなら、対応しないとダメですね。

投稿2016/07/23 02:23

編集2016/07/23 02:30
nob.

総合スコア711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otabeb

2016/07/23 11:56

皆さま回答ありがとうございました! さん付けで変更した後に、再び同じ要領で「(名字)さんさん」にヒットした部分を「(名字)さん」に変更するというメソッドを作る事で解決しました!地名や建物名も同様の処理で解決しました! ありがとうございました!
nob.

2016/07/23 12:13

これだと最初から「さんさん」という文字列が有っても大丈夫ですか? さんをつけたことによる「さんさん」なのか、「愛さんさんと」のよな文字列かを区別する必要があります。
guest

0

「フルネームや地名や建物の名前にも さん付けされてしまいます」とありますが、フルネームや地名や建物を画一的に区別する方法はないと思います。
文脈から判断するのは、かなり難しいです。

名字に「さん」をつけるところまではできてるんですよね。
あとは名字の後が「さん」かどうかを判断し、「さん」でなければ最後に「さん」をつける方法でできると思います。

投稿2016/07/23 00:07

yoshi777

総合スコア674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

その名前にさんづけするかどうかの判断は人間がするのが一番手っ取り早いです。ビッグデータから抽出して会社名かどうか判断したり、ニューラルネットワークで人名と地名を判別したりなど、手間がかかりすぎますし、どちらにしても人間ほど正確にはできません。

敬称をつけるデータにはあらかじめ敬称を登録しておき、それらと一致したらつけるようにするのが一般的な手法と思います。敬称にしても「さん」「様」「御中」「社長」「先生」など使い分けが存在しますが、間違えた時のリスクの高さを考えると、それらを含めて機械に判断させるのは避けたほうが良いかと思います。

投稿2016/07/23 00:35

Zuishin

総合スコア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

sun-solar-arrow

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

さん付けとフルネームはできると思います。

さん付けとフルネームはひとつでしょうから、
そちらを先にパターンマッチで探して、
文字列の出現位置など区別する情報を
禁止リストに入れて、さん付けを回避します。


地名や建物となると段違いに難しいです。

たとえば名前が「原」さんで、
「秋葉原」などの地名に引っかかる場合、
地名をやはり禁止リストに入れようとすると、
こうした固有名には限りがないので困ります。


大ざっぱな判定でいいなら名前の前後を
漢字かどうかで区別する方法があります。
たとえば「秋葉原」は不可で、「経理の原が処理」は可です。

もしものすごく重要なプログラムであれば、
国内の地名などを何百、何千でもリスト化して、
大体でいいなら漢字判定で済ませるとか。

けっきょく、コストとリターンによる判断だと思います。


追記:
もし入力が独自形式になっても良ければ、
「<原>」のようにタグ付けで入力して
タグをパターンマッチで探せば、ほぼ100%対応できます。
タグ付けの手間がかかり、汎用性は下がりますが。

投稿2016/07/23 00:35

編集2016/07/23 01:07
LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問