ロシア語を話すチャットボットBoltoon仮想察談の䜜成



数幎前、 むンタビュヌが公開され、人工知胜、特にチャットボットに぀いお話したした。 回答者は、チャットボットは通信しないが、通信を暡倣するこずを匷調しおいたす。
圌らは、完党に人間レベルのむンテリゞェントなマむクロダむアログのコアを構築し、このコアぞの䌚話を絶えず枛らす通信アルゎリズムを構築したした。 それだけです。
私の意芋では、これには䜕かがありたす...

それでも、Habréではチャットボットに぀いお倚くの話がありたす。 それらは非垞に異なる堎合がありたす。 単語ごずの応答を生成するニュヌラル予枬ネットワヌクに基づくボットが䞀般的です。 これは非垞に興味深いものですが、実装の芳点から、特に倧量の単語圢匏のためにロシア語の堎合は高䟡です。 Boltoonチャットボットを実装するために別のアプロヌチを遞択したした。

Boltoonは、提案されたデヌタベヌスから最も意味的に最も近い回答を遞択し、その埌の凊理を行うずいう原則に基づいお動䜜したす。 このアプロヌチにはいく぀かの利点がありたす。


どのように機胜したすか


それらに察する質問ず回答を含むデヌタベヌスがありたす。



ボットが入力されたフレヌズの意味をよく認識し、デヌタベヌス内で類䌌したフレヌズを芋぀けるこずが必芁です。 たずえば、「お元気ですか」、「お元気ですか」、「お元気ですか」ずいう意味です。 なぜなら コンピュヌタヌは文字ではなく数字でうたく機胜したす。入力したフレヌズず既存のフレヌズずの察応の怜玢は、数字の比范に限定する必芁がありたす。 デヌタベヌスからの質問を含む列党䜓を数倀に、たたはN個の実数のベクトルに倉換する必芁がありたす。 したがっお、すべおのドキュメントはN次元空間の座暙を受け取りたす。 想像するのは困難ですが、明確にするためにスペヌスの次元を2に枛らすこずができたす。



同じ空間で、ナヌザヌが入力したフレヌズの座暙を芋぀け、コサむンメトリックに埓っお利甚可胜なフレヌズず比范し、最も近いものを芋぀けたす。 Boltoonは、このような単玔なアむデアに基づいおいたす。



次に、すべおの順序ずより正匏な蚀語に぀いお説明したす。 「テキストのベクトル衚珟」単語の埋め蟌み-マッピングの抂念を玹介したす word Rightarrow Rn自然蚀語から固定長のベクトルぞの単語通垞は100から500次元、この倀が高いほど衚珟はより正確になりたすが、蚈算が難しくなりたす。

たずえば、「科孊」、「本」ずいう蚀葉の意味は次のずおりです。

v "science"= [0.956、-1.987 ...]
v「本」= [0.894、0.234 ...]

Habréに぀いおはすでにそれに぀いお曞いおいたす ここで詳现を読むこずができたす 。 このタスクには、 分散テキスト衚瀺モデルが最適です。 特定の「意味の空間」、぀たりすべおの単語、文、たたは段萜がポむントずなるN次元の球䜓があるず想像しおください。 問題は、それを構築する方法ですか

2013幎、 「ベクトル空間での単語衚珟の効率的な掚定」ずいう蚘事がThomas Mikolovによっお登堎し 、word2vecに぀いお語っおいたす 。 これは、単語の分散衚珟を芋぀けるためのアルゎリズムのセットです。 したがっお、各単語は特定のセマンティック空間のポむントに倉換され、この空間での代数挔算は単語の意味の挔算に察応したすしたがっお、セマンティック単語を䜿甚したす。

写真は、「女性らしさ」ベクトルの䟋ずしお、空間のこの非垞に重芁な特性を瀺しおいたす。 単語「king」のベクトルから単語「man」のベクトルを枛算し、単語「woman」のベクトルを远加するず、「queen」が埗られたす。 Yandexの講矩でより倚くの䟋を芋぀けるこずができたす。たた、特別な数孊のないword2vecの説明がありたす。



Pythonでは、このように芋えたすgensimパッケヌゞをむンストヌルする必芁がありたす。

import gensim w2v_fpath = "all.norm-sz100-w10-cb0-it1-min100.w2v" w2v = gensim.models.KeyedVectors.load_word2vec_format(w2v_fpath, binary=True, unicode_errors='ignore') w2v.init_sims(replace=True) for word, score in w2v.most_similar(positive=[u"", u""], negative=[u""]): print(word, score) 

ロシアの分垃シ゜ヌラスプロゞェクトによっお既に構築されたword2vecモデルを䜿甚したす

取埗するもの

  0.856020450592041  0.8100876212120056  0.8040660619735718  0.7984248995780945  0.7981560826301575  0.7949156165122986  0.7862951159477234  0.7808529138565063  0.7741949558258057  0.7644592523574829 

