Skip to content

Commit b1bd375

Browse files
committed
feat: no-ai-colon-continuationルールを追加し、自然な日本語表現を促進
1 parent dadcf03 commit b1bd375

File tree

4 files changed

+77
-25
lines changed

4 files changed

+77
-25
lines changed

README.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,54 @@ AIライティングで過度に使用されがちな誇張表現やハイプ的
8282

8383
AIが機械的に生成しがちな強調パターンを検出します。
8484

85+
### no-ai-colon-continuation
86+
87+
コロンの直後にブロック要素が続く英語的なパターンを検出します。日本語として自然な表現を促進するルールです。
88+
89+
このルールは形態素解析(kuromojin)を使用して、コロンの前の文が述語(動詞・形容詞・助動詞)で終わっているかを判定します。「使用方法:」のような名詞で終わる表現は自然な日本語として許可され、「実行します:」のような述語で終わる表現のみを検出します。
90+
91+
#### 検出される例
92+
93+
````markdown
94+
実行します:
95+
96+
```bash
97+
command
98+
```
99+
100+
説明します:
101+
102+
- 項目1
103+
- 項目2
104+
105+
例えば:
106+
107+
- 具体的な例
108+
````
109+
110+
#### より自然な日本語表現
111+
112+
````markdown
113+
実行方法は以下の通りです。
114+
115+
```bash
116+
command
117+
```
118+
119+
説明の内容は以下の通りです。
120+
121+
- 項目1
122+
- 項目2
123+
124+
たとえば、次のような例があります。
125+
126+
- 具体的な例
127+
128+
例:
129+
130+
- 具体的な例
131+
````
132+
85133
### ai-tech-writing-guideline
86134

