外国語のテキストを扱う。 言語の理解と学習の割合を増やす方法は?

生活や仕事では、外国語のテキストを扱わなければならない場合がありますが、その知識はまだ完全ではありません。 議論されていることを読んで理解するために(そしてせいぜいいくつかの新しい単語を学ぶために)、私は通常2つのオプションを使用しました。 1つ目はブラウザ内のテキストの翻訳、2つ目は、たとえばABBYY Lingvoを使用した各単語の個別の翻訳です。 しかし、これらの方法には多くの欠点があります。 まず、ブラウザは翻訳文を提供します。これは、単語の順序を変更できることを意味し、翻訳は元のテキストよりもさらにわかりにくい場合があります。 第二に、ブラウザは代替の翻訳オプションも単語の同義語も提供しないため、新しい単語の学習に問題が生じます。 他のオプションや類義語は、翻訳者で特定の単語を検索することで取得できます。これには、特にそのような単語が多数ある場合、時間がかかります。 最後に、テキストを読みながら、どの言語がこの言語で最も人気があるかを知りたいので、それらを覚えてから筆記や口語のスピーチで使用できます。



そのような「翻訳機」を手元に置いておくといいと思ったので、Pythonで実装することにしました。 興味のあるすべての人、私は猫の下でお願いします。



単語数



