困ったとき・よくある質問
困ったとき・よくある質問
関数が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 19891989年に元号の年が二つあるのはなぜ?
実際に二つあったからです。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 nulldictionaryFormsが実在しない語を返すのはなぜ?
辞書を使わずに、書かれた語のもとになりうる辞書形をすべて挙げるので、候補の中には実在しない語もあります。「食べる」からは、「食べる」自身と並んで「食ぶ」(五段)が出ます。手元の辞書にその種類の語として載っている候補だけを、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テンプレートで知らせてください。
この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。