本文へ移動

Hikidashi引き出し

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

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

目次

困ったとき・よくある質問

困ったとき・よくある質問

関数がnullを返した理由、単語が見つからない理由、そして最初につまずきやすい設定の問題。

Hikidashiについての質問のほとんどは、nullや空のリストについてです。どの関数も、答えられないときにだけそれを返し、リファレンスの各ページには、それがどんなときかが正確に書いてあります。このページでは、最初によく出る場合をまとめています。

元号の年がnullになるのはなぜ?

parseEraYearは、その元号にあった年を表していない文字列にはnullを返します。

  • **元号がすでに終わっている。**昭和は64年まで、平成は31年まで、大正は15年まで、明治は45年までです。平成32年はnullで、その年は令和2年です。
  • **明治より前の元号。**分かるのは近代の五つの元号だけで、慶応4年はnullです。
  • **ほかのものが入っている。**月や日(令和6年5月1日)、前後の言葉(生年:昭和60年)、余分な文字があるとnullになります。先に年の部分だけを取り出すか、YYYY-MM-DD形式の日付ならeraOnDateを使ってください。
  • **今の元号で99年を超えている。**令和100年は打ち間違いとみなします。
import { parseEraYear } from "@johnmorrisdotca/hikidashi/wareki";

for (const text of ["平成32年", "慶応4年", "令和6年5月1日", "令和6年", "Shōwa 64"]) console.log(text, parseEraYear(text)?.westernYear ?? null);
平成32年 null
慶応4年 null
令和6年5月1日 null
令和6年 2024
Shōwa 64 1989

1989年に元号の年が二つあるのはなぜ?

実際に二つあったからです。1月7日までは昭和64年、1月8日からは平成元年でした。eraYearsOfは新しいほうを先にして両方を返し、eraYearOfは新しいほうを選びます。日付が分かるなら、eraOnDateが正しいほうを返します。1912年、1926年、2019年も同じです。

Dateの元号がずれるのはなぜ?

eraOnDateはDateを、それ自身のタイムゾーン、つまり実行しているマシンのタイムゾーンで表した日付として読みます。東京の午前0時に作ったDateは、UTCのサーバーでは前の日になります。タイムゾーンが問題になるときは、日付をYYYY-MM-DDの文字列で渡してください。

数がnullになるのはなぜ?

parseJapaneseNumberは、正確に読めないものはすべて受け付けません。

  • 全角のカンマ。 「12,000」はnullです。読めるのは半角の三桁区切り(12,000)と、区切りのない全角数字(12000)です。入力に「,」が入るなら、先に「,」に置き換えてください。
  • **並んだ漢数字。**年を「二〇二四」のように一桁ずつ書くことがありますが、今は受け付けません。漢数字は単位といっしょのとき(二千二十四)だけ読み、「〇」は位としてだけ読みます(「二〇」は20)。一桁ずつ書いた数を読み取れるようにすることは、READMEのロードマップに入っています。それまでは数字を使うか、元号の年ならparseEraYearを使ってください。
  • 単位だけ、または順序が逆の単位。 「万」だけ、「万億」など。
  • 符号、小数点、9,007,199,254,740,991を超える数。
import { parseJapaneseNumber } from "@johnmorrisdotca/hikidashi/numerals";

for (const text of ["12,000", "12,000", "二〇二四", "二〇", "万", "1.5"]) console.log(text, parseJapaneseNumber(text));
12,000 null
12,000 12000
二〇二四 null
二〇 20
万 null
1.5 null

dictionaryFormsが実在しない語を返すのはなぜ?

辞書を使わずに、書かれた語のもとになりうる辞書形をすべて挙げるので、候補の中には実在しない語もあります。「食べる」からは、「食べる」自身と並んで「食ぶ」(五段)が出ます。手元の辞書にその種類の語として載っている候補だけを、wordClassesOfを使って残してください。貼り付けた文から取り出すやり方で、一通りの手順を説明しています。

extractFromTextで単語が見つからないのはなぜ?

  • **knownを渡していない。**辞書がなければ、漢字しか見つかりません。
  • 単語はknownにあるが、辞書形ではない。 knownには辞書と同じ形で載せます。「行きます」ではなく「行く」です。
  • knownの動詞に種類がない。 ["行く", []]は書かれたままの「行く」には一致しますが、「行きます」には一致しません。活用した形が一致するのは、辞書がその種類の動詞だとしている語だけです。種類はwordClassesOfで入れてください。
  • 単語が8文字より長い。 EXTRACT_LIMITS.wordLengthです。

「行く」ではなく「行き」が返るのはなぜ?

後ろに、それを動詞にするものがないからです。「東京行きの電車」の「行き」は名詞で、「行きます」の「行き」は動詞です。辞書に載っていれば、書かれたままの語を残します。ただし、動詞の語幹にしか付かない語尾(「ます」「たい」など)が続くときは別です。

TypeScriptが "@johnmorrisdotca/hikidashi/wareki"を見つけられない

エントリーポイントはpackage.jsonのexportsで宣言していて、TypeScriptがこれを読むのは"moduleResolution"が"bundler"、"node16"、"nodenext"のどれかのときだけです。古い"node"(node10とも呼びます)では読みません。tsconfig.jsonで三つのうちのどれかを指定してください。

require()が失敗する

このパッケージはESモジュールです。Node 22.12以降ならrequireで読み込めます。それより古いNode 22ではimport(CommonJSならawait import(…))を使ってください。Node 20以前には対応していません。

DenoやBunで動く?

言語の機能しか使っていないので、おそらく動きますが、どちらもテストしていません。試した結果の報告はissueでお待ちしています。

デモやこのドキュメントの日本語は確認されている?

まだ日本語を母語とする方には確認してもらっていません。このドキュメントの日本語は、公開する前に意味と自然さを確かめていますが、日本語のページにはどれも、まだ母語話者の確認を受けていないことを書いています。間違った文や不自然な文は、「翻訳の修正」のissueテンプレートで知らせてください。

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

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