解説
それぞれの引き出しの仕組み
それぞれの引き出しが答えを出すときの決まりと、答えない場合。
このページでは、それぞれの引き出しが入力をどう扱い、なぜその答えになるのかを説明します。以前はREADMEの引き出しの節にあった「仕組み」の部分で、READMEには要約と例が残っています。答えない場合(nullや空のリスト)もすべての答えの一部なので、各節の最後に書いてあります。
元号の年
引き出しは/wareki(和暦)です。
| 元号 | 読み | 最初の日 | 最後の日 | 年 |
|---|---|---|---|---|
| 明治Meiji | めいじ | 1868-10-23 | 1912-07-29 | 1〜45 |
| 大正Taisho | たいしょう | 1912-07-30 | 1926-12-24 | 1〜15 |
| 昭和Showa | しょうわ | 1926-12-25 | 1989-01-07 | 1〜64 |
| 平成Heisei | へいせい | 1989-01-08 | 2019-04-30 | 1〜31 |
| 令和Reiwa | れいわ | 2019-05-01 | 継続中 | 1〜99 |
元号は西暦の年の途中で変わるので、1912年、1926年、1989年、2019年は、それぞれ一つの元号が始まり、別の元号が終わる年です。eraYearsOfは新しい元号を先にして両方を返し、eraYearOfは新しいほうを返します。普通はそちらで書くからです。eraOnDateは、YYYY-MM-DDかDateで渡した日がどちらに入るかを答えます。
元号の年は、今の数え方と同じく、1月1日から次の年に変わり、最初の年は元年です。明治は名前が定められた1868年10月23日からとし、年は1868年から始まったものとして数えます。日付はすべてグレゴリオ暦です。
parseEraYearは、漢字の元号もローマ字の元号も読み取ります。ローマ字は綴り方(Showa、Shouwa、Shōwa)を問わず、数字は半角でも全角でもかまいません。「年」は付けても省いてもよく、「元」は1として読みます。
**答えない場合:**その元号に存在しなかった年(昭和65年)、暦にない日、明治より前、そして今の元号の99年を超える年です。99を超える年は、日付ではなく打ち間違いとみなします。
漢数字
引き出しは/numeralsです。
日本語では、数を四桁ごとに区切って万、億、兆と数えます(それぞれ前の10,000倍)。そのため120,000,000は「一億二千万」で、万を単位にすると「一万二千万」、つまり万が一万二千個です。読み取りでは、漢字、数字(半角でも全角でも)、その混ぜ書き、三桁ごとのカンマ、大字の「壱」「弐」「参」「拾」、旧字の「萬」を受け付けます。書くときは、日本語で「一」を省くところは省き(一十ではなく十)、省かないところは残します(一万)。formalを指定すると、字画を書き足して改ざんされないよう、契約書や領収書で使う字で書きます。一は壱、二は弐、三は参、十は拾です。
readJapaneseNumberは、音の変化を含めて数をひらがなで読みます。「三百」は「さんびゃく」、「六百」は「ろっぴゃく」、「八千」は「はっせん」、「一兆」は「いっちょう」です。parseEnglishNumberは英語の数の言葉と、ローマ字で書いた日本語の単位(5 man)を読みます。学習者は「5万」と打てるようになるずっと前から、こう打つからです。
**答えない場合:**順序が逆の単位(万億)、並んだ漢数字(一二三。ただし「〇」は位として読むので「二〇」は20)、単位だけの「万」、マイナス記号、小数点、そしてJavaScriptで正確に数えられなくなる9,007,199,254,740,991を超える数です。答えはnullで、一桁ずれた数を返すことはありません。
辞書形
引き出しは/deinflect(活用)です。
文では「行きます」と書かれていても、辞書には「行く」で載っています。dictionaryFormsは、書かれた形を語尾一つずつ、最大五つ分さかのぼり、それが活用した形でありうる辞書形をすべて返します。それぞれに、その語がどの種類の語でなければならないか(godan、ichidan、iAdjective、suru、kuru)が付きます。
この関数は候補を挙げるだけです。「食べる」は、実在しない動詞「食ぶ」の可能形でもあるので、呼び出す側は、手元の辞書がその種類の語だと確認したものだけを残します。そのための関数がwordClassesOfで、"godan verb"のような英語の名前も、v5kのようなJMdictのタグも読みます。答えは可能性の高い順に並びます。書かれた語尾のうち、より多くの部分を説明できる読み方が先に来ます。そのため「食べました」は、「食べます」+「した」より先に「食べる」+「ました」と読まれます。
語幹だけを動詞として読む決まりは、あえて設けていません。「東京行き」は名詞で、「行き」が動詞になるのは後ろに語尾が続くときだけです。
**対応しているもの:**丁寧形、否定形、過去形、て形、仮定形、意志形、受身形、使役形、可能形と、それらの連なり(食べさせられませんでした)、願望の「たい」(行きたい)、「する」と「来る」、かなの後にかなで書いた「来る」(持ってきた)。
**対応していないもの:**命令形、敬語の動詞、そして語尾が自分では活用しない「な形容詞」です。
読みの割り当て
引き出しは/align(読みの割り当て)です。
日本の学校のかん字テストでは、空いたマスの横に読みが書かれていて漢字を答えます。語の終わりの送り仮名は、マスの下のかっこに書きます。語に含まれるかなは読みの中の目印になり、それを手がかりに残りの読みを漢字に割り当てられます。「形が合う」を「かたちがあう」と読むなら、「形(かたち)」「が」「合(あ)」「う」に分かれます。いくつかの漢字が続く熟語(絵日記、えにっき)は一つの部分になります。辞書がなければ、読みを漢字一字ずつに分けられないからです。読みはカタカナでもかまいません。
割り当ては、漢字にできるだけ短い読みを当てるところから試し、行き止まりをすべて覚えておきます。そのため、同じかなが続き、どの読みも合わない語でも、長く探し続けることなく、すぐにnullを返します。buildKanjiTestはシード値を指定できる乱数生成器(mulberry32)で並べ替えるので、紙のテストと画面のテストが同じになります。
**答えない場合:**語に合わない読み、漢字のない語、空白や制御文字の入った読み、64文字を超える語と256文字を超える読みです。
貼り付けた文
引き出しは/extract(抽出)です。
本の1ページ、配布資料、チャットのメッセージなどを貼り付けて、そこから単語と漢字を取り出したいことがあります。「何が貼り付けられるか分からない」ことから、二つのことが決まります。
一つは安全です。文は保存せず、その長さも信用しません。EXTRACT_LIMITS.characters(20,000文字)で切り詰め、制御文字や見えない文字は空白に変え、返すのは文そのものではなく、手元の辞書が認めた単語と一文字ずつの漢字だけです。
もう一つは、文の読み取り方です。日本語の部分を見つけ、その中の単語を、渡されたknown(単語からその種類へのMap)と、長いものから順に照らし合わせます。活用した動詞や形容詞(行きます、高くて)は、knownに載っている辞書形で返します。同じ長さなら書かれたままの語が優先されるので、「東京行き」は名詞の「行き」のままです。ただし、「行きます」の「ます」のように、動詞の語幹にしか付かない語尾が続くときは別です。漢字は、単語に含まれるかどうかに関係なくすべて取り出します。々 と 〇 は漢字に数えません。
wordCandidatesは、辞書に載っていそうなすべての部分文字列と、活用して見える部分の辞書形を、4,000個まで並べます。これで、貼り付けた文全体について、データベースに一度だけ問い合わせられます。
文の難しさ
引き出しは/difficulty(難しさ)です。
文を難しくするものは二つあります。長さと、文の中でいちばん難しい字です。点数は、文の長さに、いちばん難しい漢字のコストの三倍を足したものです。そのため、かなだけの文は長さだけが点数になって先頭に来ます。また、読めない漢字は一字でも、十字あるのと同じように読み手を止めてしまいます。
kanjiCostは、漢字について手元にある情報をコストに変えます。学年1〜6の漢字はその学年の数そのまま、学年8(残りの常用漢字)は9、学年9と10(人名用漢字)は14、学年のない漢字は使用頻度の順位によって10〜18、何も分からない漢字は20(UNKNOWN_KANJI_COST)です。学年と順位はKANJIDIC2などの漢字の表にあります。このパッケージには含まれていません。
この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。