日本語学習問題のコード解決


私は私のスキルを磨く間も私は言語の学習に関与するように.私は英語を学びました、そして、私の母国語はポルトガル語です、そして、現在、私は日本の文化の私の愛のために日本語を学んでいます.昨日、私は、それがNodeJSを使っている私の学習を妨げることであったかなり退屈な仕事を自動化するという考えを持っていました.始めから始めましょう.

背景
私は既に日本語を学んでいますが、それは長い旅をしてきたし、まだ流暢さから遠く離れていますが、私は比較的簡単に本を読むことができます.今週、私は新しい本を始めて、もう一つの機会を与えることに決めましたAnki , 非常に強力なフラッシュカードのアプリケーションは非常に日本語学習者の間で有名ですが、それは事実上何かを学ぶために使用することができます.私はすでに同じ方法の前に使用しました:私は辞書を開いて本を読んで、私は私が追加することを知らないすべての単語.その後、アンキに追加し、その後、暗記プロセスを開始するtxtファイル.しかし、以前はアンキを使うのをやめてしまったのかもしれない.その中に入りましょう.

問題
Ankiのインポート機能をどこにすることができます.このようにセミコロンで区切られたフラッシュカードの両側を宣言するtxtファイル
傍ら;side, edge, beside, besides, nearby, while (doing)
飢える;to starve, to thirst, to be hungry
へたり込む;to sit down hard, to sink down to the floor
払い除ける;to ward off, to brush away, to fling off, to drive away
しかし、あなたはどうにかこのファイルをしなければなりません、そして、最初に、私は手動でこれをしました.私は知っていなかったすべての単語の注意を、私はあまりにも多くを一度に学ぶことがないように1日50の後、私は辞書に行き、フラッシュカードの反対側に意味をコピーした.また、日本語では平仮名、片仮名、漢字の3種類がある.簡単に言えば、漢字は、例えば、アイデアを表します.愛 ひらがなとカタカナは音を表す一方、どのように漢字を読む必要が記述するために使用されている間、愛を意味します.使用愛 例として、ひらがなの読みはあい, 私たちのアルファベットのどれがai . より詳細な説明についてはWikipedia , それがどのように働くかの非常に良い概要を持っているところ.したがって、漢字の単語がどのように読まれているかを覚えておくことも重要ですので、以下のような別のファイルを作成しなければなりません.
傍ら;かたわら
飢える;うえる
へたり込む;へたりこむ
払い除ける;はらいのける
問題は、このマニュアルタスクは非常に退屈で時間がかかることです.私はすべての単語をコピーし、辞書を見て、意味をコピーして読んで、アンキにインポート後.辞書はデジタルですので、CTL + C + CRTL + Vの問題でしたが、まだ50分の準備ができて30分かそこらでした.また、私は意味を読んで混乱することができますので、エラーが発生しやすい、間違ったファイルを入れたり、単語の意味を間違った行にそれを置くミックス.私はこの経験を改善するために何かをしなければならなかったし、再び読書を楽しくするので、私はそれを行うためのスクリプトを行うためのアイデアを思いついた.

