ベクトルモデルとロシア文学

画像







古典的なロシアの作家のテキストがなぜそれほど高く評価されているのか、そして作家自身が単語の達人と考えられているのか疑問に思ったことはありませんか? 重要なのは、作品のプロットだけでなく、書かれていることだけでなく、書かれている方法もあります。 しかし、対角線をすばやく読むと、これを認識するのは困難です。 さらに、重要な小説のテキストと比較するものは何もありません。実際、この場所にこの言葉が登場するほど美しいのはなぜですか、他のどの小説よりも優れているのでしょうか。 ある程度、実際の使用は、作家の草案に見られる可能性と対照的です。 作家はすぐに最初から最後まで熱心に文章を書くことはせず、苦しみ、選択肢の中から選択するか、表現力が不十分と思われるものを選択し、消し去って新しいものを探します。 しかし、下書きはすべてのテキスト用ではなく、大ざっぱで読みにくいものです。 ただし、このような実験を行うことはできます。すべての置換可能な単語を類似の単語に置き換え、存在しないが、ある種の平行宇宙で生じた可能性のあるものと並行して古典的なテキストを読みます。 途中で、この文脈でこの言葉が他の言葉よりも優れている理由の質問に答えようとすることができます。







そして今、これらすべて(実際の読み取りを除く)を自動的に行うことができます。







分布セマンティクス、つまりベクトルモデル



Habréには、いわゆるいわゆる検索での分散セマンティクスの使用方法に関する記事がすでにありました。 「パイ」 分散セマンティクスはかなり単純ですが、単語の意味はテキストの周囲に関連しているという完全に機能するアイデアです。 同様の意味を持つ単語は、同様のコンテキストで表示され、その逆も同様です。 コンテキスト自体はベクトルの形式で表現できるため(「ベクトルモデル」)、異なる単語の意味の類似性と差異を計算できます。 この考え方に基づいてロシア語向けの優れたサービスが作成されました。RusVectōrēsは、最も意味的に類似した単語を検索できるだけでなく、リソースの作成者が計算したモデルに無料でアクセスできるようにします。







処理中



ロシアの古典小説を5つ取り上げます。 ドミトリー・ビコフはどこかで、ロシア文学にとって最も重要なのは小説であり、その名には組合「と」があると述べた。 意味:「犯罪と罰」、「戦争と平和」、「父と息子」、「マスターとマルガリータ」。 まあ、「ユージン・オネーギン」も、詩ではあるが重要なロシアの小説である。







さらに、RusVectōrēのWebサイトからのモデルが必要です。これは、ロシア語の国立軍団とロシアのウィキペディアのテキストに基づいています。 Gensimライブラリを使用すると、それを使用できます。 このモデルで検索するには、いわゆる 準同義語 、実際には、セマンティックグラフの最も近い隣人(およびこれらの隣人は常に「実際の」同義語であるとは限らず、多くの場合、最も意味的に最も近い単語は反意語ですが、これは直感に反するようですが) 、このフォームを見つける方法を知っているプログラム。 最初はYandexのMystemを使用することを考えていましたが、最終的には別のPymorphy2に決めました 。その理由は明らかです。







import gensim import pymorphy2 model = gensim.models.KeyedVectors.load_word2vec_format("ruwikiruscorpora_0_300_20.bin.gz", binary=True) model.init_sims(replace=True) morph = pymorphy2.MorphAnalyzer()
      
      





したがって、テキストを調べて、それから単語を取り出し、正規化(つまり、動詞の不定詞または名前の主格単数形を復元)し、この単語がスピーチの同じ部分であることを確認しながら、モデル内で最も類似した単語を探します、元のように、デフォルトでは必ずしもそうではないため。 たとえば、 青に最も近い単語を参照してください。 青さ黒さの同じ名詞もありますが、形容詞の青みがあり、動詞が青に変わります 。 私は、モデルに言葉がまったくないという事実については話していません。 実際には、元の単語コーパス内の低頻度の単語の場合、最適化のためにベクトルが構築されず、準同義語が見つかりません。 それでは、この場所に元の単語を残しましょう。 さらに、代名詞、前置詞、その他の品詞の代用を探すことは意味がありません。







フォーム生成