プログラムを書くとき、私は次のロジックに導かれました。 最初に、テキスト全体を小文字に書き換え、不要な記号や記号(。?!など)を削除し、テキストに各単語が表示される回数をカウントする必要があります。 Googleコードに触発されて、私は少し難なくそれをやったが、結果をわずかに異なる形式、つまり{1: [group of words that is with frequency 1], 2: [--//-- with frequency 2], etc.}



。 これは、単語の各グループ内を含めて並べ替えが必要な場合、たとえば、単語をテキストと同じ順序にしたい場合に便利です。 合計で、二重の並べ替えを取得します。最も頻繁に発生する単語が先頭に移動し、同じ頻度で発生する場合は、ソーステキストに従って順序付けされます。 この考え方は、次のコードに反映されています。



 def word_count_dict(filename, dictList=de500): count = {} txt = re.sub('[,.!?":;()*]', '', open(filename, 'r').read().lower()) words = txt.split() for word in words: if not word in count: count[word] = 1 else: count[word] += 1 return {i: sorted([w for w in count if (count[w]==i and w not in dictList.values())], key=lambda x: txt.index(x)) for i in set(count.values())}
      
      





まあ、すべては私が望んでいたように機能しますが、リストの上部に補助語(theなど)および翻訳が明らかな他の語(たとえば、あなた)が含まれる疑いがあります。 最もよく使用される単語の特別なリストを作成することでそれらを取り除くことができます。そのため、辞書を作成するときに、このリストにあるすべての単語を除外します。 まだ便利なのはなぜですか? 正しい単語を学習したら、それをリストに追加でき、対応する翻訳は表示されなくなるためです。 dictList変数のリストを示し、しばらくの間それを忘れます。



言葉の翻訳



便利なオンライン翻訳者を探すのに数分を費やしたため、GoogleとYandexの動作を確認することにしました。 Googleがちょうど3年前と1日前にTranslate APIを閉じたので、 WNeZRoSによって提案された回避策を使用します 。 特定の単語のリクエストに応えて、Googleは翻訳、代替翻訳オプション、およびそれらの逆翻訳(つまり同義語)を提供します。 Yandex'aを通常どおりに使用するにはキーが必要です。リクエストへの応答には、翻訳だけでなく、例も含まれている可能性があります。 どちらの場合も、答えにはjson形式のリストが含まれ、Googleにとっては非常にシンプルで、Yandexにとってはやや複雑です。 この理由のために、そしてグーグルはより多くの言語(そしてしばしば言葉)を知っているので、それにこだわることに決められました。



素晴らしいグラブライブラリの助けを借りてリクエストを送信し、補助テキストファイル( dict.txt )に回答を書き込みます。 その中で、主な翻訳、代替案、同義語を見つけようとし、もしあれば、それらを印刷します。 最後の2つのオプションを無効にします。 対応するコードは次のようになります。



 def tranlsate(word, key, lan1='de', lan2='ru', alt=True, syn=True): g = Grab(log_file = 'dict.txt') link = 'http://translate.google.ru/translate_a/t?client=x&text='\ + word + '&sl=' + lan1 + '&tl=' + lan2 g.go(link) data = json.load(open('dict.txt')) translation, noun, alternatives, synonims = 0, 0, 0, 0 try: translation = data[u'sentences'][0][u'trans'] noun = data[u'dict'][0][u'pos'] alternatives = data['dict'][0]['terms'] synonims = data['dict'][0]['entry'][0]['reverse_translation'] except: pass if lan1=='de' and noun==u' ': word = word.title() if translation: print ('['+str(key)+']', word, ': ', translation) if alt and alternatives: [print (i, end=', ') for i in alternatives] print ('\r') if syn and synonims: [print (i.encode('cp866', errors='replace'), end=', ') for i in synonims] print ('\n')
      
      





ご覧のとおり、デフォルトの翻訳はドイツ語からロシア語に設定されています。 変数キーは、テキスト内の単語の頻度に対応します。 それを別の関数から転送します。これにより、単語ごとに翻訳が行われます。



翻訳機能を呼び出す



ここではすべてが単純です。辞書の形で適切な頻度の単語のグループを取得し( word_count_dict関数)、各単語の翻訳を見つけます( tranlsate関数)。 また、最もよく使用される単語の最初のn個のグループのみを表示します。



 def print_top(filename, n=100): mydict = word_count_dict(filename) mydict_keys = sorted(mydict, reverse=True)[0:n] [[tranlsate(word, key) for word in mydict[key]] for key in mydict_keys]
      
      







最も使用されている単語のリスト



さて、プログラムはほとんど準備ができており、最もよく使われる単語のリストを作成するだけです。 インターネットで簡単に見つけることができます。コードを無駄にしないように、最もよく使用される50、100、500語のリストをドイツ語でまとめ、別のファイルに書きました。



誰かが同様のリストを英語または別の言語で作成したい場合、それを共有してくれれば、私のリストに追加できることに感謝します。



予備結果



プログラムを実行すると、おおよそ次の形式で結果を取得できます。



 [  ] :   , 
      
      







さて、コードは書かれ、プログラムは動作しますが、どれほど便利で効率的ですか? この質問に答えるために、検証のためにドイツ語のテキストをいくつか取りました。



Deutsche Welleの最初の記事は、オーストラリアの近くにあるDeutsche Bankの石炭採掘の資金調達のトピックを扱っています。 この記事には498個の単語が含まれており、そのうちテキストで最も頻繁に使用される15個(最も使用頻度の高いドイツ語50個のリストを除外に使用)は、テキスト全体の16.87%に相当します。 大まかに言えば、これは、人がこれらの単語を知らないと仮定すると、テキストにあるすべての単語の翻訳を読んだ後、彼の理解度はほぼ17%増加することを意味します(テキストのなじみのある単語の数だけで理解度を測定する場合) 。 一見、かなり良い。



シュピーゲルの2番目の記事では、ウクライナの大統領選挙でのポロシェンコの勝利に対するドイツのDAX株価指数の反応について説明しています(そうです、彼は成長しました)。 この記事には252語が含まれており、そのうち8語(6.06%)がテキストの11.9%に相当します。



さらに、翻訳対象のテキストが短いために各単語が1回だけ出現する場合(たとえば、電子メールで受信したメッセージ)、テキストに含まれる単語と同じ順序で提案された翻訳を追跡することは非常に便利です。



それは美しいように聞こえますが(es klingtschön)、私はあまりにも多くの施設に入ったので、これらは非常に失礼なテストです。 このアイデアが外国語のテキストをどのように促進できるかを確認することは、このプログラムを定期的に使用することによってのみ可能であると思いますが、残念ながらあまり便利ではありません。 テキストを翻訳するには、まずテキストを.txtファイルにコピーし、ファイル名をファイル名変数に割り当ててから、 print_top関数を実行する必要があります。



何が欠けていますか?



結論の代わりに、この段階で何が欠けているのか、どのようにこれを改善できるのかを考えたいと思います。



第一に、前述したように、利便性。 コードを使用するのは不便です-テキストをコピーする必要があり、Pythonとグラブライブラリに依存しています。 どうする または、ページ上の特定のアイテムを選択して(たとえばReedyでの実装方法と同様)、ブラウザの拡張機能を作成して、翻訳を受け取ることができます。 第二に、他の言語で最も使用されているものを除外する単語のリスト。 最後に、エンコーディングを備えたさまざまな学校が可能です。



ほとんどの場合、近い将来、私の手は上記の変更の導入に到達しません(コードが書かれているため、言語のより深い研究を開始する時間です!)、だから誰かが参加したい場合、私は会社に喜んで助けます。



コード全体は、スポイラーの下とgithubにあります。



ソースコード
 # -*- coding: utf-8-sig -*- from __future__ import print_function import re import json from pprint import pprint from grab import Grab from dictDe import * def tranlsate(word, key, lan1='de', lan2='ru', alt=True, syn=True): """Prints the number of counts, word, translation, and example from lan1 to lan2 according to Translate.Google.""" # First, write down a translation in some auxiliary txt file # and load it in json format g = Grab(log_file = 'dict.txt') link = 'http://translate.google.ru/translate_a/t?client=x&text='\ + word + '&sl=' + lan1 + '&tl=' + lan2 g.go(link) data = json.load(open('dict.txt')) # Then, let's try to get all the necessary elements in json translation, noun, alternatives, synonims = 0, 0, 0, 0 try: translation = data[u'sentences'][0][u'trans'] noun = data[u'dict'][0][u'pos'] alternatives = data['dict'][0]['terms'] synonims = data['dict'][0]['entry'][0]['reverse_translation'] except: pass # German nouns should begin with capital letter if lan1=='de' and noun==u' ': word = word.title() # Finally, print out counts, word, translation with alternatives # and synonims, if applicable. Encoding is added up to allow # printing in cmd if you have a russian version of Windows if translation: print ('['+str(key)+']', word, ': ', translation) if alt and alternatives: [print (i, end=', ') for i in alternatives] print ('\r') if syn and synonims: [print (i.encode('cp866', errors='replace'), end=', ') for i in synonims] print ('\n') def word_count_dict(filename, dictList=de50): """Returns a dictionary with key being number of counts and value being a list of words with that key. dictList is an optional argument: it is to eliminate the most common words. Default is the dictionary of the 50 most common German words""" count = {} txt = open(filename, 'r').read().lower() txt = re.sub('[,.!?":;()*]', '', txt) words = txt.split() for word in words: if not word in count: count[word] = 1 else: count[word] += 1 return {i: sorted([w for w in count if (count[w]==i and w not in dictList.values())], key=lambda x: txt.index(x)) for i in set(count.values())} def print_top(filename, n=100): """Generates the top count groups for the given file. Default number equals 10. Drop reverse if you want to print the less frequent words in the text.""" mydict = word_count_dict(filename) mydict_keys = sorted(mydict, reverse=True)[0:n] [[tranlsate(word, key) for word in mydict[key]] for key in mydict_keys] filename = 'dictext.txt' print (print_top(filename))
      
      








All Articles