本文へ移動

Hikidashi引き出し

和暦と漢数字の相互変換、活用した語の辞書形、漢字への読みの割り当て、貼り付けた文からの単語の抽出、文の難しさ。日本語のテキストを扱う小さな道具を集めた引き出しです。

「引き出し」という名前は、道具が一つずつしまってあり、必要なときに取り出して使える、という意味です。 名前について(英語)

目次

解説

それぞれの引き出しの仕組み

それぞれの引き出しが答えを出すときの決まりと、答えない場合。

このページでは、それぞれの引き出しが入力をどう扱い、なぜその答えになるのかを説明します。以前はREADMEの引き出しの節にあった「仕組み」の部分で、READMEには要約と例が残っています。答えない場合(nullや空のリスト)もすべての答えの一部なので、各節の最後に書いてあります。

元号の年

引き出しは/wareki(和暦)です。

元号読み最初の日最後の日年
明治Meijiめいじ1868-10-231912-07-291〜45
大正Taishoたいしょう1912-07-301926-12-241〜15
昭和Showaしょうわ1926-12-251989-01-071〜64
平成Heiseiへいせい1989-01-082019-04-301〜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などの漢字の表にあります。このパッケージには含まれていません。

ソースを見るGitHub で編集@johnmorrisdotca/hikidashi 1.1.0 のソースから作成しました。

この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。