そして、ここが最も興味深い部分です。 ソーステキストでは、単語は間接的な形式であり、モデルから補題が得られました。 ここで、テキストを一貫性のある読みやすいものにするために同じフォームに配置する必要があります。また、異質なタイプのママからの悪い翻訳のようには見えません。 そして、これでは、まったく同じPymorphy2が役立ちます。これは、単語を解析するだけでなく、指定された記号に従って正しい形式にすることもできます。 Mystemはこれを行うことができず、解析中にアナライザーが発行した補題だけでなく、単語フォーム属性(同じ番号と大文字小文字)のセットも覚えている場合は、同じプログラムに再度送信してフォームを生成すると非常に便利です。 確かに、Pymorphy2アナライザーが提供するすべてのタグがPymorphy2ジェネレーターを知っているわけではないことがわかりました。つまり、その右手は常に左が何をするかを知っているわけではありません。 しかし、これは恐ろしくはなく、タンバリンと少し踊り、目的の形になります。







著者がPymorphy2の周りのタンバリンと踊る機能
 def flection(lex_neighb, tags): tags = str(tags) tags = re.sub(',[AGQSPMa-z-]+? ', ',', tags) tags = tags.replace("impf,", "") tags = re.sub('([AZ]) (plur|masc|femn|neut|inan)', '\\1,\\2', tags) tags = tags.replace("Impe neut", "") tags = tags.split(',') tags_clean = [] for t in tags: if t: if ' ' in t: t1, t2 = t.split(' ') t = t2 tags_clean.append(t) tags = frozenset(tags_clean) prep_for_gen = morph.parse(lex_neighb)
      
      





ドーピング



ここですべてをまとめて、大文字と句読点の処理を忘れないでください。 出来上がり! 私たちの画面にはなかった代替のロシア文学:







少年について話す

音符の中央にベールを残し、

はい、罪がないわけではありませんが、

アエネイドの2つの詩から。







本当にそこにあるものを忘れた人のために

少年の説明

手紙の最後に、

はい、覚えていますが、罪がないわけではありませんが、

アエネイドの2節から。







しかし、まだ、何かが正しくありません。 いくつかの場所では、テキストは依然として許容できるインコヒーレンスの程度を超えています。







リュドミラとルスランの友!

私の物語のヒロインと

あとがきがなければ、30分soきます

あなたを知りましょう







オリジナルを見て、美しいをタッチしたい場合

リュドミラとルスランの友!

私のロマンスのヒーローと

前文なしで、この時間

紹介させてください







これは名詞の問題です! モデルからは、同じ品詞を取得して同じ形式にしますが、性別などの名詞の一定の特徴を考慮しませんでした。 名詞ごとに異なります。また、フォームを正しく生成しても一貫性が失われることはありません。 次に、モデルによって与えられた名詞の性別をさらにチェックするルールを紹介します。







タンバリンとのより多くのダンス
 def flection(lex_neighb, tags): tags = str(tags) tags = re.sub(',[AGQSPMa-z-]+? ', ',', tags) tags = tags.replace("impf,", "") tags = re.sub('([AZ]) (plur|masc|femn|neut|inan)', '\\1,\\2', tags) tags = tags.replace("Impe neut", "") tags = tags.split(',') tags_clean = [] for t in tags: if t: if ' ' in t: t1, t2 = t.split(' ') t = t2 tags_clean.append(t) tags = frozenset(tags_clean) prep_for_gen = morph.parse(lex_neighb) ana_array = [] for ana in prep_for_gen: if ana.normal_form == lex_neighb: ana_array.append(ana) for ana in ana_array: try: flect = ana.inflect(tags) except: print(tags) return None if flect: word_to_replace = flect.word return word_to_replace return None
      
      





良くなった:







リュドミラとルスランの友!

私の物語の性格で......







など







どうした



これで、ゆっくりと読むことができます:







パラレルワールドの「マスターとマルガリータ」

オリジナル:



第1章







見知らぬ人と話すことはありません







春になると、かつてないほど暑い日没の1時間で、モスクワの総主教の池に2人の市民が現れました。 灰色の夏のペアを着た彼らの最初のものは、短く、栄養が豊富で、bげていて、彼はパイを手に持ってまともな帽子を運んでいて、彼のよく剃った顔には、黒い角縁のフレームに超自然的なサイズのメガネが置かれていました 2つ目-頭の後ろに押し込まれた市松模様の帽子をかぶった幅広の赤みを帯びた若い男-は、カウボーイシャツ、白いズボン、黒いスリッパをかぶっていました。







