diff --git a/ojosama.go b/ojosama.go index 355e6ce..60c9399 100644 --- a/ojosama.go +++ b/ojosama.go @@ -201,6 +201,11 @@ func appendPrefix(data tokenizer.TokenData, tokens []tokenizer.Token, i int, sur return surface, false } + // 丁寧語の場合は「お」を付けない + if isPoliteWord(data) { + return surface, false + } + // 次のトークンが動詞の場合は「お」を付けない。 // 例: プレイする if i+1 < len(tokens) { @@ -293,3 +298,9 @@ func appendLongNote(src string, tokens []tokenizer.Token, i int, opt *ConvertOpt } return src } + +// isPoliteWord は丁寧語かどうかを判定する。 +// 読みがオで始まる言葉も true になる。 +func isPoliteWord(data tokenizer.TokenData) bool { + return strings.HasPrefix(data.Reading, "オ") +} diff --git a/ojosama_test.go b/ojosama_test.go index 954bb51..0c3914f 100644 --- a/ojosama_test.go +++ b/ojosama_test.go @@ -383,6 +383,20 @@ func TestConvert(t *testing.T) { opt: nil, wantErr: false, }, + { + desc: "正常系: 二重丁寧語にはしませんの", + src: "お嬢様、おにぎり、お腹、お寿司、おませさん、お利口さん", + want: "お嬢様、おにぎり、お腹、お寿司、おませさん、お利口さん", + opt: nil, + wantErr: false, + }, + { + desc: "正常系: 読みが「お」で始まる言葉には「お」を付けませんの", + src: "追い剥ぎ、大型、大分、おろし金", + want: "追い剥ぎ、大型、大分、おろし金", + opt: nil, + wantErr: false, + }, } for _, tt := range tests { diff --git a/rule.go b/rule.go index fe07ab4..c38cb93 100644 --- a/rule.go +++ b/rule.go @@ -95,18 +95,6 @@ var ( // excludeRules は変換処理を無視するルール。 // このルールは convertRules よりも優先して評価される。 excludeRules = []convertRule{ - { - Conditions: convertConditions{ - { - Type: convertTypeFeatures, - Value: []string{"名詞", "一般"}, - }, - { - Type: convertTypeSurface, - Value: []string{"お嬢様"}, - }, - }, - }, { Conditions: convertConditions{ {