proglog

主にプログラミングに関する断片的メモ

pythonで英語学習

前置き

とりあえずなんか一冊英語の原書を読めば単語力とか付くんじゃないだろうか。
そんなわけで、それにpythonを使う。

ここでは次の本を選んだとする。
Amazon.co.jp: 不思議な少年 (岩波文庫): マーク トウェイン, Mark Twain, 中野 好夫: 本

16世紀のオーストリアの小村に,ある日忽然と美少年が現れた.名をサタンといった.村の3人の少年は,彼の巧みな語り口にのせられて不思議な世界へ入りこむ…作者は,アメリカの楽天主義を代表する作家だといわれるが,この作品は彼の全く別の一面-人間不信とペシミズムに彩られ,奇妙に人を惹きつける.(解説=亀井俊介)(改版)

Amazon.co.jp: 不思議な少年 (岩波文庫): マーク トウェイン, Mark Twain, 中野 好夫: 本

サタンは不思議な力をテオドール達に次々と見せる。そこにピーター神父が通り、財布を落とす。サタンはその中に大量の金貨を入れて返すが、同じころに占星術師の金貨がなくなっていたため、ピーター神父は窃盗の罪で投獄されてしまう。

不思議な少年 (小説) - Wikipedia

随分前に日本語で読んだけど、ぐうっとはまった。
という記憶がある。

Amazon.co.jp: 人間とは何か (岩波文庫): マーク トウェイン, Mark Twain, 中野 好夫: 本

老人と青年の対話の形で書かれたマーク・トウェイン晩年の著作.人生に幻滅している老人は,青年に向かって,人間の自由意志を否定し,人間は完全に環境に支配されながら自己中心の欲望で動く機械にすぎないことを論証する.

Amazon.co.jp: 人間とは何か (岩波文庫): マーク トウェイン, Mark Twain, 中野 好夫: 本

これと合せて読むと凄くいい。
確かそうした。

ホッブスも真っ青の人間機械論。
いや、どうだったか。

両方とも短編の部類

で、この"不思議な少年"はThe Mysterious Stranger, and Other Stories by Mark Twain - Free Ebookに原文のテキストがあり、LibriVoxに朗読の音声ファイルがmp3で存在する。
だから、耳からも刺激を入れることができる。

どの程度の難易度か、どの程度の単語を勉強することになるか。それをちょと調べたい。リストかなんか作ることができれば、あらかじめ記憶しておくことも出来るだろう。

で、映画「The Social Network」の脚本をNLTKで解析して遊んでみた - ぬいぐるみライフ(仮)に従って、原文テキストをいじる。

本題

windws、cygwin, python2.7で、ntlkはpipで素直に入った。
ついでにipythonもインストールしてみる。これも、pipで。
これらの使いかたの練習も兼ねる。

In [1]: import nltk
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-b06499430ee0> in <module>()
----> 1 import nltk

ImportError: No module named nltk

ここでwindowsにほうにインストール済みのnltkに検索パスを通す

In [1]: %doctest_mode
Exception reporting mode: Plain
Doctest mode is: ON
>>> import nltk
>>> raw = open('THE MYSTERIOUS STRANGER.txt').read()
>>> tokens = nltk.word_tokenize(raw)
>>> text = nltk.Text(tokens)
>>> len(tokens)
50809

付帯情報的な部分も入っているけど、大体5万語。
世界的に有名な、某魔法少年物語の第1巻は大体7〜8万語らしい。
英語の多読に。レベル別 洋書ファンタジー小説いろいろ

>>> tokens_l = [w.lower() for w in tokens]
>>> tokens_set = set(tokens_l)
>>> len(tokens_set)
6151

重複のない語数は6千強。
ただ、これは、語形変化や、数字なんかも入ったもの。だからこれをもう少し実体に即したものにしたい。

nltk.corpus.reader package — NLTK 3.0 documentationを見ると"morphy"という関数が、wordnetと突き合わせて、原型やら単数形やらに直してくれるっぽい。
wordnetに無いものや、判別できないものはスルーされるらしいけど、細かいのは切り捨てで構わない。

>>> from nltk.corpus import wordnet as wn
>>> print(wn.morphy('copied'))
Traceback (most recent call last):
  File "<ipython-input-13-896ef84543c7>", line 1, in <module>
    print(wn.morphy('copied'))
  File "/c/lang/Python27/Lib/site-packages/nltk/corpus/util.py", line 68, in __getattr__
    self.__load()
  File "/c/lang/Python27/Lib/site-packages/nltk/corpus/util.py", line 56, in __load
    except LookupError: raise e
LookupError: 
**********************************************************************
  Resource 'corpora/wordnet' not found.  Please use the NLTK
  Downloader to obtain the resource:  >>> nltk.download()
  Searched in:

どうやら特定の場所にwordnetを置いておく必要があるらしい。
で、指示に従う

>>> nltk.download()
NLTK Downloader
---------------------------------------------------------------------------
    d) Download   l) List    u) Update   c) Config   h) Help   q) Quit
---------------------------------------------------------------------------
Downloader> d

Download which package (l=list; x=cancel)?
  Identifier> wordnet
    Downloading package 'wordnet' to /XXXX/XXXXX/nltk_data...
      Unzipping corpora/wordnet.zip.

---------------------------------------------------------------------------
    d) Download   l) List    u) Update   c) Config   h) Help   q) Quit
---------------------------------------------------------------------------
Downloader> q
True
>>> print(wn.morphy('copied'))
copy

これでインストール完了

>>> print(wn.morphy('copied'))
copy

原形になってる。

>>> rtokens = []
>>> for wd in tokens_set:
... mtemp = wn.morphy(wd) and rtokens.append(mtemp)

>>> len(rtokens)
4771

4千7百語になった。

で、この4千7百語が、一体どんなレベルのものなのか。それが知りたい。
そこでPDIC Users Page 電子辞書と英語学習のページの英単語リストを使わせてもらうことにした。
ここの100語から6千語までのリストにある単語を、この4千7百語から削除してみる。

>>> temp_l = []
>>> with open('lv6000.txt', 'r') as f:
... for line in f.readlines():
... temp_l.append(line.strip())

>>> wtemp_l = []
>>> with open('words.txt', 'r') as f:
... for line in f.readlines():
... wtemp_l.append(line.strip())

>>> temp_s = set(temp_l)
>>> with open('words2mem.txt', 'w') as f:
... for wd in wtemp_l:
... if wd in temp_s:
... f.write(wd + "\n")

こんな感じで作ったリスト、"words2mem.txt"の単語の中身は534語
僕に6千語レベルの語彙力があれば、500回ほど英和辞典・和英辞典 - Weblio辞書のお世話になれば、読めるってことになる。

GSL(日常会話の80%をカバーするGeneral Service Listとは - もりぐち!!!!)のリストと比べるのもいいかも。