「翻訳」:



第1章







原因不明の話をしないでください







春に、偶然にも、かつてないほど暑い日の出の正午に、メトロポリタンストリームのカザンに2人の仲間の市民が現れました。 10歳の青いペアで誇示されたそれらの最初のものは、小さな成長、脂肪、,げ、彼の手のひらのパイでまともな帽子を引きずり、異世界の直径に置かれた黒い角の眼鏡でした。 2つ目は、額にかがんだカラフルな帽子をかぶった、肩幅が広く、縮れた髪、色の濃い肌、黒い肌の心で、ジャケット、白いズボン、黒いスリッパでした。







パラレルワールドからの「罪と罰」

「罪と罰」:



彼は階段で愛人に会うことを安全に避けました。 彼のクローゼットは高層の5階建ての建物の屋根の下にあり、アパートというよりはクローゼットのように見えました。 このクローゼットを昼食と使用人と一緒に雇った女主人は、1階下の別のアパートに置かれ、通りに出るたびに、ほとんど常に階段に向かって開いている台所の女主人のそばを通り抜けなければなりませんでした。







パラレルワールドからの「犯罪と罰」:



彼は喜んでその隣人との会話を避けました。 彼の部屋は彼を低い9階建ての大邸宅の屋根の下に押し込み、アパートというよりはキャビネットのように見えました。 夕食と使用人と一緒にこの部屋を借りた彼の住宅の隣人は、別のアパートの1段下に位置し、次回、堤防で解放されたとき、彼は確かにほとんどいつもしっかりと階段に向かって開いた夫の食堂に向かっていました。







まあ、そしてもちろん、私が記事の冒頭で書いたすべての深刻な、そしてほとんど科学的な目的のために、いくつかの場所でこれは単にばかげていますが、政治的には正しくありません:







-あなたはファシストですか? 無視された人に尋ねた。

「私ですか?」准教授が尋ねると、突然彼は考えました。 「はい、おそらくファシスト...」と彼は言った。


実際、ブルガコフにはこれがありました

「あなたはドイツ人ですか?」 ホームレスは尋ねた。

「私ですか?」と教授は尋ね、突然彼は考えました。 「はい、たぶんドイツ人…」と彼は言った。







小説の全文(バージョン3.0):





残りの問題



実際、すべてがうまく調整されているわけではありません。 他の文法カテゴリを考慮して単語を選択する必要があり、その中には移行と誓約があります。 まあ、pymorphy2は補題の選択には理想的ではありません。 彼は最も可能性の高いものを提案しています。 しかし、最も可能性の高い答えは常に正しいとは限りません。 たとえば、 若い形は名詞youngから属格として認識され、最も類似した単語は浅黒い肌の人であり、pymorphy2は浅黒い肌の形を属格の形に喜んで置きます。 だから、 渦巻く若い男から、 白髪の浅黒い肌の心に変わります







いくつかの場所では、通常小説のテキストに再現されていない文字は、フォームを決定するのに役立ちます。







 >>> morph.parse('') [Parse(word='', tag=OpencorporaTag('NOUN,inan,femn plur,gent'), normal_form='', score=0.588235, methods_stack=((<DictionaryAnalyzer>, '', 55, 8),)), Parse(word='', tag=OpencorporaTag('NOUN,anim,masc sing,nomn'), normal_form='', score=0.411764, methods_stack=((<DictionaryAnalyzer>, '', 3019, 0),))] >>> morph.parse('') [Parse(word='', tag=OpencorporaTag('NOUN,anim,masc sing,nomn'), normal_form='', score=1.0, methods_stack=((<DictionaryAnalyzer>, '', 3019, 0),))]
      
      





したがって:







にやにやして考えてみてください:

機能はいつあなたを連れて行くでしょう!」







の代わりに

ため息をついて考えてみてください:

地獄があなたを連れて行くとき!







「ベクター小説」のアイデアの説明と追加資料は、特別ページにあります







置換コードはすべてGithubに投稿されています。







素敵な読書を!







参照資料





UPD。:kdeniskは、小説の統一テキストを提供しました。これにより、フォームの認識における多くの欠陥を取り除くことができました。 動詞誓約によるフィルタリングを追加しました。







UPD2: 「Anna Karenina」の資料に基づいたテスト








All Articles