word2vec, fasttextの差と実践的な使い方
word2vec, fasttextの差と実践的な使い方
目次
- Fasttextとword2vecの差を調査する
- 実際にあそんでみよう
- Fasttext, word2vecで行っているディープラーニングでの応用例
- 具体的な応用例として、単語のバズ検知を設計して、正しく動くことを確認したので、紹介する
- Appendix
(発表用の資料も掲載いたします,小さくて見づらいので、直リンはこちら)
原理の表面的な説明
- Skip gramではある特定の単語の前後の単語の出現確率を測定することでベクトル化する
- Word2vecとfasttextではこれを実装したもの
- ただし、fasttextにはsubwordという仕組みが入っている
あそんでみよう
2017年2~3月のTwitterのデータ3GByteを学習させたデータがあるので、遊んでみよう
学習、予想用のプログラムをgithubに、学習済みのmodelをpython3のpickle形式でdropboxにおいてある
ファイルが置いてあるDropboxのリンク
github.com
プロジェクトはこちら
Word2vecで遊ぶ方法
ただの言葉の相関の他、言語の足し算引き算した結果、何の単語に近くなるか計算できます。
fasttextで遊ぶ方法
ただの言葉の相関の他、言語の足し算引き算した結果、何の単語に近くなるか計算できます。
fasttextとword2vecとの違い
- fasttextはsubword分割という単語の中の一部が近いと近くなる特性がある
- Word2Vecで“艦これ”の関連度を計算すると、同じような文脈で用いられる、他のゲームタイトルが多く混じってしまう
- これはメリットなのか、デメリットなのか、使用用途でわかれそう
単語の演算の違い
- Word2Vecの特徴として、単語の演算が謎理論(理論的な裏付けが無いように見える)で演算できる
- fasttextもベクトル表現なので、足し算・引き算が可能なので比較する
- fasttextとw2vで結果が異なる
fasttext, word2vecの実践的な使い方
- CNN, RNNなどのディープラーニングの素性とする
- 例えば、100万語で、10単語の文章の判別問題の際、one-hotを利用すると、壊滅的なテンソルサイズになりGPUに乗らない
- そこで意味関係を内包しているという仮説がある、fasttext, w2vを使うことで、256次元程度にシュリンクできる
RNN(or CNN)の出力をfasttext, word2vecの出力に近似して使う場合
- Deep Learningの出力、特にRNNのテキスト生成系のモデルにおいて、出力次元が爆発してしまう問題に対応するため、出力
- 出力をLinear + mean square errorとすることで、直接ベクトルを当てに行くことができる(復元するにはconsine類似度などで逆引きする必要がある)
応用例:言葉の進化(バズ)を観測する
- 言葉はバズると使用法が変化する
- 今までの主流は単語の出現頻度の変化の観測
- 単語の使われ方の変化を観測する
- 2次元にエンベットされていると仮定すると、図のようになる
- さらに時間系列でベクトルを表現すると下図のようになる
- 技術的な課題点の解決
- 問題点:エンベッティングの際、初期値依存性があり、ベクトルが回転したり、端によったりすると歪んだりする。
- 解決策:絶対座標に変換するため、基準となる単語を選択(16000単語前後)
- 解決策:基準となる単語郡からのコサイン類似度の変化量を各観測したい単語ごとに作成
- 解決策:このベクトルをZとする
- Z(プ)ベクトル(長いので略す)をデイリーで作成していき、n日のZ(プ)ベクトルをZ(プ,n)ベクトルとする
- Z(プ,n)ベクトルとZ(プ,n-1)ベクトルとのユークリッド距離を計算する
- これを日にちのタイムシリーズでグラフを描画すると下図のようになる
Tweet取得・分析のシステム構成
Appendix.1. 対応関係を学ぶ
- 図を見ると企業と企業の代表者の関係をみると、一定の法則があることがわかる
- この性質(Distributional inclusion hypothesis)を利用して、logistic-regressionなどで、関係を学習することが可能である
Appedix.2. 未知の言語を翻訳する
- 出現する単語の並びの関連に相関があるので、言語が異なっても似たような分布になる
emotion2vec
emotion2vec
テキスト感情ベクタライザの提案 〜 doc2vec, fasttext, skipthoughtに続く第四のテキストベクタライザ 〜
(ジョーク投稿です。正確なリプレゼンテーションかどうか、十分な検証をする必要があります)
感情は難しい
コミュ症の人が何らか相手の感情を察しようとした場合、既存の知識や経験に基づいて相手が何を意図しているのか、把握することが難しいという悲しい事実があります。
ディープラーニングってやつでなんとかして!案件ですね。
リプレゼンテーション(表象)の選択
最も端的に感情を示している素性は何でしょうか。映像ではその人の行動であったり、表情であったりします。
テキストの世界では、最近の若い人たちは、絵文字というものを使うことがあります。絵文字はその文脈では伝えきれてない感情を絵文字の表現力を借りて表現する場合で有効であります。
例) 💢 -> ムカつく ❤ -> 好き好き ♪ -> 気分が上昇している
なるほど。漫画はよく読むのでよくわかりますね。なんで漢字の書き取りがあって、絵文字の書き取りは小学校ではやらないんですかね。
テキストにおいては、絵文字がそのテキストの秘められたリプレテーション(表象)になっているように仮説が立てられそうです。
手法
Word Level CNNを用いて、テキストをベクトル化します。ベクトル次元数は2014次元で大きいです。
Twitterのフリープランで400万ツイートものツイートを頑張って集めました。これを分かち書きして、fasttextで分散表現に置き直します。
分散表現で記された文章をCNNにかけて、そのツイートに内在されていたはずの絵文字を予想するタスクを与えます。複数の絵文字がある場合、複数予想させます。
結果として、感情を示すベクトルが獲得できるようになります。
(epochは前回CNNでのテキスト認識で用いたoverfitにならない25epochを適応) optimizer:adam window size:1,2,3,4,5 input-vector:256dim * 30dim output-vector:2048dim その他諸々はコードを参照ください
コード
(商用利用する際には一声くださると助かります)
github.com
結果
今回のemotion2vecは極端な不均衡データでありました。そもそも感情は自然に分布しないと思うので、それはいいのですが、特定の♪などの絵文字リプレゼンテーションになりがちになりました。
(テキストは小説家になろうの「蜘蛛ですが何か」からお借りしました)
text.ないわー。 😭 8 ♡ 7 😂 5 💢 4 😳 3 ♪ 2 💓 2 🙄 2 💗 2 ✋ 2 😑 2 ❤ 2 ✨ 2 😊 2 👍 1 😢 1 💕 1 ❗ 1 😇 1 💩 1 (悲しくて起こっている感情のベクタ)
text.これで私は自由だー! ♡ 7 ✨ 6 ♪ 5 💕 5 😭 4 😂 4 😊 4 💓 3 👍 3 💗 3 🏻 2 😆 2 😍 2 ☆ 2 🙌 2 😳 1 🙏 1 ❤ 1 ☺ 1 😌 1 (自由の感情のベクタ)
text.《熟練度が一定に達しました。スキル『蜘蛛糸LV3』が『蜘蛛糸LV4』になりました》 ★ 94 ☆ 58 ♪ 43 (なんか事務口調のテキストには星がいっぱいつきます)
text.あ、でも蜘蛛猛毒だと大抵の相手は即死しちゃうな。 😱 8 💢 8 😭 7 😨 7 😡 6 💥 6 😇 5 ♡ 5 💦 5 😂 4 😅 4 🏻 4 🙏 4 ♂ 3 (ムンクっぽい何か)
text.マジかー。 😭 16 😂 6 😇 3 😳 3 😍 2 😢 2 😱 2 💕 2 ♡ 2 🙄 1 💗 1 💓 1 💢 1 ✨ 1 🙏 1 💦 1 🙈 1 😌 1 😅 1 (マジかー)
text.「クソッ!?」 ♡ 17 💢 10 💩 9 ♪ 2 ❤ 1 ☆ 1 ♥ 1 ☺ 1 (うんちのお気持ち)
text. うるせぇ、てめえ、ぶっ殺すぞ
💢 99
(わかる)
text. あのあの、エッチなのはダメなのです ♡ 25 ♪ 7 💕 3 💦 3 😭 3 ☆ 2 ♥ 2 😂 2 😢 2 😊 1 ❤ 1 😅 1 😇 1 😑 1 😌 1 (ちゃんとハートと汗があるよ、電ちゃんっぽい発言を意図しました)
考察
Word LevelじゃなくてChar Levelのほうがよかった気がする。
強い感情に引っ張られて大きなウェイトがつくので、感情の起伏を定量的に記すのもいいかもしれない
まとめ
じつはこれはText GAN(SeqGAN)の副産物だったりします。SeqGANにはとにかく前処理が山ほどあって、なんとなく学習までのイメージがあるのですが、遠いです💦
RNNで「てにをは」を校正する
RNNで「てにをは」を校正する
はじめに
RNNによる文章校正がリクルートによって提案されて以来、調査タスクとして私のものとに来たりして、「できるんでしょう?」とか軽く言われるけど、実際には簡単にはできません。
RNNによる文章生成ができるから、校正もできるというのが人間の自然な発想なのかもしれませんが、英語と日本語の違いに着目した場合、英語がアルファベットのみで構築されるのに比べて日本語は、漢字・ひらがな・カタカナと非常に多く、同じように問題を適応すると、すごい高次元の問題を解くこととなり、理想的なパフォーマンスになかなかなりません。
まぁ、あんまり完成してるわけでない技術を完成したようにプレスリリースを出す企業様の印象操作もあり、正直どうかと思うんですけどね...まぁそれはいいです。
さて、リクルートは文章生成プログラムとビームサーチで「てにをは」を修正するディープラーニングがあるということですが、RNNとビームサーチで実装したとのことです[1]
いささか、どのように実装したのか不明瞭であったので、まとめ直しました。多分こういうことでしょう。
さて、問題となるのが、計算量です。幅3で一文を探索した場合でも、修正する助詞が3つあれば、9回の評価が必要になります。しかも、GRUやLSTMは状態を保存するので、モデルの状態を固定して9つ別個に走らせる必要があるので、9倍のメモリも必要になります。(実はわたしは、このアプローチはだいぶ前に試して、お蔵入りにしました)
これを別のアプローチで解決していきます。
問題
文章校正ではコンテンツを持つ企業であれば、どこでも直面する問題であるので、RNNでの文章校正に意欲を燃やす企業が多い。
このモチベーションは素人ライターや文章をあまり書いたことのない人などが、内容はおいておき、「てにをは」がおかしかったり、単語チョイスがおかしかったりすることに起因していて、直すのは人手が現在はほとんどであり、大変工数がかかるので簡易化したいという思惑があったりする。
とくにキュレーションサービスを抱えている業者は、素人の日本語が変だったりして、修正することが多い。キュレーションサイト自体は、現在では、盗用であったり、健康に害を及ぼすニセの情報の発信も問題とされている。DeNAでは大炎上して40億近くも溶かしたらしい、人の命に関わる問題で適当やらかしたら、しょうがない気もする[2]
問題のスコープを限定して、コンテンツの真偽性の検証ではなくて、「てにをは」の修正に焦点を当てる。
また、キュレーションサイトに素人文章が多いということを利用して、修正箇所が多いほうが、キュレーションサイトであるという仮説を検証する。
提案
RNNで助詞を予想させるタスクを行う。ただし、ビームサーチが必要になるのは次の文脈が確定されていなからであって、予想する文字の次の文脈を入力素性として利用する。
これは、以前教師なし文章の復元の投稿でも用いた類似したアプローチであるが、単語粒度に拡張し、fastTextを適応してベクトル化して、「てにをは」を修正する問題である。
通常、RNNを文章生成のタスクで利用するには、活性化関数にsoftmaxと損失関数categorical cross entropyを利用することが多い。しかし、鋭利すぎる出力が出ることが多いので、なだらかな出力が欲しかったので、活性化関数にsigmoid、損失関数にbinary cross entropyを用いたモデルで行う。
モデル
Keras2を使ってみました。
github.com
ネットワークのみ記す。
def build_model(maxlen=None, out_dim=None, in_dim=256): print('Build model...') model = Sequential() model.add(GRU(128*20, return_sequences=False, input_shape=(maxlen, in_dim))) model.add(BN()) model.add(Dense(out_dim)) model.add(Activation('linear')) model.add(Activation('sigmoid')) optimizer = Adam() model.compile(loss='binary_crossentropy', optimizer=optimizer) return model
コード全体はgithubを参照にしてください。
データセットを集めるプログラムは付属していないので、適宜各人、適宜、集めてください。
ubuntu用のfastTextバイナリが含まれます。Python3のみ動作検証しています。
実験
- Yahoo! Newsの記事2月1日からのデータを1000MByteの学習データセットをもちいて学習させた
- LSTMではなくGRUを用いた。2560unitも使う巨大なモデルである
- 活性化関数はsigmoid
- 損失関数はbinary cross entropy
- 入力は助詞の周辺の単語19語、出力は助詞の種類
- 単語の分散表現はFacebook社のfastTextを利用して256次元にエンベッディング
- 修正する助詞は「が,の,を,に,へ,と,で,や,の,は,も,ば,と,し,て,か,な,ぞ,わ,よ」に限定した
評価
1. 訂正能力を確認するため、実際にいくつかのキュレーションサイトで試してみることで、定性的に評価する
評価に4meeeというサイトの記事を用いた
2. キュレーションサイトと、Yahooヘッドラインの記事では訂正箇所の大小により差があることを定量的に評価する
評価を4meeeの1000文, 日経新聞の1000文を調べることで、差があるかどうか定量的に評価する
結果
1. 訂正能力を確認. 実際にいくつかのキュレーションサイトで試してみることで、定性的に評価
(4mee.comさまのサイトを参照させていただきました)
(赤い文字が修正ポイントです)
間違いを指摘する例 1.
...いい,の,だろ,う,か,?,」,と,悩む,こと,も,ある,かも,しれ,ませ,ん,ね,。,アラサー女子,が
が 0.43567371368408203 で 0.2292904108762741 は 0.12616075575351715 や 0.07486625760793686 に 0.05115458369255066 と 0.023784229531884193 も 0.014887742698192596 … 以下略
間違いを指摘する例 2.
...理由,で,、,結婚,を,考え,られ,ない,という,方,は,多い,かも,しれ,ませ,ん,。,ですが,、,それ
が 0.9836806058883667 の 0.418474942445755 も 0.1664217710494995 で 0.006275758147239685 は 0.004365661647170782 に 0.0009334951755590737 ...以下略
間違いを指摘する例 3.
...れ,て,いる,こと,は,あり,ませ,ん,。,理由,が,ない,のに,定職,に,つか,ず,に,ふらふら,し
は 0.9380507469177246 で 0.11489760875701904 が 0.07356355339288712 に 0.05326680839061737 や 0.026233579963445663 を 0.01495771761983633 ...以下略
接続詞でだいぶ、異なった出力が得られるようです。人間も意識しないとわからない部分です。
2. キュレーションサイトと、Yahooヘッドラインの記事では訂正箇所の大小により差があることを定量的に評価
これは、日本語としてちょっと標準と離れることがキュレーションサイトでは多い、つまり、権威あるニュースサイトに比べると、訂正箇所がおおいという仮説を証明する。
評価を4meeeの1000文, 日経新聞の1000文を調べることで、差があるかどうか定量的に評価する
|実測値 | 日経 | 4meee | |修正なし | 746 | 491 | |修正あり | 254 | 509 |
カイ二乗検定などを試した結果、別の分布と言えるようだ。別のものであれば、キュレーションサイトと日経のサイトを判別する機械学習モデルの素性に組み入れても良いだろう。
結論
ビームサーチを行わないモデルなので、探索が楽で高速に動作するというメリットがあり、softmax + categorial cross entropyと違って確率表現のように出力するので、しきい値等で、機械学習の結果を採用したり、却下したりすることができる。
また、日本語の「てにをは」は厄介なので、日本語の勉強をしている非ネイティブの人や、研究者の方、日本人だが簡易的な校正が必要な方などの利用ケースが考えられる。
(なにか間違いがありましたら、twitterでこっそり教えてください)
参考文献
[1] LSTMとResidual Learningでも難しい「助詞の検出」精度を改善した探索アルゴリズムとは http://www.atmarkit.co.jp/ait/articles/1611/11/news016_2.html
[2] 第三者委員会調査報告書 http://v3.eir-parts.net/EIRNavi/DocumentNavigator/ENavigatorBody.aspx?cat=tdnet&sid=1450400&code=2432
新しく買ったWindows 10でneologd等の自然言語処理環境を構築する (+ XGBoost)
新しく買ったWindows 10でneologd等の自然言語処理環境を構築する (+ XGBoost)
はじめに
自然言語処理と機械学習とSE的なことを仕事としているのですが、現在務めている会社ではWindowsの利用を強く推奨されることがあります。これは、コンプラインスの関係でセキュリティ管理者が複数のOSを管理するコストは高いからWindowsに限定することが多いという理由に起因しています。
この文章を書いている環境はUbuntu LinuxのLibreofficeを用いています。文字コードがUTF-8だと自然言語処理の観点で何かと都合がよく、MeCabなどの形態素解析エンジンもUTF-8ですし、Python3も内部の処理系がUTF-8で、GolangのRuneや、C++も文字処理粒度はUTF-8のものが増えています。
こういう関係もあって、sjisをハックするなど、あまり技術的にこったことをしたくないというモチベーションのもと、Windowsで形態素解析と、みんな大好きXGBoostを導入するまでの一連の流れを示したいと思います。
ツール属性の攻撃という言葉があって、これが案外馬鹿にできないというか、かなりの攻撃力を誇るので、できるだけ覚えるコスト下げたいという思いもあります。
(この方法は2017年3月段階での、私がいじくってなんとか動かした方法ですので、正しく理解するには公式ドキュメントも注意深く参照することをおすすめします)
計画
1. Windows 10の持ち運べるノートパソコンであるLG gramの購入と、アップグレード
2. OSをNVMeに移動する
4. mecabとneologdの導入
5. Anacondaとjupyter notebookの構築
6. XGBoostの導入
1. Windows 10の持ち運べるノートパソコンであるLG gramの購入と、アップグレード
本当はMacBook Proがほしいのだが、2017年3月、もっとも高いメモリのモデルでも16GByteまでしかなく、加えて8GByte → 16GByteに変更するのに20000円もかかる。自分で取り替えられる場合、12000円程度ですむ。
MacBookには、NVMeモデルがない。NVMeはSSDより高速な主記憶装置で、ディスクに大量にアクセスする操作が発生することが多い機械学習ではNVMeであるだけで、かなり処理時間が短縮できることがある。スワップ領域等を作成しておくと、メモリがあふれた時にもマシンが処理落ちして使い物にならなくなる時間が短縮できて大変よい。
CPUは早いほうがいいが、ノートパソコンで重い計算をさせることは私は少ないのでCore i3でいいかなって感じです。
LG gramの2017年のモデルが1キロを下回る軽さで、メモリを追加することも、NVMeに換装することもできます。96000円程度で秋葉原のツクモで10%還元で購入できました。そのポイントを利用してNVMeとDDR4の16GByteのメモリを購入しました。NVMeがsamsung 512GBのモデルで30000円程度,DDR4の16GByteで12000円程度でした。合計で、120000円程度です。
全く文脈を無視しますが、ぼくは小林銅蟲先生を尊敬していまして、料理ブログよく見てるので、あのノリ羨ましいなって思います。
OSをNVMeに移動する
これが一番めんどくさかったです。コントロールパネルからリカバリーディスクの作成を選んで、32GのUSBフラッシュメモリにOSのリカバリディスクを作成しました。
かなり早いUSBフラッシュメモリを用いたのに全く速度がでない。。。4時間ぐらいかかりました。これはMicorsoftの怠慢では。途中で寝てしまいました。
3. 日本語が処理できるようにcmdやcmderの代わりにputty, teratermやcygwind sshを利用する
Bash on WidowsというWindows上にUbuntuが動作する仕組みがあるのですが、コマンドプロンプトや、よくおすすめされるcmderというソフトは、日本語入力やファイルが壊滅的にダメで、これが原因でほんとつらい思いをしました。
よく私が使う回避策は、Bash on Windowsでssh-serverを起動して、teraterm等てアクセスする方法です。面倒ですが今のところこれが一番安定して、日本語が扱えます。
3.1 開発者モードを、コントロールパネルから有効にする
3.2 Windowsの機能の有効化または無効化 → Windows Subsystem for Linux (Beta) → チェックを入れて再起動
3.3 services.mscをコマンドプロンプトに入力 -> SSH Server Broker,SSH Server Proxyの2つのサービスを無効にする
3.3 cmdを立ち上げる → bashと入力 → Linuxのインストール
3.4 Bash on Windowsに入る → sudo apt get install openssh-serverでインストール
/etc/ssh/sshd_configを編集
$ sudo vim /etc/ssh/sshd_config 変更→ UsePrivilegeSeparation no 変更→ PasswordAuthentication yes コメントアウト → #Hostkey /etc/ssh/ssh_host_dsa/key コメントアウト → #Hostkey /etc/ssh/ssh_host_ecdsa/key コメントアウト → #Hostkey /etc/ssh/ssh_host_ed25519/key
コマンド実行(これをやらないとつながらない)
$ sudo ssh-keygen -t rsa -N '' -f ssh_host_rsa_key
sshdを起動
$ sudo /etc/init.d/ssh start
4. mecabとneologdの導入
これもUbuntuのインストール手順に従えば、問題ないです。標準のUbuntuLinuxにはデフォルト入ってないパッケージもあるので適宜入れていきます。
$ sudo apt install mecab libmecab-dev mecab-ipadic $ sudo apt install mecab-ipadic-utf8 $ sudo apt install python-mecab $ sudo apt install python3-pip $ sudo pip3 install mecab-python3 $ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git $ cd mecab-ipadic-neologd $ ./bin/install-mecab-ipadic-neologd -n
mecabのデフォルト辞書をneologdに変更する
$ sudo vim /etc/mecabrc 変更 → dicdir = /usr/lib/mecab/dic/mecab-ipadic-neologd
動作確認(FGOは標準辞書にない)
$ echo "Fate/Grand Order" | mecab
Fate/Grand Order 名詞,固有名詞,一般,*,*,*,Fate/Grand Order,フェイトグランドオーダー, フェイトグランドオーダー
EOS
5. Anacondaとjupyter notebookの構築
最初Anacondaを使わずに入れようと思ったけど、ubuntuのwheelが通じないことながあって、Anacondaでインストールするのが楽でした。
Anacondaのパッケージを取得
$ wget https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86_64.sh
インストール(sudoするとパーミッションが面倒なのでしない)
$ sh Anaconda3-4.3.1-Linux-x86_64.sh (ひらすらyesで進めていく)
私の環境ではpython3.6のバイナリがAnacondaのPythonですので、Python3.6で実行できるようになります。
$ which python3.6 /home/{yourname}/anaconda3/bin/python3.6
なお、ipythonのkernelが不安定なので、以下のパッチを当てる必要があります。
conda install -c jzuhone zeromq=4.1.dev0
jupyter notebookのパスワードを作成します
In [1]: from notebook.auth import passwd In [2]: passwd() Enter password: Verify password: Out[2]: 'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed' <-これをコピーしておきます
jupyter notebookにパスワードを設定
$ vim ~/.jupyter/jupyter_notebook_config.py
コピーした内容を貼り付け
c.NotebookApp.password = u'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed'
ついでにjupyterで形態素解析ができるようにする
$ sudo ipython -m pip install mecab-python3
これでClient側のWindowsからwebブラウザ等でjupyter notebookが利用可能です。
例でスクリーンショットを載せます。
6. XGBoostの導入
自分はlibsvm形式で直接xgboostのバイナリに放り込むことが多いのですが、やりかは何でもいいと思います。
$ git clone --recursive https://github.com/dmlc/xgboost
$ cd xgboost
$ make -j4
$ sudo ln -s /home/{yourname}/xgboost/xgboost /usr/local/bin/xgboost
サンプルのアガリクスの有効判定みたいなのをときます。
$ cd demo/binary_classification
$ python mapfeat.py
$ python mknfold.py agaricus.txt 1
$ xgboost mushroom.conf
いろいろ入れられそうですが、この辺にしておきます。
再度になりますが、自分はQiitaとか見てて結構ハマって、よくわかんないなぁとか思っていたのですが、公式ドキュメントで解決することが多かったです。私の今回の方法も、ひと月後には通用しないものになっているかもしれません。
公式ドキュメントを正しく理解することが一番の近道かもしれません。
(何か間違い等がありましたら、ツイッターでお知らせいただけると幸いです。)