アラキタウン

黒歴史や生き恥を切り売り

セット4(後半)

セット4(後半)です。

 

(6)1行1単語形式(medline.txt.sent.tok)を読み込み,単語の連接を出力するプログラムを実装

#!usr/bin/env python3
# -*- 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(次の単語)"とする。

#!usr/bin/env python3
# -*- 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(次の単語)"と

#!usr/bin/env python3
# -*- 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モジュールを用いよ.

#!usr/bin/env python3
# -*- 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)と求めればよい

#!usr/bin/env python3
# -*- 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で入力単語の数値を得る。

 

 

ほんとにあっているのだろうか・・・・

ちゃんとした答えほひい