hanlint 0.0.17 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -20
- package/data/calqueFrame.json +60 -0
- package/data/cliches.json +39 -29
- package/data/collocationStops.txt +28 -0
- package/data/confusable.json +20 -20
- package/data/easyWords.json +12 -246
- package/data/exemplars.json +50 -29
- package/data/hiddenDeps.txt +11 -11
- package/data/japaneseLoan.json +27 -27
- package/data/koreanProse.txt +64 -0
- package/data/patterns.json +26 -26
- package/data/phraseRepeat.json +11 -0
- package/data/platformApis.txt +11 -11
- package/data/redundantPair.json +16 -16
- package/data/ruleCategories.json +2 -0
- package/data/ruleDocs.json +56 -54
- package/data/ruleMechanisms.json +2 -0
- package/data/screenNarration.json +10 -10
- package/data/screenSentence.json +60 -12
- package/data/screenTone.json +6 -6
- package/data/screenWord.json +70 -110
- package/data/spacing.json +12 -12
- package/data/spelling.json +29 -29
- package/data/translationese.json +23 -24
- package/data/usageCounts.report.json +1676 -0
- package/data/version.json +1 -1
- package/package.json +1 -1
- package/src/analysis/grammar/ending.js +1 -1
- package/src/analysis/grammar/hangul.js +4 -4
- package/src/analysis/grammar/josa.js +1 -1
- package/src/analysis/grammar/register.js +1 -1
- package/src/analysis/grammar/voice.js +1 -1
- package/src/analysis/index.js +3 -3
- package/src/analysis/josa.js +1 -1
- package/src/analysis/splitSentences.js +1 -1
- package/src/analysis/tokenize.js +41 -26
- package/src/baseline/store.js +8 -8
- package/src/cli/help.js +11 -10
- package/src/cli/main.js +332 -182
- package/src/cli/walk.js +2 -2
- package/src/cli/welcome.js +8 -8
- package/src/config/loadConfig.js +3 -3
- package/src/config/patch.js +6 -6
- package/src/config/readerContract.js +26 -26
- package/src/config/settings.js +44 -25
- package/src/config/toml.js +9 -9
- package/src/data/exemplars.js +21 -21
- package/src/data/load.js +6 -6
- package/src/data/operations.js +14 -14
- package/src/data/patches.js +10 -10
- package/src/data/patterns.js +5 -5
- package/src/data/profiles.js +6 -6
- package/src/data/prose.js +27 -0
- package/src/document/model.js +4 -4
- package/src/document/parseMarkdown.js +7 -7
- package/src/document/plainText.js +3 -3
- package/src/document/sourceText.js +117 -19
- package/src/edit/applyFixes.js +0 -0
- package/src/fingerprint/build.js +18 -9
- package/src/fingerprint/codeBlocks.js +3 -3
- package/src/fingerprint/codeMarkers.js +4 -4
- package/src/fingerprint/dictionaries.js +34 -7
- package/src/fingerprint/markers.js +27 -5
- package/src/fingerprint/readerState.js +9 -9
- package/src/fingerprint/sourceSentence.js +1 -1
- package/src/fingerprint/topics.js +1 -1
- package/src/guard/contract.js +6 -6
- package/src/guard/editLocality.js +1 -1
- package/src/guard/outline.js +1 -1
- package/src/guard/receipt.js +13 -13
- package/src/guard/surface.js +4 -4
- package/src/index.js +9 -7
- package/src/learn/edits.js +2 -2
- package/src/learn/operations.js +1 -1
- package/src/regex.js +2 -2
- package/src/report/compactReport.js +7 -3
- package/src/report/fingerprintJson.js +2 -2
- package/src/report/githubReport.js +1 -1
- package/src/report/jsonReport.js +3 -3
- package/src/report/registerMatch.js +2 -2
- package/src/report/sheet.js +0 -0
- package/src/report/textReport.js +35 -16
- package/src/report/writingSpec.js +17 -17
- package/src/rules/code/inputFileSource.js +1 -1
- package/src/rules/code/installImport.js +2 -2
- package/src/rules/code/platformApi.js +1 -1
- package/src/rules/document/countMismatch.js +2 -1
- package/src/rules/document/enoughOnce.js +2 -1
- package/src/rules/document/fieldEcho.js +10 -6
- package/src/rules/document/keywordHeading.js +1 -1
- package/src/rules/document/keywordMissing.js +1 -1
- package/src/rules/document/noQuestion.js +2 -2
- package/src/rules/document/promiseRecall.js +1 -1
- package/src/rules/document/tableOddCell.js +1 -1
- package/src/rules/finding.js +4 -4
- package/src/rules/paragraph/factListParagraph.js +1 -1
- package/src/rules/paragraph/paraFragment.js +1 -1
- package/src/rules/readerDebt.js +1 -1
- package/src/rules/registry.js +30 -26
- package/src/rules/screen/screenWord.js +2 -1
- package/src/rules/sentence/calqueFrame.js +11 -0
- package/src/rules/sentence/cliche.js +7 -3
- package/src/rules/sentence/connectorRepeat.js +2 -1
- package/src/rules/sentence/danglingDeixis.js +1 -1
- package/src/rules/sentence/dash.js +1 -1
- package/src/rules/sentence/deixis.js +1 -1
- package/src/rules/sentence/doubleNegative.js +2 -1
- package/src/rules/sentence/doublePassive.js +2 -1
- package/src/rules/sentence/draftHistory.js +2 -1
- package/src/rules/sentence/endingRepeat.js +3 -2
- package/src/rules/sentence/euiChain.js +1 -1
- package/src/rules/sentence/fillerOpener.js +1 -1
- package/src/rules/sentence/hardWord.js +6 -3
- package/src/rules/sentence/imperativePeriod.js +1 -1
- package/src/rules/sentence/japaneseLoan.js +7 -3
- package/src/rules/sentence/longSentence.js +1 -1
- package/src/rules/sentence/negationRedefine.js +1 -1
- package/src/rules/sentence/nounPile.js +10 -4
- package/src/rules/sentence/numberOrphan.js +1 -1
- package/src/rules/sentence/outsideProfile.js +8 -3
- package/src/rules/sentence/phraseRepeat.js +54 -0
- package/src/rules/sentence/redundantPair.js +7 -3
- package/src/rules/sentence/translationese.js +7 -3
- package/src/rules/shared/candidates.js +2 -2
- package/src/rules/shared/dictionaryRule.js +46 -8
- package/src/rules/shared/repeat.js +2 -2
- package/src/rules/structure/bridgeRepeat.js +3 -3
- package/src/rules/structure/emojiBullet.js +1 -1
- package/src/rules/structure/headingSkip.js +1 -1
- package/src/rules/structure/headingUniform.js +2 -1
- package/src/rules/structure/loneSubheading.js +1 -1
- package/src/rules/structure/moreLater.js +1 -1
- package/src/text.js +2 -2
- package/src/usage/counts.js +54 -0
- package/src/usage/index.js +8 -0
- package/src/usage/sentences.js +681 -0
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# hanlint
|
|
2
2
|
|
|
3
3
|
한국어 글에서 반복되는 결함을 찾는 린터다. 번역투, 상투어, 이중 피동과 문장 구조를 검사하고,
|
|
4
|
-
지적마다
|
|
4
|
+
지적마다 위치와 이유를 돌려주고, 고칠 문장이 하나로 정해진 지적에는 고친 문장도 준다. Node.js 18 이상에서 런타임 의존성 없이 실행한다.
|
|
5
5
|
|
|
6
6
|
**[설치 없이 써 보기](https://eddmpython.github.io/hanlint/)** ·
|
|
7
7
|
[전체 소개](https://github.com/eddmpython/hanlint#readme) ·
|
|
@@ -25,9 +25,9 @@ npx hanlint fix 글.md
|
|
|
25
25
|
npx hanlint 글.md
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
`fix`는
|
|
29
|
-
일반 검사는
|
|
30
|
-
|
|
28
|
+
`fix`는 고칠 문장이 하나로 정해진 곳만 **파일에서 직접 고친다**. 바뀐 곳을 확인하고 다시 검사한다.
|
|
29
|
+
일반 검사는 오류 지적이 없으면 0, 있으면 1, 입력이나 설정이 잘못되면 2로 끝난다.
|
|
30
|
+
경고만 있으면 0이며, `--errors-only`를 주면 경고를 보이지 않는다.
|
|
31
31
|
명령마다 다른 판정은 [종료 코드 안내](https://github.com/eddmpython/hanlint/blob/main/skills/specs/start/cli.md#종료-코드)를 따른다.
|
|
32
32
|
|
|
33
33
|
## JavaScript에서 검사하기
|
|
@@ -50,13 +50,14 @@ for (const finding of lintText(text, config)) {
|
|
|
50
50
|
파일과 설정 경로를 읽는 API는 Node 전용이다. 문자열 API에 설정을 생략하면 기본 설정을 쓴다.
|
|
51
51
|
|
|
52
52
|
`blog`, `report`, `docs`, `guide`, `essay`, `fiction`, `encyclopedia`, `chat`, `screen`의 아홉 프리셋이 있다.
|
|
53
|
-
`screen`은 화면의 글
|
|
53
|
+
`screen`은 화면의 글(버튼, 라벨, 상태, 빈 상태)을 검사한다. 단어 하나면 될 곳에 쓴 문장, 화면을 설명하는 글,
|
|
54
|
+
접객 말투를 잡고 산문 규칙은 끈다.
|
|
54
55
|
프로젝트 설정은 `npx hanlint init --preset docs`로 만들고 `npx hanlint doctor`로 확인한다.
|
|
55
56
|
규칙 목록은 `npx hanlint rules`, 개별 규칙의 근거는 `npx hanlint explain translationese`에서 본다.
|
|
56
57
|
|
|
57
58
|
## 수정하면서 원문 보호하기
|
|
58
59
|
|
|
59
|
-
Reader Contract는 사람이 확인한 독자,
|
|
60
|
+
Reader Contract는 사람이 확인한 독자, 목표와 사실을 받아 숫자, URL, 인라인 코드와 링크 목적지를 보호한다.
|
|
60
61
|
|
|
61
62
|
```js
|
|
62
63
|
import { Contract, Patch, check, renderCheck, verifyPatch } from "hanlint";
|
|
@@ -76,34 +77,36 @@ console.log(result);
|
|
|
76
77
|
|
|
77
78
|
`contractFromText(text, reader, goal)`은 원문에서 사실 후보를 모은다. 사람이 확인한 뒤 사용한다.
|
|
78
79
|
`contractFromTextV2(text, reader, goal, 2)`는 H2 제목의 수와 순서도 보호할 계약을 만든다.
|
|
79
|
-
패치는
|
|
80
|
+
패치는 원문의 한 곳에 정확히 맞고, 기존 위반을 줄이며, 지켜야 할 값을 새로 어기거나 오류 지적을 새로 만들지 않아야 통과한다.
|
|
80
81
|
사실의 진실, 의미 보존과 자연스러움은 사람이 판단한다.
|
|
81
82
|
|
|
82
83
|
JSON 형식과 전체 조건은
|
|
83
|
-
[Reader Contract](https://github.com/eddmpython/hanlint/blob/main/skills/specs/start/readerContract.md)가
|
|
84
|
+
[Reader Contract](https://github.com/eddmpython/hanlint/blob/main/skills/specs/start/readerContract.md)가 기준이다.
|
|
84
85
|
|
|
85
86
|
## 브라우저와 수정 사례
|
|
86
87
|
|
|
87
|
-
[
|
|
88
|
-
원문 비교와 개인
|
|
89
|
-
[편집기 안내](https://eddmpython.github.io/hanlint/guide.html)에서 확인한다.
|
|
88
|
+
[브라우저 편집기](https://eddmpython.github.io/hanlint/)는 같은 npm 엔진으로 검사, 고침,
|
|
89
|
+
원문 비교와 개인 기록, 그리고 공개 GitHub 저장소 주소 하나로 만드는 화면 글 시트를 제공한다. 사용 방법은
|
|
90
|
+
[브라우저 편집기 안내](https://eddmpython.github.io/hanlint/guide.html)에서 확인한다.
|
|
90
91
|
|
|
91
|
-
다음 API는 **main과
|
|
92
|
-
|
|
92
|
+
다음 API는 **main과 지금의 브라우저 편집기에 먼저 반영된다.** 어느 npm 버전에 들어갔는지는
|
|
93
|
+
[변경 이력](https://github.com/eddmpython/hanlint/blob/main/CHANGELOG.md)에서 확인한다.
|
|
93
94
|
|
|
94
95
|
| API | 결과 |
|
|
95
96
|
|---|---|
|
|
96
|
-
| `inspectText(text, config)` | 지적,
|
|
97
|
-
| `learnText(before, after, config)` | 사람이 확인하고 승인할 문장 고침과
|
|
97
|
+
| `inspectText(text, config)` | 지적, 문체에 맞춘 고친 예시, 승인 고침 후보와 분석표 |
|
|
98
|
+
| `learnText(before, after, config)` | 사람이 확인하고 승인할 문장 고침과 치환 후보 |
|
|
98
99
|
| `compareRevision(before, after, config)` | 자유 원고의 숫자, 링크, 코드와 H2 제목 변화 |
|
|
100
|
+
| `sheetRows(sources, config, everything)` | `{ label, source }`마다 화면 글을 뽑아 규칙을 돌린 시트 행. CLI `sheet`와 브라우저가 같은 함수를 쓴다 |
|
|
99
101
|
|
|
100
|
-
브라우저에서
|
|
102
|
+
브라우저에서 엔진을 실행하려면 사전과 모듈을 함께 조립한다.
|
|
101
103
|
저장소의 [정적 사이트 빌드 절차](https://github.com/eddmpython/hanlint/blob/main/skills/specs/operation/webEditor.md)를 따른다.
|
|
102
104
|
|
|
103
105
|
Python의 `hanlint learn 전.md 승인본.md --format toml`로 만든 후보는 사람이 검토한 뒤
|
|
104
|
-
`hanlint.toml`의 `[[patches]]`와 `[[operations]]`로 승인할 수 있다. 두
|
|
105
|
-
원문 일치와 문맥 조건을 통과한 고침만 제안하며, 모호한 곳에서는
|
|
106
|
-
보호할 고유명사와 프로젝트 용어는 `protectedTerms`에 넣는다.
|
|
106
|
+
`hanlint.toml`의 `[[patches]]`와 `[[operations]]`로 승인할 수 있다. 두 구현이 같은 설정을 읽는다.
|
|
107
|
+
원문 일치와 문맥 조건을 통과한 고침만 제안하며, 모호한 곳에서는 고침을 내지 않는다.
|
|
108
|
+
보호할 고유명사와 프로젝트 용어는 `protectedTerms`에 넣는다. 이 용어와 한 글자라도 겹치는 곳은 사전 규칙,
|
|
109
|
+
지시어, 이중 피동 규칙도 짚지 않는다.
|
|
107
110
|
후보 생성, 개인 승인과 공통 규칙 반영은 별도 단계다.
|
|
108
111
|
|
|
109
112
|
## 자동화와 지원 범위
|
|
@@ -112,7 +115,7 @@ GitHub Actions, pre-commit과 Claude Code 훅의 전체 설정은
|
|
|
112
115
|
[자동화 연결 안내](https://github.com/eddmpython/hanlint/blob/main/skills/specs/start/integrations.md)에 있다.
|
|
113
116
|
훅은 후속 작업에 지적을 전달하며, CI의 종료 코드 검사와는 목적이 다르다.
|
|
114
117
|
|
|
115
|
-
Python
|
|
118
|
+
Python 구현과 공유하는 검사는 같은 사전과 적합성 자료로 검증한다.
|
|
116
119
|
`audit`, `map`, `diff`, `learn`, `profile`, `coverage` 등 분석·실험 명령은 Python 쪽에 있다.
|
|
117
120
|
전체 명령의 구분은 [명령과 설정](https://github.com/eddmpython/hanlint/blob/main/skills/specs/start/cli.md)을 참고한다.
|
|
118
121
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"entry": [
|
|
3
|
+
{
|
|
4
|
+
"pattern": "(?<![가-힣])[가-힣]*(?:글|포스팅|게시물|게시글|상품|링크|페이지|화면|영상|세트|기록|파일|카드|문서|블로그|캡션|대본|목록|투두리스트|메시지)(?:에|에게|으로|로)[,)'\"’”]*(?:\\s+\\S*[^\\s을를]){0,2}\\s+(?:잇(?:다|고|지|는|기|게|습|던|자(?!국)|니|겠)|이어(?:요|야|도)(?![가-힣])|이었|이을(?![가-힣]))",
|
|
5
|
+
"why": "영어 link를 그대로 옮긴 말이다. `글에 잇다`는 `글에 연결하다`로 쓴다. `잇다`는 줄이나 이야기처럼 끊긴 것을 이어 붙일 때 쓴다",
|
|
6
|
+
"source": ""
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"pattern": "(?<![가-힣])[가-힣]*(?:상품|링크|포스팅|게시물|게시글|페이지|세트|캡션|투두리스트)(?:을|를)[,)'\"’”]*(?:\\s+\\S*[^\\s을를]){0,2}\\s+(?:잇(?:다|고|지|는|기|게|습|던|자(?!국)|니|겠)|이어(?:요|야|도)(?![가-힣])|이었|이은(?![가-힣])(?!\\s+[0-9]+(?:위|등))|이을(?![가-힣]))",
|
|
10
|
+
"unless": "(?<![가-힣])[가-힣]*(?:글|포스팅|게시물|게시글|상품|링크|페이지|화면|영상|세트|기록|파일|카드|문서|블로그|캡션|대본|목록|투두리스트|메시지)(?:에|에게|으로|로)[,)'\"’”]*(?:\\s+\\S*[^\\s을를]){0,2}\\s+(?:잇(?:다|고|지|는|기|게|습|던|자(?!국)|니|겠)|이어(?:요|야|도)(?![가-힣])|이었|이을(?![가-힣]))",
|
|
11
|
+
"why": "영어 link를 그대로 옮긴 말이다. `상품을 글에 잇다`는 `상품을 글에 연결하다`로 쓴다",
|
|
12
|
+
"source": ""
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "(?<![가-힣])[가-힣]*(?:상품|링크|포스팅|게시물|게시글|페이지|세트|캡션)\\s+잇기",
|
|
16
|
+
"why": "영어 link를 그대로 옮긴 말이다. `상품 잇기`는 `상품 연결`로 쓴다",
|
|
17
|
+
"source": ""
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "(?<![가-힣])[가-힣]*(?:(?<!스)팀|팀장|부서|세션|담당자?|제작자|대표님?|독자|시청자|사용자)(?:에|에게|한테|께|으로|로)[,)'\"’”]*(?:\\s+\\S+){0,2}\\s+닿(?:다|고|지|는|기|게|습|던|은|을|아|았|으|니|겠)",
|
|
21
|
+
"unless": "(?:연락|소식|손길|목소리|마음|진심)(?:이|가|은|는|도|만)?(?![가-힣])",
|
|
22
|
+
"why": "영어 reach를 그대로 옮긴 말이다. `그 팀에 닿는 줄`은 `그 팀에 해당하는 규칙`으로 쓴다. `닿다`는 몸과 물건이 맞붙거나 연락이 될 때 쓴다",
|
|
23
|
+
"source": ""
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"pattern": "(?<![가-힣])(?:숫자|값|글자|텍스트)(?:가|이|는|은)[,)'\"’”]*\\s+그려(?:지[기면고는지자며니]|집|져(?!\\s*있)|졌)",
|
|
27
|
+
"unless": "그래프|곡선|차트|도표|막대|붓|연필|물감|크레파스|선으로",
|
|
28
|
+
"why": "영어 render를 그대로 옮긴 말이다. `숫자가 그려지기 전`은 `숫자가 화면에 뜨기 전`으로 쓴다. `그려지다`는 그림을 그릴 때 쓴다",
|
|
29
|
+
"source": ""
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"pattern": "(?<![가-힣])[가-힣]*(?:는지|은지)[,)'\"’”]*\\s+갈(?:리|립|렸|린|릴|려)",
|
|
33
|
+
"why": "영어 tell apart를 그대로 옮긴 말이다. `어디가 막혔는지 갈린다`는 `어디가 막혔는지 알 수 있다`로 쓴다. `갈리다`는 의견이나 승부가 나뉠 때 쓴다",
|
|
34
|
+
"source": ""
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"pattern": "(?<![가-힣])같은\\s+자리를\\s+(?:맴)?(?:돌(?:고|며|면|았|다|던|지|기)|돈다|돕니|도는)",
|
|
38
|
+
"why": "영어 going in circles를 그대로 옮긴 말이다. `같은 자리를 돌고 있다`는 `진도가 나가지 않는다`로 쓴다",
|
|
39
|
+
"source": ""
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"pattern": "(?<![가-힣])[가-힣]*[아어여워줘져혀겨려]\\s+봄(?:과|와|을|이|도|은)(?![가-힣])",
|
|
43
|
+
"unless": "여름|가을|겨울|꽃|계절|날씨|봄철|봄날|봄바람|새싹|따뜻|입춘|벚꽃|추위|얼음|햇살|봄이\\s+(?:오|왔|와|옵|온|되)|봄을\\s+(?:맞|알리|느끼|기다)",
|
|
44
|
+
"why": "`해 보다`를 `-ㅁ`으로 줄여 이름처럼 쓴 말이다. 요즘 글에서는 이렇게 쓰지 않는다. `열어 봄과 누름`은 `조회와 클릭`으로 쓴다",
|
|
45
|
+
"source": ""
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"pattern": "(?<![가-힣])맡(?:겼|긴|겨\\s?두었|겨\\s?둔|겨\\s?뒀)",
|
|
49
|
+
"unless": "(?:에게|한테|께|에게서|에다|에다가|한테서|께서)(?![가-힣])|[가-힣](?:님|팀|세션)(?:이|은|는)(?![가-힣])|[가-힣A-Za-z)](?<![시분초일날때뒤후전중주월년간밤낮쯤안])(?<!동안)(?<!무렵)(?<!아침)(?<!저녁)(?<!오전)(?<!오후)에(?![가-힣])|믿고\\s+맡|몸을\\s+맡",
|
|
50
|
+
"why": "누구에게 맡겼는지가 문장에 없다. 받는 사람을 쓰거나 `예약 발행 대기에 올렸습니다`처럼 한 일을 쓴다",
|
|
51
|
+
"source": ""
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"pattern": "(?<![가-힣])걸어\\s?(?:두었|뒀)",
|
|
55
|
+
"unless": "(?:에게|한테|께|에게서|에다|에다가|한테서|께서)(?![가-힣])|[가-힣](?:님|팀|세션)(?:이|은|는)(?![가-힣])|[가-힣A-Za-z)](?<![시분초일날때뒤후전중주월년간밤낮쯤안])(?<!동안)(?<!무렵)(?<!아침)(?<!저녁)(?<!오전)(?<!오후)에(?![가-힣])|(?:링크|시동|자물쇠|잠금|조건|기대|희망|전화|예약|알람)(?:을|를|도)?\\s+걸어",
|
|
56
|
+
"why": "어디에 걸었는지가 문장에 없다. 무엇을 언제 하도록 예약했는지 쓴다. `고침을 걸어 두었습니다`는 `06:10 뒤에 제목을 고치도록 예약해 두었습니다`로 쓴다",
|
|
57
|
+
"source": ""
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
package/data/cliches.json
CHANGED
|
@@ -2,98 +2,108 @@
|
|
|
2
2
|
"entry": [
|
|
3
3
|
{
|
|
4
4
|
"pattern": "^핵심은",
|
|
5
|
-
"why": "결론을
|
|
6
|
-
"source": "
|
|
5
|
+
"why": "결론을 꾸미는 말이다. 핵심이 무엇인지 그 자리에서 바로 쓴다",
|
|
6
|
+
"source": ""
|
|
7
7
|
},
|
|
8
8
|
{
|
|
9
9
|
"pattern": "결국 중요한 것은",
|
|
10
|
-
"why": "결론을
|
|
11
|
-
"source": "
|
|
10
|
+
"why": "결론을 꾸미는 말이다. 무엇이 중요한지 바로 쓴다",
|
|
11
|
+
"source": ""
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"pattern": "무엇보다 중요한 것은",
|
|
15
|
-
"why": "결론을
|
|
16
|
-
"source": "
|
|
15
|
+
"why": "결론을 꾸미는 말이다. 무엇이 중요한지 바로 쓴다",
|
|
16
|
+
"source": ""
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"pattern": "단순(?:히|한)\\s?.{0,12}(?:을|를)\\s?넘어",
|
|
20
|
-
"why": "
|
|
21
|
-
"source": "
|
|
20
|
+
"why": "AI가 즐겨 쓰는 대구다. `단순히 A를 넘어 B`에서 B만 쓴다",
|
|
21
|
+
"source": ""
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"pattern": "주목할 (?:필요|만)",
|
|
25
25
|
"why": "주목하라고 말하는 대신 주목할 사실을 쓴다",
|
|
26
|
-
"source": "
|
|
26
|
+
"source": ""
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"pattern": "다음과 같이 정리",
|
|
30
30
|
"why": "정리한다고 예고하는 대신 정리한 내용을 바로 쓴다",
|
|
31
|
-
"source": "
|
|
31
|
+
"source": ""
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"pattern": "(?:정리|요약)하자면",
|
|
35
|
-
"why": "
|
|
36
|
-
"source": "
|
|
35
|
+
"why": "앞 내용을 되풀이하며 결론을 꺼내는 말이다. 앞 절을 다시 말하지 않는다",
|
|
36
|
+
"source": ""
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
"pattern": "살펴보(?:겠|도록 하겠)습니다",
|
|
40
|
-
"why": "
|
|
41
|
-
"source": "
|
|
40
|
+
"why": "할 일을 예고만 하는 말이다. 뒤에 실제로 하는 일이 없으면 문장을 통째로 지운다",
|
|
41
|
+
"source": ""
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
"pattern": "알아보(?:겠|도록 하겠)습니다",
|
|
45
|
-
"why": "
|
|
46
|
-
"source": "
|
|
45
|
+
"why": "할 일을 예고만 하는 말이다. 뒤에 실제로 하는 일이 없으면 문장을 통째로 지운다",
|
|
46
|
+
"source": ""
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
"pattern": "이 글에서는",
|
|
50
50
|
"why": "글이 무엇을 할지 말하는 대신 그것을 한다",
|
|
51
|
-
"source": "
|
|
51
|
+
"source": ""
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
"pattern": "라고 할 수 있(?:습니다|다)",
|
|
55
|
-
"why": "판단을 흐리는
|
|
56
|
-
"source": "AI 신호
|
|
55
|
+
"why": "판단을 흐리는 완곡 표현이다. 그렇다고 쓴다",
|
|
56
|
+
"source": "AI 신호 조사, gist 패턴 4"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
"pattern": "일부 전문가들은",
|
|
60
|
-
"why": "출처
|
|
60
|
+
"why": "출처 없이 남의 말로 돌리는 표현이다. 누가 말했는지 쓰거나 지운다",
|
|
61
61
|
"source": "Wikipedia Signs of AI writing 2.5"
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
"pattern": "아직도 .{0,12}(?:하시나요|하고 계신가요)",
|
|
65
|
-
"why": "겪지 않은
|
|
66
|
-
"source": "
|
|
65
|
+
"why": "독자가 겪지 않은 문제를 지어내 불안을 부추기는 말이다",
|
|
66
|
+
"source": ""
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
"pattern": "모르면 큰일",
|
|
70
|
-
"why": "
|
|
71
|
-
"source": "
|
|
70
|
+
"why": "불안을 지어내는 말이다",
|
|
71
|
+
"source": ""
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
"pattern": "혁신적",
|
|
75
75
|
"why": "광고 문구다. 무엇이 어떻게 달라졌는지 쓴다",
|
|
76
|
-
"source": "
|
|
76
|
+
"source": ""
|
|
77
77
|
},
|
|
78
78
|
{
|
|
79
79
|
"pattern": "새로운 패러다임",
|
|
80
80
|
"why": "광고 문구다",
|
|
81
|
-
"source": "
|
|
81
|
+
"source": ""
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
84
|
"pattern": "게임 체인저",
|
|
85
85
|
"why": "광고 문구다",
|
|
86
|
-
"source": "
|
|
86
|
+
"source": ""
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
89
|
"pattern": "매우 중요",
|
|
90
90
|
"why": "중요하다고 말하는 대신 왜 중요한지 쓴다",
|
|
91
|
-
"source": "
|
|
91
|
+
"source": ""
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
94
|
"pattern": "획기적",
|
|
95
95
|
"why": "광고 문구다",
|
|
96
|
-
"source": "
|
|
96
|
+
"source": ""
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"pattern": "이유[가는]? 여기",
|
|
100
|
+
"why": "이유를 말해 놓고 그 이유를 다시 가리키는 말이다. 이유를 말했으면 거기서 끝낸다",
|
|
101
|
+
"source": "사람 글 0.10%, 기계 글 7.50%가 쓴다. 75배"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"pattern": "^그다음",
|
|
105
|
+
"why": "산문에 번호를 매기는 말이다. 진짜 목록이면 목록으로 쓰고, 산문이면 앞 문장에 나온 이름을 다시 써서 잇는다",
|
|
106
|
+
"source": "사람 글 0.47%, 기계 글 6.11%가 쓴다. 13배"
|
|
97
107
|
}
|
|
98
108
|
]
|
|
99
109
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# 함께 쓰는 말 (usage 의 collocations) 을 셀 때 이웃으로 세지 않는 어절. 꼬리 사전이 못 가르는 연결 어절과 접속 부사다.
|
|
2
|
+
# 뜻을 잇는 낱말이지 앞 낱말과 결합하는 말이 아니다. 실측: 사업보고서 색인에서 `리스부채` 의 앞 명사 상위가
|
|
3
|
+
# `및`, `중`, `경우`, `따라`, `않아` 였다 (2026-09-19). 판정은 usage/sentences.py 의 neighbourOf 다.
|
|
4
|
+
및
|
|
5
|
+
등
|
|
6
|
+
즉
|
|
7
|
+
또는
|
|
8
|
+
또한
|
|
9
|
+
따라
|
|
10
|
+
따르면
|
|
11
|
+
인해
|
|
12
|
+
위해
|
|
13
|
+
통해
|
|
14
|
+
대해
|
|
15
|
+
의해
|
|
16
|
+
관해
|
|
17
|
+
비해
|
|
18
|
+
대하여
|
|
19
|
+
위하여
|
|
20
|
+
통하여
|
|
21
|
+
의하여
|
|
22
|
+
관하여
|
|
23
|
+
비하여
|
|
24
|
+
않아
|
|
25
|
+
않고
|
|
26
|
+
아니라
|
|
27
|
+
더불어
|
|
28
|
+
이어
|
package/data/confusable.json
CHANGED
|
@@ -3,74 +3,74 @@
|
|
|
3
3
|
{
|
|
4
4
|
"pattern": "(학생|사람|부모|교사|개발자|작가|시민|국민|회원|직원|전문가|자식|친구|동료|팀장|대표|리더|엔지니어|디자이너|연구자|저자|독자|사용자|운영자|관리자|선생님|의사|변호사|아버지|어머니|아들|딸|후배|선배|신입|초보자)(으)?로써",
|
|
5
5
|
"fix": "$1$2로서",
|
|
6
|
-
"why": "
|
|
6
|
+
"why": "지위·신분·자격을 나타내므로 `로서`로 쓴다. `로써`는 재료·수단·도구에 쓴다",
|
|
7
7
|
"source": "한글 맞춤법 제57항, 온라인가나다 298340"
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
"pattern": "(정답|답|문제|과녁|퀴즈|예상|수수께끼)(을|를) 맞추",
|
|
11
11
|
"fix": "$1$2 맞히",
|
|
12
|
-
"why": "정답을 알아내거나 과녁에 닿게 하는
|
|
12
|
+
"why": "정답을 알아내거나 과녁에 닿게 하는 뜻이라 `맞히다`로 쓴다. `맞추다`는 대어 보거나 나란히 할 때 쓴다",
|
|
13
13
|
"source": "한글 맞춤법 제57항, 온라인가나다 298340"
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"pattern": "(정답|답|문제|과녁|퀴즈|예상|수수께끼)(을|를) 맞췄",
|
|
17
17
|
"fix": "$1$2 맞혔",
|
|
18
|
-
"why": "정답을 알아내거나 과녁에 닿게 하는
|
|
18
|
+
"why": "정답을 알아내거나 과녁에 닿게 하는 뜻이라 `맞히다`로 쓴다",
|
|
19
19
|
"source": "한글 맞춤법 제57항, 온라인가나다 298340"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"pattern": "(줄|시간|간격|초점|박자|입|비위|일정|보조|눈높이|답안지)(을|를) 맞히",
|
|
23
23
|
"fix": "$1$2 맞추",
|
|
24
|
-
"why": "나란히 하거나 대어 보는
|
|
24
|
+
"why": "나란히 하거나 대어 보는 뜻이라 `맞추다`로 쓴다. `맞히다`는 정답이나 과녁에 쓴다",
|
|
25
25
|
"source": "한글 맞춤법 제57항, 온라인가나다 298340"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"pattern": "(와|과|랑|하고) 틀리(?=[다고면니지므])",
|
|
29
29
|
"fix": "$1 다르",
|
|
30
|
-
"why": "같지 않다는
|
|
31
|
-
"source": "표준국어대사전 표제어
|
|
30
|
+
"why": "같지 않다는 뜻이라 `다르다`로 쓴다. `틀리다`는 그르다는 뜻이다",
|
|
31
|
+
"source": "표준국어대사전 표제어 `다르다`, `틀리다`"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"pattern": "(와|과|랑|하고) 틀린",
|
|
35
35
|
"fix": "$1 다른",
|
|
36
|
-
"why": "같지 않다는
|
|
37
|
-
"source": "표준국어대사전 표제어
|
|
36
|
+
"why": "같지 않다는 뜻이라 `다르다`로 쓴다. `틀리다`는 그르다는 뜻이다",
|
|
37
|
+
"source": "표준국어대사전 표제어 `다르다`, `틀리다`"
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"pattern": "(와|과|랑|하고) 틀려(?![가-힣])",
|
|
41
41
|
"fix": "$1 달라",
|
|
42
|
-
"why": "같지 않다는
|
|
43
|
-
"source": "표준국어대사전 표제어
|
|
42
|
+
"why": "같지 않다는 뜻이라 `다르다`로 쓴다. `틀리다`는 그르다는 뜻이다",
|
|
43
|
+
"source": "표준국어대사전 표제어 `다르다`, `틀리다`"
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"pattern": "(와|과|랑|하고) 틀립니다",
|
|
47
47
|
"fix": "$1 다릅니다",
|
|
48
|
-
"why": "같지 않다는
|
|
49
|
-
"source": "표준국어대사전 표제어
|
|
48
|
+
"why": "같지 않다는 뜻이라 `다르다`로 쓴다. `틀리다`는 그르다는 뜻이다",
|
|
49
|
+
"source": "표준국어대사전 표제어 `다르다`, `틀리다`"
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
"pattern": "(와|과|랑|하고) 틀렸",
|
|
53
53
|
"fix": "$1 달랐",
|
|
54
|
-
"why": "같지 않다는
|
|
55
|
-
"source": "표준국어대사전 표제어
|
|
54
|
+
"why": "같지 않다는 뜻이라 `다르다`로 쓴다. `틀리다`는 그르다는 뜻이다",
|
|
55
|
+
"source": "표준국어대사전 표제어 `다르다`, `틀리다`"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"pattern": "(병|감기|상처|몸|컨디션|증상)(이|가) 낳",
|
|
59
59
|
"fix": "$1$2 낫",
|
|
60
|
-
"why": "병이
|
|
61
|
-
"source": "표준국어대사전 표제어
|
|
60
|
+
"why": "병이 없어진다는 뜻이라 `낫다`로 쓴다. `낳다`는 배 속의 아이나 새끼를 내놓는 것이다",
|
|
61
|
+
"source": "표준국어대사전 표제어 `낫다`, `낳다`, 상담 사례 5890"
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
"pattern": "(?<![을를명] )(?<!둘 )(?<!셋 )(?<!넷 )(?<!하나 )(?<!다섯 )(?<!여섯 )(?<!일곱 )(?<!여덟 )(?<!아홉 )(?<!열 )더 낳은",
|
|
65
65
|
"fix": "더 나은",
|
|
66
|
-
"why": "더 좋다는
|
|
67
|
-
"source": "표준국어대사전 표제어
|
|
66
|
+
"why": "더 좋다는 뜻이라 `낫다`의 관형형 `나은`으로 쓴다",
|
|
67
|
+
"source": "표준국어대사전 표제어 `낫다`, 상담 사례 5890"
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
"pattern": "(?<![을를명] )(?<!둘 )(?<!셋 )(?<!넷 )(?<!하나 )(?<!다섯 )(?<!여섯 )(?<!일곱 )(?<!여덟 )(?<!아홉 )(?<!열 )더 낳(다|아|았)",
|
|
71
71
|
"fix": "더 나$1",
|
|
72
|
-
"why": "더 좋다는
|
|
73
|
-
"source": "표준국어대사전 표제어
|
|
72
|
+
"why": "더 좋다는 뜻이라 `낫다`로 쓴다. `낫고`, `낫지`, `나아`, `나았다`로 활용한다",
|
|
73
|
+
"source": "표준국어대사전 표제어 `낫다`, 상담 사례 5890"
|
|
74
74
|
}
|
|
75
75
|
]
|
|
76
76
|
}
|