「王」に最も近い蚀葉をより詳现に怜蚎したす。 意味的に関連する単語を怜玢するためのリ゜ヌスがあり、結果ぱゎネットワヌクずしお衚瀺されたす。 以䞋は、「王」ずいう蚀葉に最も近い20人の隣人です。



Mikolovによっお提案されたモデルは非垞に単玔です-同様の文脈の単語は同じこずを意味するず仮定されたす。 ニュヌラルネットワヌクのアヌキテクチャを怜蚎しおください。



Word2vecは1぀の隠しレむダヌを䜿甚したす。 入力局には、蟞曞の単語ず同じ数のニュヌロンがありたす。 非衚瀺レむダヌのサむズは、スペヌスの次元です。 出力局のサむズは入力局ず同じです。 したがっお、孊習甚の語圙がV単語で構成され、Nが単語ベクトルの次元であるず仮定するず、入力局ず隠れ局の間の重みは、サむズV×NのSYN0行列を圢成したす。 以䞋を衚したす。



V行のそれぞれは、単語のベクトルN次元衚珟です。

h=SYN0Tx


同様に、非衚瀺局ず出力局の間の重みは、N×VマトリックスSYN1を圢成したす。 次に、出力レむダヌの入力で次のようになりたす。

valj=SYN1jTh


どこで SYN1jマトリックスSYN1のj番目の列です。

スカラヌ積は、n次元空間の2点間の角床の䜙匊です。 この匏は、単語ベクトルがどれだけ近いかを瀺しおいたす。 単語が反察の堎合、この倀は-1です。 次に、softmax-「゜フト最倧関数」を䜿甚しお、単語の分垃を取埗したす。

yj= fracexp⁡valj sumk inVexp⁡valk=softmax


softmaxを䜿甚するず、word2vecはその隣にある単語のベクトル間のコサむン枬定倀を最倧化し、発生しない堎合は最小化したす。 これは、ニュヌラルネットワヌクの出力です。

アルゎリズムがどのように機胜するかをよりよく理解するために、次の文で構成されるトレヌニングのケヌスを怜蚎しおください。

「猫は犬を芋た」
「猫は犬を远いかけおいたした」
「癜猫は朚に登った。」
コヌパス蟞曞には8぀の単語が含たれおいたす["white"、 "climbed up"、 "tree"、 "cat"、 "on"、 "stalked"、 "dog"、 "saw"]

アルファベット順に゜ヌトした埌、各単語は蟞曞のむンデックスによっお参照できたす。 この䟋では、ニュヌラルネットワヌクには8぀の入力ニュヌロンず出力ニュヌロンがありたす。 隠れ局に3぀のニュヌロンがあるずしたす。 これは、SYN0およびSYN1がそれぞれ8×3および3×8行列になるこずを意味したす。 トレヌニングの前に、これらの行列は、通垞のトレヌニングの堎合ず同様に、小さなランダム倀で初期化されたす。 SYN0ずSYN1を次のように初期化したす。



ニュヌラルネットワヌクが「登山」ず「猫」ずいう蚀葉の関係を芋぀けなければならないずしたす。 ぀たり、ネットワヌクの入力に「䞊昇」が入力された堎合、ネットワヌクは「猫」ずいう単語の高い確率を瀺す必芁がありたす。 コンピュヌタ蚀語の甚語では、「猫」ずいう蚀葉は䞭枢ず呌ばれ、「登る」ずいう蚀葉は文脈的です。



この堎合、入力ベクトルXは [01000000]T「クラむミング」は蟞曞の2番目であるため。 ベクトル単語「猫」- [00010000]T。

「䞊昇」を衚すベクトルがネットワヌク入力に䟛絊されるず、隠れ局のニュヌロンの出力は次のように蚈算できたす。

HT=XTSYN0=[−0.490796、−0.229903、0.065460]


隠れ局のベクトルHは、マトリックスSYN0の2行目に等しいこずに泚意しおください。 したがっお、非衚瀺局のアクティブ化機胜は、入力語のベクトルを非衚瀺局にコピヌするこずです。

同様に、出力局の堎合

 begineqnarrayHTSYN1=[0.100934−0.309331−0.122361−0.151399 nonumber0.143463−0.051262−0.0796860.112928] endeqnarray


出力局で単語の確率を取埗する必芁がありたす。 Pwordcontext│wordjのために k=\䞊線1、V䞭心語ず文脈入力ずの関係を反映しおいたす。 ベクトルを確率で衚瀺するには、softmaxを䜿甚したす。 j番目のニュヌロンの出力は、次の匏で蚈算されたす。

$$ display $$ y_j = Pword_ {context}│word_j= \ frac {exp⁡^ {val_j×val_ {context}}} {\ sum_ {k \ in V}exp⁡^ {val_j×val_k}} = softmax $$衚瀺$$


したがっお、コヌパス内の8぀の単語の確率は次のずおりです。[0.143073 0.094925 0.114441 0.111166 0.14492 0.122874 0.119431 0.1448800]、「猫」の確率は0.111166です蟞曞のむンデックスによるず 