87135
テクニカルライティングのベストプラクティスに基づいて、文書品質の改善提案を行います。
@@ -279,6 +327,13 @@ AIを利用しやすくするプラットフォームです。
279327
"disableAbstractPatterns": false,
280328
"disabledPredictivePatterns": false
281329
},
330+
"no-ai-colon-continuation": {
331+
"allows": ["許可したいテキスト", "/正規表現パターン/"],
332+
"disableCodeBlock": false,
333+
"disableList": false,
334+
"disableQuote": false,
335+
"disableTable": false
336+
},
282337
"ai-tech-writing-guideline": {
283338
"severity": "info", // サジェストとして扱う
284339
"allows": ["許可したいテキスト", "/正規表現パターン/"],
@@ -304,6 +359,16 @@ AIを利用しやすくするプラットフォームです。
304359
- `disableBoldListItems`: `true`にすると強調リストアイテムの検出を無効にする
305360
- `disableEmojiListItems`: `true`にすると絵文字リストアイテムの検出を無効にする
306361

362+
#### no-ai-colon-continuation
363+
364+
- `allows`: 指定したパターンにマッチする場合、エラーを報告しません
365+
- 文字列: `"許可したいテキスト"`
366+
- 正規表現: `"/パターン/フラグ"` (例: `"/使用方法.*/i"`)
367+
- `disableCodeBlock`: `true`にするとコロン後のコードブロック検出を無効にする
368+
- `disableList`: `true`にするとコロン後のリスト検出を無効にする
369+
- `disableQuote`: `true`にするとコロン後の引用検出を無効にする
370+
- `disableTable`: `true`にするとコロン後のテーブル検出を無効にする
371+
307372
### 正規表現パターンの使用例
308373

309374
`allows`オプションでは、[regexp-string-matcher](https://github.com/textlint/regexp-string-matcher)の形式で正規表現パターンを指定できます。

src/rules/no-ai-colon-continuation.ts

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { tokenize } from "kuromojin";
77
*
88
* 目的:
99
* AI生成文章でよく見られる英語構文の直訳パターンを検出します。
10-
* 例:「使用方法:」の直後にコードブロックや箇条書きが続く構文は、
11-
* 英語の "Usage:" を直訳したもので、日本語としては不自然な場合があります
10+
* ただし、「使用方法:」のような名詞で終わる表現は自然な日本語として許可されます。
11+
* 問題となるのは「実行します:」のような述語で終わる表現です
1212
*
1313
* より自然な日本語表現:
1414
* - 「使用方法は以下の通りです」
@@ -25,17 +25,6 @@ const rule = (context: any, options: any = {}) => {
2525

2626
// AST走査で隣接するノードの組み合わせをチェック
2727

28-
// 例外的な名詞表現(Intl.Segmenterで正しく判定できない特殊なケース)
29-
const exceptionNounExpressions = [
30-
// 複合名詞でセグメンテーションが難しいもの
31-
"使用方法",
32-
"実行方法",
33-
"設定方法",
34-
"操作方法",
35-
"API仕様",
36-
"システム仕様"
37-
];
38-
3928
const checkColonContinuation = async (paragraphNode: any, nextNode: any) => {
4029
// Paragraphノードのテキストを取得
4130
const paragraphText = getSource(paragraphNode);
@@ -114,8 +103,8 @@ const rule = (context: any, options: any = {}) => {
114103
// より保守的にエラーとする
115104
return false;
116105
} catch (error) {
117-
// 形態素解析でエラーが発生した場合は例外的な名詞表現のチェック
118-
return exceptionNounExpressions.some((expr) => beforeColonText === expr);
106+
// 形態素解析でエラーが発生した場合は許可(保守的にエラーを避ける)
107+
return true;
119108
}
120109
})();
121110

@@ -147,7 +136,7 @@ const rule = (context: any, options: any = {}) => {
147136
const matchRange = [paragraphColonIndex, paragraphColonIndex + 1] as const;
148137

149138
const ruleError = new RuleError(
150-
`「${beforeColonText}${colonChar}のようなパターンは英語構文の直訳の可能性があります。より自然な日本語表現を検討してください。`,
139+
`「${beforeColonText}${colonChar}のようなパターンは、読み手によっては英語の構文を直訳したような印象を与える場合があります。より自然な日本語表現を検討してください。`,
151140
{
152141
padding: locator.range(matchRange)
153142
}
@@ -159,8 +148,7 @@ const rule = (context: any, options: any = {}) => {
159148
return {
160149
async [Syntax.Document](node: any) {
161150
// ドキュメントの子ノードを順番にチェック
162-
for (let i = 0; i < node.children.length - 1; i++) {
163-
const currentNode = node.children[i];
151+
for (const [i, currentNode] of node.children.entries()) {
164152
const nextNode = node.children[i + 1];
165153

166154
// Paragraphノードの後にブロック要素が続く場合をチェック

test.textlintrc.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

test/rules/no-ai-colon-continuation.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ tester.run("no-ai-colon-continuation", noAiColonContinuation, {
8686
errors: [
8787
{
8888
message:
89-
"「実行します:」のようなパターンは英語構文の直訳の可能性があります。より自然な日本語表現を検討してください。"
89+
"「実行します:」のようなパターンは、読み手によっては英語の構文を直訳したような印象を与える場合があります。より自然な日本語表現を検討してください。"
9090
}
9191
]
9292
},
@@ -95,7 +95,7 @@ tester.run("no-ai-colon-continuation", noAiColonContinuation, {
9595
errors: [
9696
{
9797
message:
98-
"「説明します:」のようなパターンは英語構文の直訳の可能性があります。より自然な日本語表現を検討してください。"
98+
"「説明します:」のようなパターンは、読み手によっては英語の構文を直訳したような印象を与える場合があります。より自然な日本語表現を検討してください。"
9999
}
100100
]
101101
},
@@ -104,7 +104,7 @@ tester.run("no-ai-colon-continuation", noAiColonContinuation, {
104104
errors: [
105105
{
106106
message:
107-
"「使用します:」のようなパターンは英語構文の直訳の可能性があります。より自然な日本語表現を検討してください。"
107+
"「使用します:」のようなパターンは、読み手によっては英語の構文を直訳したような印象を与える場合があります。より自然な日本語表現を検討してください。"
108108
}
109109
]
110110
},
@@ -113,7 +113,7 @@ tester.run("no-ai-colon-continuation", noAiColonContinuation, {
113113
errors: [
114114
{
115115
message:
116-
"「表示します:」のようなパターンは英語構文の直訳の可能性があります。より自然な日本語表現を検討してください。"
116+
"「表示します:」のようなパターンは、読み手によっては英語の構文を直訳したような印象を与える場合があります。より自然な日本語表現を検討してください。"
117117
}
118118
]
119119
},
@@ -124,7 +124,7 @@ tester.run("no-ai-colon-continuation", noAiColonContinuation, {
124124
errors: [
125125
{
126126
message:
127-
"「例えば:」のようなパターンは英語構文の直訳の可能性があります。より自然な日本語表現を検討してください。"
127+
"「例えば:」のようなパターンは、読み手によっては英語の構文を直訳したような印象を与える場合があります。より自然な日本語表現を検討してください。"
128128
}
129129
]
130130
},
@@ -133,7 +133,7 @@ tester.run("no-ai-colon-continuation", noAiColonContinuation, {
133133
errors: [
134134
{
135135
message:
136-
"「JSXはJavaScriptの中でUIを記述するため、プログラマーにとって理解しやすいです:」のようなパターンは英語構文の直訳の可能性があります。より自然な日本語表現を検討してください。"
136+
"「JSXはJavaScriptの中でUIを記述するため、プログラマーにとって理解しやすいです:」のようなパターンは、読み手によっては英語の構文を直訳したような印象を与える場合があります。より自然な日本語表現を検討してください。"
137137
}
138138
]
139139
}

0 commit comments

Comments
 (0)