セット4(前半)です。
(1)ファイルを読み込み,単語をキーとして,品詞,活用形,基本形のタプルのリストを値とするマッピング型に格納せよ.プログラムの動作を確認するため,標準入力から読み込んだ単語の語彙項目を閲覧するプログラムを実装
# -*- coding: utf-8 -*-
import re
import sys
dic = {}
for i in open("inflection.table.txt","r"):
i=i.split("|")
key=i[0]
word=(i[1],i[3],i[6])
dic.setdefault(key,).append(word)
word = ''
if(word != '0'):
word = input('単語入力')
print("入力="+word)
if(word in dic):
print(dic[word])
else:
print("登録されてません")
Pythonでマッピング型としてはdictというものがあり、それを使った。
setdefaultで指定したkeyが無い場合に、keyを辞書に追加することができ、dic.setdefault(key,).append(word)でどんどん追加していくことができます。
inputで入力を取得できます。
(2)(1)で読み込んだマッピング型オブジェクトを,marshalモジュールを使ってファイルに書き出す
# -*- coding: utf-8 -*-
import marshal
dic = {}
f=open("dictionary.txt","wb")
for i in open("inflection.table.txt","r"):
i=i.strip().split("|")
key=i[0]
word=(i[1],i[3],i[6])
dic.setdefault(key,[]).append(word)
marshal.dump(dic,f)
marshalでバイナリ形式で読み書きできるようになる関数があり、dumpでファイルに値を書き込めます。
バイナリ形式なのでファイルの中身は文字化け?してるしちゃんと開けませんでした。
(3) (2)で作成した辞書を読み込み,1行1単語形式(例えばmedline.txt.sent.tok.stem)で標準入力から読み込んだ単語に対して,辞書引き結果を付与する
# -*- coding: utf-8 -*-
import marshal
dic = {}
f=open("dictionary.txt","rb")
dic = marshal.load(f)
for i in open("medline.txt.sent.tok.stem","r"):
i = i.strip().split("\t")
if dic.get(i[0]):
print(i[0])
for j in dic.get(i[0]):
print(j)
rbでバイナリモードで、読み込み用に開きます。
medline.txt.sent.tok.stemを読み込みタブ(\t)で分けて、
もし辞書にmedline.txt.sent.tok.stemのタブで分けた最初の単語があれば、その単語で登録した数(dic.get(i[0]))でループし一個一個表示させます。
(4) 辞書引きを行った結果,辞書に載っていなかった語のみを出力
# -*- coding: utf-8 -*-
import marshal
dic = {}
f=open("dictionary.txt","rb")
dic = marshal.load(f)
for i in open("medline.txt.sent.tok.stem","r"):
i = i.strip().split("\t")
if dic.get(i[0]):
continue
else:
print(i[0])
ifを用いて辞書の中に単語があれば素通り(continue)それ以外(else)で出力としました。
(5) 辞書引きを行った結果,3つ以上のエントリが見つかったもののみを出力
# -*- coding: utf-8 -*-
import marshal
dic = {}
f=open("dictionary.txt","rb")
dic = marshal.load(f)
for i in open("medline.txt.sent.tok.stem","r"):
i = i.strip().split("\t")
if dic.get(i[0]):
if len(dic.get(i[0])) > 3:
print(i[0])
for j in dic.get(i[0]):
print(j)
print("")
エントリ数(len(dic.get(i[0])))が3以上の時に出力させました。