textlint-rule / textlint-rule-sentence-length

textlint rule that limit maximum length of sentence.
MIT License
7 stars 3 forks source link

括弧で囲まれた文章が一文として判定される #18

Closed HBonsai closed 1 year ago

HBonsai commented 2 years ago

image

「」や各種括弧内の文章が"。"で文を区切っているにもかかわらず一文として判定され、指定文字数を超えると指摘対象になってしまいます。小説を書くときは文章を「」で囲うことは珍しくないため、囲っていても通常の文と同様に扱っていただけると助かります。

azu commented 1 year ago

これは、どういう結果になるのが適切なのでしょうか?

仮に、「一文。一文。一文。」の中をセンテンスに分割してカウントしても、 Aは「一文。一文。一文。」と言った を全体として1つのセンテンスとしても扱うような気がします。

Aは「一文。一文。一文。」と言った

この文全体を何文字としてカウントするべきかという問題があります。 「」内をセンテンスとして区切った場合にそれがmax以下ならエラーしないという変更をしても、文全体の文字数のカウント方法が決まらないため、どう扱えばいいのかわからなくなっています。

(実装としては、「」の中身がセリフなのかを自動で判断はできないので、何の記号がサブのセンテンスなのかを設定する必要もあります。「固有名詞」とセリフが区別できないため。今の実装は「固有名詞」を扱ってるイメージになってる。)

セリフのようなものを期待する場合、セリフに対するセンテンスの長さをチェックする意味が薄い気がするので、このルールで扱うのが難しそうな気もしています。(口語向けのルールと文章向けのルールの違いがあるような気がします)

セリフの場合は、skipPatterns オプションでカッコ内をカウントしないように設定するのがいいのかなという感じはしています。

{
    "rules": {
        "sentence-length": {
            "max": 100,
            "skipPatterns": [
                "/「.*?」/"
            ]

        }
    }
}

とすると Aは「...」と言う。 が6文字のセンテンスとして扱われるかなと思います。

カッコ内をさらにセンテンス分割して扱う方法は今のところないですが… これを実装するには、カッコを含むセンテンスをどう扱うかが決まらないと難しそうでした。

HBonsai commented 1 year ago

色々と丁寧にありがとうございます。おっしゃる通り口語と文語を単一のルールで扱うのは無理がありそうですので、差し当たっては例示いただいたこちらの方法で対処いたします。

セリフの場合は、skipPatterns オプションでカッコ内をカウントしないように設定するのがいいのかなという感じはしています。

azu commented 1 year ago

READMEに、今のセンテンスの定義と "..." をスキップする設定について追加したので、このIssueは閉じますね。 https://github.com/textlint-rule/textlint-rule-sentence-length#a-sentence

利用してるライブラリの方で、センテンス中に含まれる「...」の位置情報とか長さは取れるようになったので、 「...」の中身の長さが一定上ならエラーとかも実装はできるようになりました。 ただいまいち正しい使い道がわからないので(どういう設定したらどう動くのが適切か実用的なのか)、一旦は特にルールに実装はない状態です。改めて要望とか出てきたら検討する形にします。