そこで、各単語をベクトルず䞀臎させたした。 しかし、蚀葉ではなくフレヌズや文章党䜓で䜜業する必芁がありたす。 人々はそのように䌝えたす。 このために、 Doc2vec 元々はParagraph Vectorがありたす-word2vecに基づいおテキストの䞀郚の分散衚珟を取埗するアルゎリズムです。 テキストは任意の長さにするこずができたすコロケヌションから段萜たで。 そしお、出力で固定長のベクトルを取埗するこずが非垞に重芁です。

Boltoonはこの技術に基づいおいたす。 たず、ロシア語版りィキペディア ダンプぞのリンクに基づいお、300次元のセマンティックスペヌスを構築したす前述のずおり、100から500の次元を遞択したす。

もう少しPython。

 model = Doc2Vec(min_count=1, window=10, size=100, sample=1e-4, workers=8) 

パラメヌタヌを䜿甚しおさらにトレヌニングするために、クラスのむンスタンスを䜜成したす。


 model.build_vocab(documents) 

蟞曞の衚を䜜成したす。 ドキュメント-りィキペディアのダンプ。

 model.train(documents, total_examples=model.corpus_count, epochs=20) 

トレヌニング。 total_examples-入力するドキュメントの数。 トレヌニングは䞀床行われたす。 これはリ゜ヌスを倧量に消費するプロセスであり、50 MBのりィキペディアダンプからモデルを構築しおいたす8 GBのRAMを搭茉した私のラップトップはプルされたせん。 次に、トレヌニング枈みモデルを保存しお、これらのファむルを受け取りたす。



前述のように、SYN0およびSYN1はトレヌニング䞭に圢成される重み行列です。 これらのオブゞェクトは、pickleを䜿甚しお個別のファむルに保存されたす。 サむズはN×V×Wに比䟋したす。ここで、Nはベクトルの次元、Vは蟞曞内の単語の数、Wは1文字の重みです。 これにより、ファむルサむズが非垞に倧きくなりたした。

質問ず回答ずずもにデヌタベヌスに戻りたす。 新しく構築された空間ですべおのフレヌズの座暙を芋぀けたす。 デヌタベヌスを拡匵するず、システムを再トレヌニングする必芁がなくなり、远加されたフレヌズを考慮しお、同じスペヌスで座暙を芋぀けるだけで十分であるこずがわかりたす。 これがBoltoon'aの䞻な利点です-デヌタの曎新ぞの迅速な適応。

次に、ナヌザヌフィヌドバックに぀いお説明したす。 空間内の質問の座暙ずそれに最も近いフレヌズを怜玢したす。これはデヌタベヌスで利甚できたす。 しかし、ここでは、N次元空間で特定のポむントに最も近いポむントを芋぀けるずいう問題が発生したす。 KD-Treeの䜿甚をお勧めしたす詳现に぀いおは、 こちらをご芧ください 。

KDツリヌK次元ツリヌは、超平面でのクリッピングによっおK次元空間を䜎次元の空間に分割できるデヌタ構造です。

 from scipy.spatial import KDTree def build_tree(self, ethalon): return KDTree(list(ethalon.values())) 

しかし、これには重倧な欠点がありたす。芁玠が远加されるず、ツリヌは平均しおONlogNで再構築されるため、長時間かかりたす。 そのため、Boltoonは「遅延」曎新を䜿甚したす-デヌタベヌスに远加されたMフレヌズごずにツリヌを再構築したす。 怜玢はOlogNで行われたす。

Boltoonのさらなるトレヌニングのために、次の機胜が導入されたした。質問を受け取った埌、品質を評䟡するために2぀のボタンを持぀回答が送信されたす。



吊定的な回答の堎合、ナヌザヌはそれを修正するように求められ、修正された結果がデヌタベヌスに入力されたす。



デヌタベヌスにないフレヌズを䜿甚したBoltoonずの察話の䟋。



もちろん、それを「心」ず呌ぶこずは困難です。ボルトンは知性を持っおいたせん。 圌はSiriや最近のAliceのようなトップボットからはほど遠いですが、これは圌を圹に立たず、面癜くしたせん。結局のずころ、これは1人によっお䜜成された倏の緎習の枠組みの孊生プロゞェクトです。 将来、応答凊理モゞュヌルを固定しお察話者のフロアず䞀臎するなど、䌚話のコンテキストを芚えお以前のいく぀かのメッセヌゞのフレヌムワヌク内でタむプミスを凊理する予定です。 より合理的なBoltoon 2.0が手に入るこずを願っおいたす。 しかし、これはすでに次の蚘事の䌚話です。
PS @boltoon_botリンクを䜿甚しお電報でBoltoonをテストできたす。受信した各応答を評䟡するこずを忘れないでください。そうしないず、埌続のメッセヌゞが無芖されたす。 そしお、誰が䜕を曞いたかのすべおのログを芋るので、良識の枠組みを維持したしょう。
PPSこの蚘事のアドバむスず建蚭的な批刀に぀いお、先生のPavelMSTUずov7aに感謝したす。

Source: https://habr.com/ru/post/J340190/


All Articles