🐕 『入門 自然言語処理』メモ (6) - Project Gutenberg
作成日: 2021/11/14
0

『入門』第3章の pp.84~85 に、グーテンベルクプロジェクトのウェブサイトからテキストを入手して、一連の処理をおこなうサンプルが示してあります。
このサイトで esperanto を検索する100件以上のヒットがあり、その中に "Ĉe la koro de la tero" (エドガー・ライス・バローズ『地底世界ペルシダー』のエスペラント訳) があったので、これでやってみました。テキスト番号は 20802。

>>> from urllib import request
>>> url = "https://www.gutenberg.org/files/20802/20802-0.txt"
>>> respondo = request.urlopen(url) 
>>> krudajho = respondo.read().decode('utf8') 
>>> type(krudajho)
<class 'str'>
>>> len(krudajho)
287856
>>> krudajho[:78]
'\ufeffThe Project Gutenberg EBook of Ce la koro de la tero, by Edgar Rice Burroughs'
>>> krudajho[1:78]
'The Project Gutenberg EBook of Ce la koro de la tero, by Edgar Rice Burroughs'

このテキストファイルにはBOMが付いているようで、『入門』と同様の結果を出すためには添え字の範囲を調節しなければなりません。

>>> jhetonoj = nltk.word_tokenize(krudajho)
>>> type(jhetonoj)
<class 'list'>
>>> len(jhetonoj)
56752
>>> jhetonoj[:10]
['\ufeffThe', 'Project', 'Gutenberg', 'EBook', 'of', 'Ce', 'la', 'koro', 'de', 'la']

BOMは独立したトークンとして扱われてはいないようです。あるいは word_tokenize() がBOMの存在を想定していなかった可能性があります。

>>> teksto = nltk.Text(jhetonoj)
>>> type(teksto)
<class 'nltk.text.Text'>
>>> len(teksto)
56752
>>> jhetonoj.index('1-a')
1726
>>> teksto[1726:1766]
['1-a', 'ĉapitro', 'AL', 'LA', 'ETERNAJ', 'FAJROJ', 'Mi', 'naskiĝis', 'en', 'Connecticut', '[', '2', 
']', 'antaŭ', 'proksimume', 'tridek', 'jaroj', '.', 'Mia', 'nomo', 'estas', 'David', 'Innes', '.', 'Mia', 'patro', 'estis', 'riĉa', 'minejposedanto', '.', 'Li', 'mortis', ',', 'kiam', 'mi', 'estis', 'deknaŭjara', '.', 'Laŭ', 'lia']
>>> teksto.collocations()
Project Gutenberg-tm; Project Gutenberg; interna mondo; Literary
Archive; ekstera mondo; Gutenberg-tm electronic; electronic works;
Archive Foundation; Gutenberg Literary; United States; kaj tiam; set
forth; per siaj; public domain; electronic work; Edgar Rice; Gary
Mickle; des pli; multe pli; Rice Burroughs

index() で '1-a ĉapitro' の位置を求め、次に第1章の冒頭部分を表示させてみました。collocations() に英語が多く出てくるのは、Project Gutenberg の説明があるからです。これらを除くためには、次のように小説本文を抽出します。

>>> krudajho.find('1-a ĉapitro')
9192
>>> krudajho.rfind("End of Project Gutenberg's Ce") 
266931
>>> krudajho2 = krudajho[9192:266931]
>>> krudajho2.find('1-a ĉapitro') 
0
>>> jhetonoj2 = nltk.word_tokenize(krudajho2)
>>> len(jhetonoj2)
51368
>>> teksto2 = nltk.Text(jhetonoj2)
>>> teksto2.collocations()
ekstera mondo; interna mondo; kaj tiam; per siaj; des pli; multe pli;
povis vidi; povus esti; Morta Mondo; momenton poste; tagmeza suno;
ekstera krusto; longa tempo; sesa sentumo; kelkajn paŝojn; Kaj tiam;
tuj antaŭ; glacia tavolo; povas esti; pensis pri

このようにエスペラント本文を抽出してやれば、collocations() にはエスペラント単語だけが現れてきます。


pythonで自然言語処理プログラムが書けるようになりたいと思っています。Ticketnoteで自分の到達度を確認できれば嬉しいです。