セット4(前半)

セット4(前半)です。

 

(1)ファイルを読み込み,単語をキーとして,品詞,活用形,基本形のタプルのリストを値とするマッピング型に格納せよ.プログラムの動作を確認するため,標準入力から読み込んだ単語の語彙項目を閲覧するプログラムを実装

#!usr/bin/env python3
# -*- 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モジュールを使ってファイルに書き出す

#!usr/bin/env python3
# -*- 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)で標準入力から読み込んだ単語に対して,辞書引き結果を付与する

#!usr/bin/env python3
# -*- 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) 辞書引きを行った結果,辞書に載っていなかった語のみを出力

#!usr/bin/env python3
# -*- 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つ以上のエントリが見つかったもののみを出力

#!usr/bin/env python3
# -*- 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以上の時に出力させました。