解決策
それは比較的簡単なスクリプトだったので、私は今すぐ学習しているNODEJSの練習にこの機会を取ることにした.しかし、それはアプリケーションをフィードする辞書を持っている必要があるので、それは一見として簡単ではありません.幸いにも、私はDramodb表に座っている辞書を持っていました.うまくいけば、近い将来、私はこの他のプロジェクトについても話すことができます.しかし、今のところ、スクリプトは、このようにパラメータとして与えられた用語に従って見つけられた単語を返すAPIへのアクセスを持っていると仮定します.example.com?term=愛 .
この主な問題を解決するには、APIを呼び出して応答を解析してファイルを書くことが問題でした.スクリプト全体はたった3つのライブラリを使って作られました.

  • Axios : APIを呼び出すHTTPクライアントライブラリ.私は過去にそれと非常に良い経験を持っていたので、それは私が連絡していた他のよりもはるかに簡単です.

  • FS :標準ライブラリのファイルをI/Oに対応する.

  • 進捗状況:作業が進行中のバーを持つことによって行われているときにそれ以上の応答を確認します.
  • まず、入力ファイルの内容を格納する変数を宣言し、それぞれの単語を1行のファイルに分割し、それらを分割し、後で使用する配列に格納します.結果を格納する変数も宣言されます.
    let input = fs.readFileSync('input.txt', {encoding: 'utf8'});
    let terms = input.split('\r\n');
    let outputReading = "";
    let outputMeaning = "";
    
    それから、私が使用するAxiosインスタンスを作成し、それからAPIを呼び出し、私が望む単語を得るために使用する関数を作成しました.
    var instance = axios.create({
        baseURL: "https://api.example.com",
        headers: {'x-api-key': "xxxxxxxxxx"}
    });
    
    async function getWord(term){
        const response = await instance.get("/dictionary", {params: {term: term}});
        return response.data.body[0];
    }
    
    関数ではAPIを呼び出し、レスポンスの本文を返します.レスポンスは検索の結果を含む配列です.スキーマの簡単な説明は次のとおりです.
    {
        "statusCode": 200,
        "body": [
            {
                "Id": 1,
                "kanji": [],
                "kana": [],
                "sense": [
                    {
                        "gloss":[]
                    }
                ]
            }
        ]
    }
    
    応答は、全体の単語を詳述しているより多くの要素を持っています、しかし、私が解決しようとしていた問題が重要であることは、以下でした
  • 仮名:単語のすべての読みを持つ配列.単語は1つ以上の読書をすることができます、しかし、配列の最初のものは最も人気があって、一般に私が探しているものです.
  • 意味:意味とその情報を持つ配列:言葉、方言、関連語、反意語の一部.単語は異なる意味を持つことができますが、1つの意味は、それらの間の類義語である多くの単語を持つことができます.
  • 光沢:同義語は、配列でここに格納されます.
  • 配列に格納されているすべてのオブジェクトはtext 我々が興味を持っている情報が格納されるフィールド.我々の前の例に単語で行く愛 これは、レスポンスがまとまったように見えます.
    {
        "statusCode": 200,
        "body": [{
            "kanji": [{
                "common": 1,
                "text": "愛",
                "tags": []
            }],
            "kana": [{
                "appliesToKanji": ["*"],
                "text": "あい",
                "common": 1,
                "tags": []
            }],
            "Id": 1150410,
            "sense": [{
                "gloss": [{
                    "lang": "eng",
                    "text": "love"
                }, {
                    "lang": "eng",
                    "text": "affection"
                }, {
                    "lang": "eng",
                    "text": "care"
                }]
            }, {
                "gloss": [{
                    "lang": "eng",
                    "text": "attachment"
                }, {
                    "lang": "eng",
                    "text": "craving"
                }, {
                    "lang": "eng",
                    "text": "desire"
                }]
            }]
        }]
    }
    
    応答を得て、それを処理して、結果を私が欲しい形式で得るために、私は意味と測定値を扱う2つの機能をつくりました.下に我々はhandleMeanings 例としての機能
    function handleMeanings(term, word){
        let meaningsArray = []
    
        for(sindex in word.sense){
            let glosses = word.sense[sindex].gloss;
            for(gindex in glosses){
                meaningsArray.push(glosses[gindex].text);
            }
        }
    
        let joinMeanings = meaningsArray.join(", ");
    
        let result = term + ";" + joinMeanings + "\r\n";
        return result;
    }
    
    ごとにsense 私はそのglossesリストを通して繰り返して、配列にプッシュします、そして、私はすべてに加わります.

    結論
    タイトルと「怖い」イメージを見て、それがはるかに複雑であると思った人々のために、申し訳ありません.それは非常にシンプルであっても、クライマックスですが、それは本当に私の研究に追いつくのを助けることです.今、問題はすべてのレビューを行うことです、私は最善を尽くします!ディー
    あなたが何かがよりよくコード化されることができると思うならば、知らせてください.Nodejsはまだ私に新しいです!