セット4(後半)です。
(6)1行1単語形式(medline.txt.sent.tok)を読み込み,単語の連接を出力するプログラムを実装
# -*- coding: utf-8 -*-
import marshal
line = ""
for i in open("medline.txt.sent.tok.stem","r"):
i = i.strip("\n").split("\t")
if(line != ""):
if(line != "."):
print(line+"\t"+i[1])
line = i[1]
if(line != "")で1回目はlineが""なのでline=i[i]となります。
if(line != ".")でlineが"."になるまで出力していきます。
line="."となるとまたline=i[1]となりこれをループで繰り返していきます。
(7)(6)の出力を読み込み,単語の連接の頻度を求めよ.ただし,出力形式は"(連接の頻度)\t(現在の単語)\t(次の単語)"とする。
# -*- coding: utf-8 -*-
import marshal
f = open('fire.txt',"w")
line = ""
for i in open("medline.txt.sent.tok.stem","r"):
i = i.strip("\n").split("\t")
if(line != ""):
if(line != "."):
lineout=line+"\t"+i[1]+"\n"
f.write(lineout)
line = i[1]
f.close
f = open('fire.txt')
data = f.read()
words = {}
for word in data.split("\n"):
words[word] = words.get(word, 0) + 1
d = [(v,k) for k,v in words.items()]
d.sort()
d.reverse()
for count,word in d:
print (count,end="\t")
print (word)
(6)で作ったものにセット1の(10)で頻度を求めるプログラムと組み合わせただけです。
(8) (7)の出力を読み込み,ある単語wに続く単語zの条件付き確率P(z|w)を求めよ.ただし,出力形式は"(条件付き確率)\t(現在の単語)\t(次の単語)"と
# -*- coding: utf-8 -*-
import marshal
List =
for i in open("47_result.txt","r"):
dst = i[:-1].split("\t")
List.append(dst)
List.sort(key=lambda x: x[1], reverse=True)
dic={}
for s in List:
dic[s[1]] = dic.get(s[1], 0) + int(s[0])
for t in List:
if(t==List[-1]):
break
print(float(t[0])/float(dic[t[1]]),end="\t")
print(t[1]+"\t"+t[2])
[:-1]で最初から最後の要素までを指定できます。( : ってコロンって読むのすぐ忘れるww)
読み込んだ文をタブで区切り(split("\t"))
Listに追加していきます。(List.append(dst))
lamdaを使って関数を作りx[1]で2コラム目を逆順で指定して並べていきます。
getsを使って辞書型にその単語があれば頻度の数を足していきます。
頻度/単語の頻度の数で条件付き確率が出ますので、それを表示
(9) (8)の出力を読み込み,単語の連接(w, z)をキーとして,その条件付き確率P(z|w)を値とするハッシュデータベースを構築せよ.ハッシュデータベースの構築には,Kyoto CabinetのPythonモジュールを用いよ.
# -*- coding: utf-8 -*-
import sys
from kyotocabinet import *
List =
for i in open("48result.txt","r"):
dst = i.strip("\n").split("\t")
List.append(dst)
db=DB()
if not db.open("casket.kch",DB.OWRITER|DB.OCREATE):
print("error")
for s in List:
if not db.set(s[1]+","+s[2],s[0]):
print("error")
if not db.close():
print("erorr")
DB.OWRITERで書き込みモードで開く
DB.OCREATEで作成モードで開く
if not で偽だったらprint(errror)真だったらそのまま使うことができる
set(key,value)となっており、s[1]+","+s[2]をキーとして入れ、キーが新しいものだったら新しいもの作り、存在していたらvalueを上書きしていきます。
(5) (39)で構築したデータベースを読み込み,標準入力から読み込んだ文の生起確率を計算せよ.入力された文が単語列(w1, w2, ..., wN)で構成されるとき,生起確率はP(w2|w1)P(w3|w2)...P(wN|wN-1)と求めればよい
# -*- coding: utf-8 -*-
import sys
from kyotocabinet import *
List = []
for i in open("48result.txt","r"):
dst = i[:-1].split("\t")
List.append(dst)
db=DB()
if not db.open("casket.kch",DB.OREADER):
print("errror")
word = input('単語入力')
word=word.strip().split(" ")
answer = 1.0
for t in range(0,len(word)-1):
print(word[t]+"\t"+word[t+1])
value = db.get_str(word[t]+","+word[t+1])
if(value):
answer = answer * float(value)
else:
answer = 0.0
print(answer)
if not db.close():
print("erorr")
input で入力を得られます。
get_strで入力単語の数値を得る。
ほんとにあっているのだろうか・・・・
ちゃんとした答えほひい