chaffjs 0.27.1 → 0.28.0
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 +2 -1
- package/dist/cli-text.d.ts.map +1 -1
- package/dist/cli-text.js +6 -4
- package/dist/cli-text.js.map +1 -1
- package/dist/derived/number-word-counts.d.ts +10 -0
- package/dist/derived/number-word-counts.d.ts.map +1 -0
- package/dist/derived/number-word-counts.js +21 -0
- package/dist/derived/number-word-counts.js.map +1 -0
- package/dist/detectors/amount-scale.d.ts +3 -0
- package/dist/detectors/amount-scale.d.ts.map +1 -0
- package/dist/detectors/amount-scale.js +50 -0
- package/dist/detectors/amount-scale.js.map +1 -0
- package/dist/detectors/change-rate.d.ts.map +1 -1
- package/dist/detectors/change-rate.js +12 -1
- package/dist/detectors/change-rate.js.map +1 -1
- package/dist/detectors/currency-notation.d.ts +3 -1
- package/dist/detectors/currency-notation.d.ts.map +1 -1
- package/dist/detectors/currency-notation.js +2 -2
- package/dist/detectors/currency-notation.js.map +1 -1
- package/dist/detectors/derived-numbers.d.ts.map +1 -1
- package/dist/detectors/derived-numbers.js +9 -1
- package/dist/detectors/derived-numbers.js.map +1 -1
- package/dist/detectors/fact-consistency.d.ts.map +1 -1
- package/dist/detectors/fact-consistency.js +14 -1
- package/dist/detectors/fact-consistency.js.map +1 -1
- package/dist/detectors/name-variant.d.ts.map +1 -1
- package/dist/detectors/name-variant.js +18 -10
- package/dist/detectors/name-variant.js.map +1 -1
- package/dist/detectors/registry/amount-scale.d.ts +3 -0
- package/dist/detectors/registry/amount-scale.d.ts.map +1 -0
- package/dist/detectors/registry/amount-scale.js +3 -0
- package/dist/detectors/registry/amount-scale.js.map +1 -0
- package/dist/facts/counted-facts.d.ts +16 -0
- package/dist/facts/counted-facts.d.ts.map +1 -0
- package/dist/facts/counted-facts.js +45 -0
- package/dist/facts/counted-facts.js.map +1 -0
- package/dist/name-variants.d.ts +19 -5
- package/dist/name-variants.d.ts.map +1 -1
- package/dist/name-variants.js +60 -6
- package/dist/name-variants.js.map +1 -1
- package/dist/structure/amount-scale.d.ts +29 -0
- package/dist/structure/amount-scale.d.ts.map +1 -0
- package/dist/structure/amount-scale.js +70 -0
- package/dist/structure/amount-scale.js.map +1 -0
- package/dist/structure/subject-change.d.ts +8 -0
- package/dist/structure/subject-change.d.ts.map +1 -0
- package/dist/structure/subject-change.js +31 -0
- package/dist/structure/subject-change.js.map +1 -0
- package/package.json +3 -3
- package/rules/amount-scale-consistency.yaml +74 -0
- package/rules/change-rate-mismatch.yaml +5 -4
- package/rules/elapsed-years-mismatch.yaml +2 -2
- package/rules/name-variant.yaml +5 -2
- package/rules/summary-fact-mismatch.yaml +2 -2
- package/src/cli-text.ts +6 -4
- package/src/derived/number-word-counts.ts +28 -0
- package/src/detectors/amount-scale.ts +63 -0
- package/src/detectors/change-rate.ts +15 -2
- package/src/detectors/currency-notation.ts +2 -2
- package/src/detectors/derived-numbers.ts +9 -2
- package/src/detectors/fact-consistency.ts +17 -1
- package/src/detectors/name-variant.ts +14 -4
- package/src/detectors/registry/amount-scale.ts +4 -0
- package/src/facts/counted-facts.ts +59 -0
- package/src/name-variants.ts +106 -11
- package/src/structure/amount-scale.ts +97 -0
- package/src/structure/subject-change.ts +35 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** How many words after a number may name what it counts ("new enterprise customers"). */
|
|
2
|
+
const MAX_COUNTED_WORDS = 3;
|
|
3
|
+
const COUNTED_WORD = new Set(["ADJ", "NOUN"]);
|
|
4
|
+
const SUBJECT_WORD = new Set(["NOUN", "PROPN", "PRON"]);
|
|
5
|
+
/** A number right after a preposition is part of something larger: the pool in "1 of 3 proposals". */
|
|
6
|
+
const NOT_A_COUNT_AFTER = new Set(["ADP", "NUM"]);
|
|
7
|
+
/** The number is the end of a range ("between 10 and 12 customers") or of a pair ("1 of 3"). */
|
|
8
|
+
const isPartOfLarger = (tokens, index) => {
|
|
9
|
+
const [twoBefore, before] = [tokens[index - 2], tokens[index - 1]];
|
|
10
|
+
return NOT_A_COUNT_AFTER.has(before?.pos ?? "") || (before?.pos === "CCONJ" && twoBefore?.pos === "NUM");
|
|
11
|
+
};
|
|
12
|
+
const wordOf = (token) => (token.lemma ?? token.surface).toLowerCase();
|
|
13
|
+
/** The adjectives and nouns right after the number at index, up to the last noun ("new customers"). */
|
|
14
|
+
const countedWords = (tokens, index) => {
|
|
15
|
+
const after = tokens.slice(index + 1, index + 1 + MAX_COUNTED_WORDS);
|
|
16
|
+
const stop = after.findIndex((token) => !COUNTED_WORD.has(token.pos));
|
|
17
|
+
const run = stop < 0 ? after : after.slice(0, stop);
|
|
18
|
+
return run.slice(0, run.findLastIndex((token) => token.pos === "NOUN") + 1);
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* What the number at index in a sentence's tokens counts: the words after it, the nearest verb before it, and the nearest
|
|
22
|
+
* noun or pronoun before that verb (who counts). None when one of the three is missing or the number is part of a larger one.
|
|
23
|
+
*/
|
|
24
|
+
export const countedPhraseAt = (tokens, index) => {
|
|
25
|
+
if (isPartOfLarger(tokens, index))
|
|
26
|
+
return [];
|
|
27
|
+
const words = countedWords(tokens, index);
|
|
28
|
+
const verbAt = tokens.slice(0, index).findLastIndex((token) => token.pos === "VERB");
|
|
29
|
+
const subject = tokens.slice(0, Math.max(0, verbAt)).findLast((token) => SUBJECT_WORD.has(token.pos));
|
|
30
|
+
const [first, last, verb] = [words[0], words.at(-1), tokens[verbAt]];
|
|
31
|
+
if (first === undefined || last === undefined || verb === undefined || subject === undefined)
|
|
32
|
+
return [];
|
|
33
|
+
const key = ["counted", wordOf(subject), wordOf(verb), ...words.map(wordOf)].join("\u0000");
|
|
34
|
+
return [{ start: first.span.start, end: last.span.end, label: words.map((token) => token.surface).join(" "), key }];
|
|
35
|
+
};
|
|
36
|
+
/** A calendar year ("2026 revenue") is a point in time, not a count. */
|
|
37
|
+
const YEAR = /^(?:1[89]|2[01])\d{2}$/u;
|
|
38
|
+
/** The fact of each number with no unit that a counted phrase follows after one character (the space). */
|
|
39
|
+
export const countedFacts = (source, values, phrases) => values.flatMap((value) => {
|
|
40
|
+
if (value.kind !== "quantity" || value.unit !== "" || YEAR.test(source.slice(value.start, value.end)))
|
|
41
|
+
return [];
|
|
42
|
+
const phrase = phrases.find((candidate) => candidate.start === value.end + 1);
|
|
43
|
+
return phrase === undefined ? [] : [{ label: phrase.label, key: phrase.key, value }];
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=counted-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counted-facts.js","sourceRoot":"","sources":["../../src/facts/counted-facts.ts"],"names":[],"mappings":"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"}
|
package/dist/name-variants.d.ts
CHANGED
|
@@ -1,25 +1,39 @@
|
|
|
1
1
|
import type { Token } from "./plugin.ts";
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* words は名前の語(記号を除く)。読みが同じ二つの名前が、どの語で違うかを見るため。person は人の名前と読めるもの(解析器が
|
|
4
|
+
* 人名と読むか、敬称が付く)。
|
|
5
|
+
*/
|
|
3
6
|
export type NameMention = {
|
|
4
7
|
readonly surface: string;
|
|
5
8
|
readonly offset: number;
|
|
6
9
|
readonly reading: string | undefined;
|
|
7
10
|
readonly words: readonly string[];
|
|
11
|
+
readonly person?: boolean;
|
|
8
12
|
};
|
|
9
13
|
export type NameVariant = {
|
|
10
14
|
readonly mention: NameMention;
|
|
11
15
|
readonly usual: string;
|
|
12
|
-
readonly kind: "spelling" | "reading" | "near";
|
|
16
|
+
readonly kind: "spelling" | "reading" | "near" | "character";
|
|
13
17
|
};
|
|
18
|
+
/** 字体の違う同じ字(斎・斉・齋)。字から、その組の代表の字へ。 */
|
|
19
|
+
export type VariantChars = ReadonlyMap<string, string>;
|
|
14
20
|
/**
|
|
15
21
|
* 文の語から、名前の現れ。surface は source の上の書いたまま(折り返しの空白は一つにまとめる)。
|
|
16
22
|
* 大文字だけの名前(ACME INC、NASA)は外す。契約書の署名欄や略語で、ふつうの書き方の別の形ではない。小文字の英字だけの語も外す。
|
|
17
23
|
*/
|
|
18
|
-
export declare const mentionsIn: (tokens: readonly Token[], source: string) => NameMention[];
|
|
24
|
+
export declare const mentionsIn: (tokens: readonly Token[], source: string, personSuffixes?: readonly string[]) => NameMention[];
|
|
25
|
+
/**
|
|
26
|
+
* 解析器が名前と読めなかった、字体の違う字を含む人の名前(髙橋様、𠮷田様、﨑山様)。敬称のすぐ前の漢字の連なりで、語彙表の字を
|
|
27
|
+
* 含み、ほかの名前の現れと重ならないもの。
|
|
28
|
+
*/
|
|
29
|
+
export declare const suffixedNamesIn: (source: string, suffixes: readonly string[], chars: VariantChars, taken: readonly NameMention[]) => NameMention[];
|
|
19
30
|
/** 比べる形。幅(AWS と AWS)、大文字小文字、空白と記号は名前を変えない。 */
|
|
20
31
|
export declare const nameKey: (surface: string) => string;
|
|
21
32
|
/** 二つの語が一字違いか。英字だけの、長さ 5 以上の語で。 */
|
|
22
33
|
export declare const isNearWord: (left: string, right: string) => boolean;
|
|
23
|
-
/**
|
|
24
|
-
|
|
34
|
+
/**
|
|
35
|
+
* 同じ名前の、少ないほうの書き方。書き方ごとに最初の現れを一つ。同じ現れを二つの見方が言えば、先の見方だけ。chars は字体の
|
|
36
|
+
* 違う同じ字の組(語彙表 name-variant-char)。
|
|
37
|
+
*/
|
|
38
|
+
export declare const nameVariants: (mentions: readonly NameMention[], chars?: VariantChars) => NameVariant[];
|
|
25
39
|
//# sourceMappingURL=name-variants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name-variants.d.ts","sourceRoot":"","sources":["../src/name-variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"name-variants.d.ts","sourceRoot":"","sources":["../src/name-variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAOzC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAA;CAAE,CAAC;AAElJ,qCAAqC;AACrC,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AA0DvD;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,SAAS,KAAK,EAAE,EAAE,QAAQ,MAAM,EAAE,iBAAgB,SAAS,MAAM,EAAO,KAAG,WAAW,EAarH,CAAC;AAeL;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,UAAU,SAAS,MAAM,EAAE,EAAE,OAAO,YAAY,EAAE,OAAO,SAAS,WAAW,EAAE,KAAG,WAAW,EAU1I,CAAC;AAEJ,8CAA8C;AAC9C,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,KAAG,MAIH,CAAC;AAoFxC,mCAAmC;AACnC,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,OAKxD,CAAC;AA4DF;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,UAAU,SAAS,WAAW,EAAE,EAAE,QAAO,YAAwB,KAAG,WAAW,EAwB3G,CAAC"}
|
package/dist/name-variants.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { escapeRegExp } from "./orthography.js";
|
|
1
2
|
const NAME = "PROPN";
|
|
2
3
|
/**
|
|
3
4
|
* 名前の語のあいだに挟まってよい記号(AT&T、Rolls-Royce、ジョン・スミス)。読点は挟まない。
|
|
@@ -45,11 +46,15 @@ const withoutEdgeQuotes = (text) => {
|
|
|
45
46
|
* (Attachment S、Appendix B は札で、空白を詰めると Attachments と同じ形になる)。
|
|
46
47
|
*/
|
|
47
48
|
const NOT_COMPARED = /@|(?:^|\s)\p{L}(?:\s|$)/u;
|
|
49
|
+
/** 人名と読む解析器の印(UD の NameType: 姓 Sur、名 Giv、どちらとも言えない人名 Prs)。 */
|
|
50
|
+
const PERSON_TYPES = new Set(["Sur", "Giv", "Prs"]);
|
|
51
|
+
/** 人の名前か。解析器が人名と読む語を含むか、すぐ後ろに敬称(様、さん、氏)が付く。 */
|
|
52
|
+
const isPerson = (run, next, suffixes) => run.some((token) => PERSON_TYPES.has(token.features?.["NameType"] ?? "")) || (next !== undefined && suffixes.includes(next.surface));
|
|
48
53
|
/**
|
|
49
54
|
* 文の語から、名前の現れ。surface は source の上の書いたまま(折り返しの空白は一つにまとめる)。
|
|
50
55
|
* 大文字だけの名前(ACME INC、NASA)は外す。契約書の署名欄や略語で、ふつうの書き方の別の形ではない。小文字の英字だけの語も外す。
|
|
51
56
|
*/
|
|
52
|
-
export const mentionsIn = (tokens, source) => runsOf(tokens).flatMap((run) => {
|
|
57
|
+
export const mentionsIn = (tokens, source, personSuffixes = []) => runsOf(tokens).flatMap((run) => {
|
|
53
58
|
const first = run[0];
|
|
54
59
|
const last = run.at(-1);
|
|
55
60
|
if (first === undefined || last === undefined)
|
|
@@ -61,8 +66,34 @@ export const mentionsIn = (tokens, source) => runsOf(tokens).flatMap((run) => {
|
|
|
61
66
|
const words = run.filter((token) => !JOINERS.has(token.surface));
|
|
62
67
|
const readings = words.map((token) => token.reading);
|
|
63
68
|
const reading = readings.every((value) => value !== undefined && value !== "") ? readings.join("") : undefined;
|
|
64
|
-
|
|
69
|
+
const person = isPerson(run, tokens[tokens.indexOf(last) + 1], personSuffixes);
|
|
70
|
+
return [{ surface, offset: first.span.start, reading, words: words.map((token) => token.surface), person }];
|
|
65
71
|
});
|
|
72
|
+
/** 敬称の前の名前の字数(髙橋、髙橋太郎)。長い漢字の連なり(株式会社髙橋)は名前だけを切り出せない。 */
|
|
73
|
+
const MAX_SUFFIXED_NAME = 4;
|
|
74
|
+
const MIN_SUFFIXED_NAME = 2;
|
|
75
|
+
/** 敬称の前を読む範囲(UTF-16 の単位)。名前より長い漢字の連なりを、長いまま見るため。 */
|
|
76
|
+
const SUFFIX_LOOKBACK = 20;
|
|
77
|
+
const HAN = /^\p{Script=Han}$/u;
|
|
78
|
+
/** 文字列の終わりの漢字の連なり。 */
|
|
79
|
+
const trailingHan = (text) => {
|
|
80
|
+
const letters = [...text];
|
|
81
|
+
return letters.slice(letters.findLastIndex((letter) => !HAN.test(letter)) + 1).join("");
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* 解析器が名前と読めなかった、字体の違う字を含む人の名前(髙橋様、𠮷田様、﨑山様)。敬称のすぐ前の漢字の連なりで、語彙表の字を
|
|
85
|
+
* 含み、ほかの名前の現れと重ならないもの。
|
|
86
|
+
*/
|
|
87
|
+
export const suffixedNamesIn = (source, suffixes, chars, taken) => suffixes.flatMap((suffix) => [...source.matchAll(new RegExp(escapeRegExp(suffix), "gu"))].flatMap((match) => {
|
|
88
|
+
const run = trailingHan(source.slice(Math.max(0, match.index - SUFFIX_LOOKBACK), match.index));
|
|
89
|
+
const length = [...run].length;
|
|
90
|
+
if (length < MIN_SUFFIXED_NAME || length > MAX_SUFFIXED_NAME || ![...run].some((letter) => chars.has(letter)))
|
|
91
|
+
return [];
|
|
92
|
+
const offset = match.index - run.length;
|
|
93
|
+
if (taken.some((mention) => mention.offset < match.index && offset < mention.offset + mention.surface.length))
|
|
94
|
+
return [];
|
|
95
|
+
return [{ surface: run, offset, reading: undefined, words: [run], person: true }];
|
|
96
|
+
}));
|
|
66
97
|
/** 比べる形。幅(AWS と AWS)、大文字小文字、空白と記号は名前を変えない。 */
|
|
67
98
|
export const nameKey = (surface) => surface
|
|
68
99
|
.normalize("NFKC")
|
|
@@ -72,10 +103,13 @@ const talliesOf = (mentions) => {
|
|
|
72
103
|
const tallies = new Map();
|
|
73
104
|
mentions.forEach((mention) => {
|
|
74
105
|
const tally = tallies.get(mention.surface);
|
|
106
|
+
const person = mention.person === true;
|
|
75
107
|
if (tally === undefined)
|
|
76
|
-
tallies.set(mention.surface, { surface: mention.surface, first: mention, count: 1 });
|
|
77
|
-
else
|
|
108
|
+
tallies.set(mention.surface, { surface: mention.surface, first: mention, count: 1, person });
|
|
109
|
+
else {
|
|
78
110
|
tally.count += 1;
|
|
111
|
+
tally.person ||= person;
|
|
112
|
+
}
|
|
79
113
|
});
|
|
80
114
|
return [...tallies.values()];
|
|
81
115
|
};
|
|
@@ -160,13 +194,33 @@ const isSlipOf = (tally, other) => {
|
|
|
160
194
|
return words !== undefined && isNearWord(...words);
|
|
161
195
|
};
|
|
162
196
|
const nearVariants = (tallies) => variantsIn(groupBy(tallies, maskedKeys), "near", isSlipOf);
|
|
163
|
-
/**
|
|
164
|
-
|
|
197
|
+
/** 字体の違う字(斎と斉)を組の代表の字に寄せた形。 */
|
|
198
|
+
const characterKey = (tally, chars) => [...tally.surface].map((letter) => chars.get(letter) ?? letter).join("");
|
|
199
|
+
/** 人の名前を、字体の違う同じ字(斎藤 と 斉藤、渡辺 と 渡邊)で書き分けた所。 */
|
|
200
|
+
const characterVariants = (tallies, chars) => variantsIn(groupBy(tallies.filter((tally) => tally.person), (tally) => [characterKey(tally, chars)]), "character");
|
|
201
|
+
/** 字数が同じで、一字だけが違う(松本 と 松元)。 */
|
|
202
|
+
const oneCharApart = (left, right) => {
|
|
203
|
+
const [leftChars, rightChars] = [[...left], [...right]];
|
|
204
|
+
return leftChars.length === rightChars.length && leftChars.filter((char, index) => char !== rightChars[index]).length === 1;
|
|
205
|
+
};
|
|
206
|
+
/**
|
|
207
|
+
* 読みが同じ人の名前が、一字だけ違う(松本 と 松元)。読みの同じ別の姓(伊藤 と 伊東)もあるので、多いほうが二度以上、
|
|
208
|
+
* 少ないほうが一度だけのときに限る。
|
|
209
|
+
*/
|
|
210
|
+
const isPersonSlipOf = (tally, other) => tally.count === 1 && other.count >= 2 && oneCharApart(tally.surface, other.surface);
|
|
211
|
+
const personReadingVariants = (tallies) => variantsIn(groupBy(tallies.filter((tally) => tally.person), (tally) => (tally.first.reading === undefined ? [] : [tally.first.reading])), "reading", isPersonSlipOf);
|
|
212
|
+
/**
|
|
213
|
+
* 同じ名前の、少ないほうの書き方。書き方ごとに最初の現れを一つ。同じ現れを二つの見方が言えば、先の見方だけ。chars は字体の
|
|
214
|
+
* 違う同じ字の組(語彙表 name-variant-char)。
|
|
215
|
+
*/
|
|
216
|
+
export const nameVariants = (mentions, chars = new Map()) => {
|
|
165
217
|
const tallies = talliesOf(mentions);
|
|
166
218
|
const found = [
|
|
167
219
|
...variantsIn(groupBy(tallies, (tally) => [nameKey(tally.surface)]), "spelling"),
|
|
168
220
|
...variantsIn(groupBy(tallies, (tally) => (tally.first.reading === undefined ? [] : [tally.first.reading])), "reading", oneWordApart),
|
|
169
221
|
...nearVariants(tallies),
|
|
222
|
+
...characterVariants(tallies, chars),
|
|
223
|
+
...personReadingVariants(tallies),
|
|
170
224
|
];
|
|
171
225
|
const reported = new Set();
|
|
172
226
|
return found
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name-variants.js","sourceRoot":"","sources":["../src/name-variants.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"name-variants.js","sourceRoot":"","sources":["../src/name-variants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One amount: where it is, as written, its currency, its value, and the largest word of scale it was written with (unit:
|
|
3
|
+
* 10000 for 30万円, 1000000 for $1.5 million), undefined when it was written in digits only.
|
|
4
|
+
*/
|
|
5
|
+
export type ScaledAmount = {
|
|
6
|
+
readonly offset: number;
|
|
7
|
+
readonly written: string;
|
|
8
|
+
readonly currency: string;
|
|
9
|
+
readonly value: number;
|
|
10
|
+
readonly unit: number | undefined;
|
|
11
|
+
};
|
|
12
|
+
/** The amount written the other way, and the first one of its size written the usual way. */
|
|
13
|
+
export type ScaleMix = {
|
|
14
|
+
readonly odd: ScaledAmount;
|
|
15
|
+
readonly usual: ScaledAmount;
|
|
16
|
+
};
|
|
17
|
+
/** For each currency, the amounts written the other way from the rest of their order of magnitude, in document order. */
|
|
18
|
+
export declare const scaleMixes: (amounts: readonly ScaledAmount[]) => ScaleMix[];
|
|
19
|
+
/** A word of scale and the value it multiplies by (万 10000, million 1000000). */
|
|
20
|
+
export type ScaleWord = {
|
|
21
|
+
readonly word: string;
|
|
22
|
+
readonly value: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The value of an amount as written, without its currency: 1億2,000万 is 120000000, 1.5 million is 1500000. Undefined when a
|
|
26
|
+
* part is followed by a word that is not one of scale, or nothing is read.
|
|
27
|
+
*/
|
|
28
|
+
export declare const amountValue: (written: string, words: readonly ScaleWord[]) => number | undefined;
|
|
29
|
+
//# sourceMappingURL=amount-scale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount-scale.d.ts","sourceRoot":"","sources":["../../src/structure/amount-scale.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,6FAA6F;AAC7F,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAkDpF,yHAAyH;AACzH,eAAO,MAAM,UAAU,GAAI,SAAS,SAAS,YAAY,EAAE,KAAG,QAAQ,EAKrE,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAI1E;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,EAAE,OAAO,SAAS,SAAS,EAAE,KAAG,MAAM,GAAG,SAYnF,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// An amount written in digits where the document writes amounts of that size with a word of scale, or the other way
|
|
2
|
+
// round (250,000円 beside 30万円; $2,500,000 beside $1.5 million). Small amounts in digits and large ones with 万 or
|
|
3
|
+
// million is one way of writing, not a mix, so only amounts of the same order of magnitude are compared. Pure.
|
|
4
|
+
/** A digit amount with more significant digits than this (1,234,567円) is a precise figure no word of scale would write. */
|
|
5
|
+
const MAX_SIGNIFICANT_DIGITS = 3;
|
|
6
|
+
const significantDigits = (value) => {
|
|
7
|
+
const digits = [...String(value).replace(".", "")];
|
|
8
|
+
const first = digits.findIndex((digit) => digit !== "0");
|
|
9
|
+
return first < 0 ? 0 : digits.findLastIndex((digit) => digit !== "0") - first + 1;
|
|
10
|
+
};
|
|
11
|
+
const isScaled = (amount) => amount.unit !== undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Whether the amount could be written the other way. A digit one when it is round (250,000, not 250,500); a scaled one when
|
|
14
|
+
* it is at least one of its unit: "£0.2 million" is written to line up with larger amounts beside it, not to give a size.
|
|
15
|
+
*/
|
|
16
|
+
const comparable = (amount) => amount.value > 0 && (amount.unit === undefined ? significantDigits(amount.value) <= MAX_SIGNIFICANT_DIGITS : amount.value >= amount.unit);
|
|
17
|
+
/** The order of magnitude, from the digits of the whole part (Math.log10 is not exact at every power of ten). */
|
|
18
|
+
const magnitudeOf = (value) => String(Math.floor(value)).length - 1;
|
|
19
|
+
const countScaled = (amounts) => amounts.filter(isScaled).length;
|
|
20
|
+
/** Whether the scaled way is the odd one in a size: the fewer there, then the fewer at that size and above, then the later. */
|
|
21
|
+
const oddIsScaled = (band, larger) => {
|
|
22
|
+
const scaledInBand = countScaled(band);
|
|
23
|
+
if (scaledInBand * 2 !== band.length)
|
|
24
|
+
return scaledInBand * 2 < band.length;
|
|
25
|
+
const scaledLarger = countScaled(larger);
|
|
26
|
+
if (scaledLarger * 2 !== larger.length)
|
|
27
|
+
return scaledLarger * 2 < larger.length;
|
|
28
|
+
const firstScaled = band.findIndex(isScaled);
|
|
29
|
+
const firstDigits = band.findIndex((amount) => !isScaled(amount));
|
|
30
|
+
return firstScaled > firstDigits;
|
|
31
|
+
};
|
|
32
|
+
const mixesOfCurrency = (amounts) => {
|
|
33
|
+
const magnitudes = [...new Set(amounts.map((amount) => magnitudeOf(amount.value)))];
|
|
34
|
+
return magnitudes.flatMap((magnitude) => {
|
|
35
|
+
const band = amounts.filter((amount) => magnitudeOf(amount.value) === magnitude);
|
|
36
|
+
const scaledIsOdd = oddIsScaled(band, amounts.filter((amount) => magnitudeOf(amount.value) >= magnitude));
|
|
37
|
+
const usual = band.find((amount) => isScaled(amount) !== scaledIsOdd);
|
|
38
|
+
if (usual === undefined)
|
|
39
|
+
return [];
|
|
40
|
+
return band.filter((amount) => isScaled(amount) === scaledIsOdd).map((amount) => ({ odd: amount, usual }));
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
/** For each currency, the amounts written the other way from the rest of their order of magnitude, in document order. */
|
|
44
|
+
export const scaleMixes = (amounts) => {
|
|
45
|
+
const ordered = amounts.filter(comparable).toSorted((left, right) => left.offset - right.offset);
|
|
46
|
+
return [...new Set(ordered.map((amount) => amount.currency))]
|
|
47
|
+
.flatMap((currency) => mixesOfCurrency(ordered.filter((amount) => amount.currency === currency)))
|
|
48
|
+
.toSorted((left, right) => left.odd.offset - right.odd.offset);
|
|
49
|
+
};
|
|
50
|
+
const NUMBER_THEN_WORD = /(\d+(?:,\d{3})*(?:\.\d+)?)\s?([^\s\d.,]*)/gu;
|
|
51
|
+
/**
|
|
52
|
+
* The value of an amount as written, without its currency: 1億2,000万 is 120000000, 1.5 million is 1500000. Undefined when a
|
|
53
|
+
* part is followed by a word that is not one of scale, or nothing is read.
|
|
54
|
+
*/
|
|
55
|
+
export const amountValue = (written, words) => {
|
|
56
|
+
const parts = [...written.normalize("NFKC").matchAll(NUMBER_THEN_WORD)];
|
|
57
|
+
if (parts.length === 0)
|
|
58
|
+
return undefined;
|
|
59
|
+
const values = parts.map((part) => {
|
|
60
|
+
const number = Number((part[1] ?? "").replaceAll(",", ""));
|
|
61
|
+
const word = (part[2] ?? "").toLowerCase();
|
|
62
|
+
if (word === "")
|
|
63
|
+
return number;
|
|
64
|
+
const scale = words.find((entry) => entry.word.toLowerCase() === word);
|
|
65
|
+
return scale === undefined ? Number.NaN : number * scale.value;
|
|
66
|
+
});
|
|
67
|
+
const total = values.reduce((sum, value) => sum + value, 0);
|
|
68
|
+
return Number.isFinite(total) ? total : undefined;
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=amount-scale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount-scale.js","sourceRoot":"","sources":["../../src/structure/amount-scale.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Token } from "../plugin.ts";
|
|
2
|
+
/**
|
|
3
|
+
* The joining word at index is followed by a noun the sentence has not used before it: "and costs were", "and costs $1,500"
|
|
4
|
+
* after "Revenue was $1,000", where "and revenue was" after "ACME's revenue was $1,000" names the same thing again. A
|
|
5
|
+
* sentence with no noun before the joining word gives nothing to compare with.
|
|
6
|
+
*/
|
|
7
|
+
export declare const startsOtherSubject: (tokens: readonly Token[], index: number) => boolean;
|
|
8
|
+
//# sourceMappingURL=subject-change.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-change.d.ts","sourceRoot":"","sources":["../../src/structure/subject-change.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAsB1C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,KAAK,EAAE,EAAE,OAAO,MAAM,KAAG,OAO5E,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Whether a joining word ("and") starts a clause about another subject: "Revenue was $1,000 in 2025 and costs were $1,500
|
|
2
|
+
// in 2026" joins two subjects, "… in 2025 and $1,500 in 2026" or "… and revenue was $1,500" one. Two words for one thing
|
|
3
|
+
// ("sales" and "revenue") read as two subjects, so the pair is left alone rather than read wrongly. Pure: reads the tagger's
|
|
4
|
+
// parts of speech and lemmas.
|
|
5
|
+
const NOUN = new Set(["NOUN", "PROPN"]);
|
|
6
|
+
/** Words that may stand before the noun that starts the clause ("and the costs", "and our operating costs"). */
|
|
7
|
+
const BEFORE_NOUN = new Set(["DET", "ADJ", "PRON"]);
|
|
8
|
+
const wordOf = (token) => (token.lemma ?? token.surface).toLowerCase();
|
|
9
|
+
/** The last noun of the run of nouns at the start of tokens, past determiners and adjectives ("the operating costs" → cost). */
|
|
10
|
+
const leadingNoun = (tokens) => {
|
|
11
|
+
const start = tokens.findIndex((token) => !BEFORE_NOUN.has(token.pos));
|
|
12
|
+
if (start < 0)
|
|
13
|
+
return undefined;
|
|
14
|
+
const end = tokens.slice(start).findIndex((token) => !NOUN.has(token.pos));
|
|
15
|
+
const nouns = tokens.slice(start, end < 0 ? tokens.length : start + end);
|
|
16
|
+
return nouns.at(-1);
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The joining word at index is followed by a noun the sentence has not used before it: "and costs were", "and costs $1,500"
|
|
20
|
+
* after "Revenue was $1,000", where "and revenue was" after "ACME's revenue was $1,000" names the same thing again. A
|
|
21
|
+
* sentence with no noun before the joining word gives nothing to compare with.
|
|
22
|
+
*/
|
|
23
|
+
export const startsOtherSubject = (tokens, index) => {
|
|
24
|
+
const next = leadingNoun(tokens.slice(index + 1));
|
|
25
|
+
const before = tokens
|
|
26
|
+
.slice(0, index)
|
|
27
|
+
.filter((token) => NOUN.has(token.pos))
|
|
28
|
+
.map(wordOf);
|
|
29
|
+
return next !== undefined && before.length > 0 && !before.includes(wordOf(next));
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=subject-change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-change.js","sourceRoot":"","sources":["../../src/structure/subject-change.ts"],"names":[],"mappings":"AAEA,0HAA0H;AAC1H,yHAAyH;AACzH,6HAA6H;AAC7H,8BAA8B;AAE9B,MAAM,IAAI,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7D,gHAAgH;AAChH,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzE,MAAM,MAAM,GAAG,CAAC,KAAY,EAAU,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAEtF,gIAAgI;AAChI,MAAM,WAAW,GAAG,CAAC,MAAwB,EAAqB,EAAE;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAwB,EAAE,KAAa,EAAW,EAAE;IACrF,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM;SAClB,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACtC,GAAG,CAAC,MAAM,CAAC,CAAC;IACf,OAAO,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chaffjs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.0",
|
|
4
4
|
"description": "Prose validation harness. Finds what is hard to read, and never rewrites it for you.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"chaff",
|
|
@@ -87,8 +87,8 @@
|
|
|
87
87
|
},
|
|
88
88
|
"dependencies": {
|
|
89
89
|
"@anthropic-ai/sdk": "^0.125.0",
|
|
90
|
-
"@chaffjs/lang-en": "0.
|
|
91
|
-
"@chaffjs/lang-ja": "0.
|
|
90
|
+
"@chaffjs/lang-en": "0.25.0",
|
|
91
|
+
"@chaffjs/lang-ja": "0.27.0",
|
|
92
92
|
"mdast-util-from-markdown": "^2.0.3",
|
|
93
93
|
"mdast-util-frontmatter": "^2.0.1",
|
|
94
94
|
"mdast-util-gfm-table": "^2.0.0",
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
id: amount-scale-consistency
|
|
2
|
+
layer: L2
|
|
3
|
+
status: stable
|
|
4
|
+
how_to_find: amount-scale
|
|
5
|
+
severity: info
|
|
6
|
+
|
|
7
|
+
name:
|
|
8
|
+
ja: 同じ桁の金額を二通りに書いている
|
|
9
|
+
en: Amounts of one size written two ways
|
|
10
|
+
|
|
11
|
+
why:
|
|
12
|
+
ja: 「設計費30万円、制作費250,000円」のように、同じくらいの金額を「万」と数字だけの二通りで書くと、読み手は桁を数え直し、別の扱いの金額かと迷います。別々の見積もりやメールを寄せ集めたときに起きます。小さな金額を数字で、大きな金額を「万」「億」で書くのはふつうの書き方なので、同じ桁(十万の位なら十万の位どうし)の金額だけを比べ、その桁で少ないほうを指します。
|
|
13
|
+
en: When amounts of one size are written two ways ("$1.5 million for design, $2,500,000 for building"), the reader counts the zeros again and wonders whether the two are different kinds of amount. It happens when quotes and emails are pasted together. Small amounts in digits and large ones with "million" is a normal way of writing, so only amounts of the same order of magnitude are compared, and the way that order uses less is pointed at.
|
|
14
|
+
|
|
15
|
+
message:
|
|
16
|
+
ja: 「{written}」と書いています(この文書は同じ桁の金額を「{usual}」のように書きます)
|
|
17
|
+
en: '"{written}" here, where the document writes amounts of this size like "{usual}"'
|
|
18
|
+
|
|
19
|
+
how_to_fix:
|
|
20
|
+
ja: 同じ桁の金額は、文書の多いほうの書き方にそろえてください。
|
|
21
|
+
en: Write amounts of the same size the way the rest of the document does.
|
|
22
|
+
|
|
23
|
+
levels: { strict: warning, normal: info, relaxed: info }
|
|
24
|
+
|
|
25
|
+
use_for: [business, technical, blog, legal, docs, academic, literature, speech]
|
|
26
|
+
|
|
27
|
+
group: consistency
|
|
28
|
+
summary:
|
|
29
|
+
ja: 「30万円」と「250,000円」のように、同じ桁の金額を「万」と数字だけの二通りで書いている所
|
|
30
|
+
en: Amounts of one order of magnitude written both with and without a word of scale, such as "$1.5 million" and "$2,500,000"
|
|
31
|
+
example:
|
|
32
|
+
ja:
|
|
33
|
+
before: |
|
|
34
|
+
お見積もりの総額は55万円です。内訳は、設計費30万円、制作費250,000円です。
|
|
35
|
+
after: |
|
|
36
|
+
お見積もりの総額は55万円です。内訳は、設計費30万円、制作費25万円です。
|
|
37
|
+
en:
|
|
38
|
+
before: |
|
|
39
|
+
The total is $4 million: $1.5 million for design and $2,500,000 for building.
|
|
40
|
+
after: |
|
|
41
|
+
The total is $4 million: $1.5 million for design and $2.5 million for building.
|
|
42
|
+
|
|
43
|
+
not_flagged:
|
|
44
|
+
ja: 桁の違う金額(「480円」と「30万円」)は比べません。小さな金額は数字で、大きな金額は「万」で書くのはふつうの書き方です。端数のある金額(「1,234,567円」)は「万」で書けないので比べません。通貨ごとに比べ、コードの中は読みません。
|
|
45
|
+
en: Amounts of different sizes ("$480" and "$3 million") are not compared; digits for small amounts and "million" for large ones is a normal way of writing. A precise amount ("$1,234,567") cannot be written with "million" and is not compared. Each currency is compared with itself, and code is not read.
|
|
46
|
+
level_meaning:
|
|
47
|
+
ja: 同じ桁の金額を二通りに書いたとき、少ないほうを指摘
|
|
48
|
+
en: reported when amounts of one size are written two ways, at the less common way
|
|
49
|
+
|
|
50
|
+
rewrite:
|
|
51
|
+
ja:
|
|
52
|
+
direction: 同じ桁の金額を、文書で多いほうの書き方にそろえてください。金額そのものは変えません。
|
|
53
|
+
pairs:
|
|
54
|
+
- before: 設計費30万円、制作費250,000円
|
|
55
|
+
after: 設計費30万円、制作費25万円
|
|
56
|
+
- before: 上限は5,000,000円とする。前項の上限額500万円には
|
|
57
|
+
after: 上限は5,000,000円とする。前項の上限額5,000,000円には
|
|
58
|
+
keep:
|
|
59
|
+
- 金額
|
|
60
|
+
- どの通貨か
|
|
61
|
+
avoid:
|
|
62
|
+
- 桁の違う金額まで同じ書き方にそろえる
|
|
63
|
+
en:
|
|
64
|
+
direction: Write amounts of the same size the way the document mostly does. Keep the amounts as they are.
|
|
65
|
+
pairs:
|
|
66
|
+
- before: $1.5 million for design and $2,500,000 for building
|
|
67
|
+
after: $1.5 million for design and $2.5 million for building
|
|
68
|
+
- before: The cap is $5,000,000. The cap of $5 million includes legal fees.
|
|
69
|
+
after: The cap is $5,000,000. The cap of $5,000,000 includes legal fees.
|
|
70
|
+
keep:
|
|
71
|
+
- the amounts
|
|
72
|
+
- which currency each amount is in
|
|
73
|
+
avoid:
|
|
74
|
+
- rewriting amounts of a different size to match
|
|
@@ -3,6 +3,7 @@ layer: L3
|
|
|
3
3
|
status: stable
|
|
4
4
|
how_to_find: change-rate
|
|
5
5
|
requires: [structure]
|
|
6
|
+
uses: [pos]
|
|
6
7
|
severity: warning
|
|
7
8
|
|
|
8
9
|
name:
|
|
@@ -36,9 +37,9 @@ example:
|
|
|
36
37
|
before: 利用企業は1,300社となり、前年の1,000社から20%増えました。
|
|
37
38
|
after: 利用企業は1,300社となり、前年の1,000社から30%増えました。
|
|
38
39
|
en:
|
|
39
|
-
before: 1
|
|
40
|
-
after: 1
|
|
40
|
+
before: Revenue was $1.0 million in 2025 and $1.5 million in 2026, up 20%.
|
|
41
|
+
after: Revenue was $1.0 million in 2025 and $1.5 million in 2026, up 50%.
|
|
41
42
|
|
|
42
43
|
not_flagged:
|
|
43
|
-
ja: 向きの語の付いた率が二つある文、もとの値が「から」「に比べて」や年で名指されていない文、二つの値と率のあいだで主語が変わる文(「…に増え、利益は20
|
|
44
|
-
en: 'A sentence with two rates that each have a word of direction, with no value marked as the earlier one (by a word or a year), with another subject between the values and the rate ("…, and costs rose 20%"), with no single current value in the same unit, or with no word of direction beside the rate is not compared. A change given with one value ("up 20% year on year"), percentage points and "times" are not read. A rate the rounding of the values can reach is not reported.'
|
|
44
|
+
ja: 向きの語の付いた率が二つある文、もとの値が「から」「に比べて」や年で名指されていない文、二つの値と率のあいだで主語が変わる文(「…に増え、利益は20%増えた」)、二つの値のあいだで主語が変わる文("$1,000 in 2025 and costs were $1,500 in 2026")、同じ単位の今の値が一つでない文、向きの語が率のそばに無い文は比べません。「前年比20%増」のように値が一つしか無いもの、ポイントの差、倍は見ません。丸めで届く範囲の率は言いません。
|
|
45
|
+
en: 'A sentence with two rates that each have a word of direction, with no value marked as the earlier one (by a word or a year), with another subject between the values and the rate ("…, and costs rose 20%") or between the two values ("$1,000 in 2025 and costs were $1,500 in 2026"), with no single current value in the same unit, or with no word of direction beside the rate is not compared. A change given with one value ("up 20% year on year"), percentage points and "times" are not read. A rate the rounding of the values can reach is not reported.'
|
|
@@ -10,8 +10,8 @@ name:
|
|
|
10
10
|
en: A count of years that does not match its starting year
|
|
11
11
|
|
|
12
12
|
why:
|
|
13
|
-
ja: 「2015年創業」と書いた文書の「創業5年」や、「1980年生まれ(30歳)」は、どちらかが古いままです。去年の文書を写して日付だけ直したときによく起きます。文書の日付(日付だけの段落や「更新日:」の段落)の年から起点の年を引き、書いた年数と比べます。誕生日の前後や「10
|
|
14
|
-
en: 'A document that says "founded in 2015" and "5 years since its founding", or "born in 1980 (aged 30)", has kept one figure from an older version. It happens when last year''s document is copied and only the date is changed. The starting year is taken from the document''s own date (a paragraph holding only a date, or "Updated:") and compared with the count of years. A difference of one year is not pointed out, because of birthdays and of counting the tenth year as 10.'
|
|
13
|
+
ja: 「2015年創業」と書いた文書の「創業5年」や、「1980年生まれ(30歳)」は、どちらかが古いままです。去年の文書を写して日付だけ直したときによく起きます。文書の日付(日付だけの段落や「更新日:」の段落)の年から起点の年を引き、書いた年数と比べます。誕生日の前後や「10年目」の数え方があるので、一年までの違いは指しません。英語の文書で語で書いた年数(ten years since its founding)も読みます。
|
|
14
|
+
en: 'A document that says "founded in 2015" and "5 years since its founding", or "born in 1980 (aged 30)", has kept one figure from an older version. It happens when last year''s document is copied and only the date is changed. The starting year is taken from the document''s own date (a paragraph holding only a date, or "Updated:") and compared with the count of years. A difference of one year is not pointed out, because of birthdays and of counting the tenth year as 10. A count written as a word ("ten years since its founding") is read as well.'
|
|
15
15
|
|
|
16
16
|
message:
|
|
17
17
|
ja: "{origin}から{reference}年までは{expected}年ですが、「{written}」と書かれています"
|
package/rules/name-variant.yaml
CHANGED
|
@@ -24,6 +24,9 @@ messages:
|
|
|
24
24
|
reading:
|
|
25
25
|
ja: 「{name}」は、ほかの所では同じ読みの「{usual}」と書いています
|
|
26
26
|
en: '"{name}" is written "{usual}", read the same, elsewhere in the document'
|
|
27
|
+
character:
|
|
28
|
+
ja: 「{name}」は、ほかの所では字体の違う同じ字で「{usual}」と書いています
|
|
29
|
+
en: '"{name}" is written "{usual}", with another form of the same character, elsewhere in the document'
|
|
27
30
|
near:
|
|
28
31
|
ja: 「{name}」は、ほかの所で何度も書いた「{usual}」と一字違いです
|
|
29
32
|
en: '"{name}" is one letter away from "{usual}", which the document uses more than once'
|
|
@@ -61,8 +64,8 @@ example:
|
|
|
61
64
|
The code lives on GitHub. Reviews happen on GitHub, and releases are tagged on GitHub.
|
|
62
65
|
|
|
63
66
|
not_flagged:
|
|
64
|
-
ja: 品詞解析が固有名詞と読んだ語だけを見ます。大文字だけの名前(ACME INC、NASA)は見ません。一字違いの英字の名前は、6 字以上で、多いほうが二度以上、少ないほうが一度だけのときに限ります(Iran と Iraq
|
|
65
|
-
en: Only words the tagger reads as proper nouns are checked. Names in capitals only (ACME INC, NASA) are left out. Names one letter apart are reported only when six letters or longer, with the usual form used at least twice and the other once (Iran and Iraq are different names).
|
|
67
|
+
ja: 品詞解析が固有名詞と読んだ語だけを見ます。大文字だけの名前(ACME INC、NASA)は見ません。一字違いの英字の名前は、6 字以上で、多いほうが二度以上、少ないほうが一度だけのときに限ります(Iran と Iraq は別の名前)。人の名前どうしは、字体の違う同じ字(斎藤 と 斉藤、渡辺 と 渡邊)か、読みが同じで一字だけ違い、多いほうが二度以上、少ないほうが一度だけのとき(松本 と 松元)に限ります(伊藤 と 伊東 は別の人のことがある)。人の名前とは、品詞解析が人名と読んだ語か、「様」「さん」「氏」の付いた名前です(解析器が名前と読めない字体の字を含む名前は、敬称の前の 2〜4 字の漢字を名前と読みます)。
|
|
68
|
+
en: Only words the tagger reads as proper nouns are checked. Names in capitals only (ACME INC, NASA) are left out. Names one letter apart are reported only when six letters or longer, with the usual form used at least twice and the other once (Iran and Iraq are different names). Two Japanese person names are compared only when written with another form of the same character (斎藤 and 斉藤), or read the same with one character different, the usual form used at least twice and the other once (松本 and 松元); 伊藤 and 伊東 can be two people. A person's name is one the tagger reads as such, or one followed by 様, さん or 氏 (when a name holds a character form the tagger cannot read, the two to four kanji before the honorific are taken as the name).
|
|
66
69
|
rewrite:
|
|
67
70
|
depth: light
|
|
68
71
|
ja:
|