駆け出しRubyistの俺がPythonで1から形態素解析

5月24日(日)に
苫小牧工業高等専門学校にてtnct.Seminarの第4回勉強会が開催されました。

内容は
形態素解析

ほうほう

ようするに形態素解析とは





こんにちはOSCに参加しますか?

形態素解析

こんにちは OSC に 参加 します か ?




というよにう名詞、動詞、助詞。。。etcに分割する。→言語の最小単位ということです。

Yahoo!の検索などにも使われていますね^^Google派ですが





2つ以上の文を組み合わせると・・・

  • 明日は雷が落ちる。
  • 本屋に恋するプログラムがあった。
  • あなたが有名なhogeさんですか?
  • 明日 は 雷 が 落ちる。
  • 本屋 に 恋 する プログラム が あった。
  • あなた が 有名 な hogeさん です か ?

MIX


  • hogeさんが恋に落ちる。

というように名詞→助詞→名詞→助詞→動詞とつないでやれば、生成が可能となるわけです。



駆け出しRubyist(初心者)の私ですが、来週はPythonの説明をするという無茶難題があるため、Pythonの勉強がてらPythonで作成してみました。
祝 初Python
RubyPythonもまだまだ勉強不足でRubyらしい書き方、Pythonらしい書き方が出来ないのですが、とりあえず動いたので以下にソースを書きます。




注意
Pythonで作成していたのですが、とりあえずRubyと違って日本語処理がクソでしたw
配列内にに日本語を入れることは可能なのですが、多次元配列内に日本語をいれると文字化けを起こしてしまいました。
おそらく僕のコーディングミスだと思いますが、時間もなかったので、多次元配列を配列4つにわけてコーディングしたため、無駄なIf文や無駄なFor文が大量にありますw
ここらへんは愛嬌ですね。
スキルがないのもないんですが、時間がなく解決できなかったのであえて配列を4つにしていると思ってみてくださいw



ちなみに辞書無しで1から作りましたddd

#coding=utf-8

import random

def guess_encoding(s):
    encodings = ["ascii","utf-8","shift-jis","euc-jp"]

    for enc in encodings:
        try:
            unicode(s,enc)
            break
        except UnicodeDecodeError,e:
            enc = ""
    return enc

def out_put(k):
   # k = unicode(k,guess_encoding(k),"strict")
    global list0,list1,list2,list3 
    print k, ' - ',t[dic[k]]
    
    n = dic[k]
    if n == 0:
        list0 = list0 + [k]
    elif n == 1:
        list1 = list1 + [k]
    elif n == 2:
        list2 = list2 + [k]
    else:
        list3 = list3 + [k]
        
print '例文 = ',
st = raw_input()
st = unicode(st,guess_encoding(st),"strict")
global dic
dic = {
    u'あった':1,
    u'落ちる':1,
    u'明日':0,
    u'雷':0,
    u'恋':0,
    u'する':1,
    u'プログラム':0,
    u'本屋':0,
    u'大西':0,
    u'工藤':0,
    u'は':2, 
    u'歩く':1, 
    u'も':2,
    u'走る':1,
    u'と':3,
    u'寝る':1,
    u'食べる':1,
    u'勉強する':1,
    u'動く':1,
    u'持つ':1,
    u'に':2,
    u'の':2,
    u'と':2,
    u'を':2,
    u'だから':2,
    u'でも':2,
    u'神田':0,
    u'大村':0,
    u'ダテ':0,
    u'が':2
}
global list0,list1,list2,list3
list0 = []
list1 = []
list2 = []
list3 = []


dics = [[0,2,1],[0,2,1,0,2,1],[0,2,0,2,0,2,1]]

global t
t = (u'名詞',u'動詞',u'助詞',u'その他')

global lista
lista = []
print '\n 形態素解析開始'

for k,v in dic.iteritems():
    if st.find(k) != -1:
        #print "true"
        out_put(k)
        st = st.strip(k)
    
#多次元使いたい><Pythonクソ でもGoogle信者でつ
#以下無駄なコードが続きますwww
print'\n **名詞**\n'
for item in list0:
    print item,' ',

print '\n'

print '**動詞**\n'
for item in list1:
    print item,' ',

print '\n'

print '**助詞**\n'
for item in list2:
    print item,' ',

print '\n'

print'**その他**'
for item in list3:
    print item,' ',

print '\n'

while(1):
    str = ''
    r = 0
    item = 0


    #for item in dics[random.randint(0,1)]:
    for item in dics[2]:
        if item == 0:
            if len(list0) == 1:
                r = 0
            else:
                r = random.randint(0,len(list0)-1)
                str = str + list0[r]

        elif item == 1:
            if len(list1) == 1:
                r = 0
            else:
                r = random.randint(0,len(list1)-1)            
                str = str + list1[r]
                
        elif item == 2:
            
            if len(list2) == 1:
                r = 0
            else:
                r = random.randint(0,len(list2)-1)
                
                str = str + list2[r]
        else:
            if len(list3) == 1:
                r = 0
            else:
                r = random.randint(0,len(list3)-1)
                str = str + list3[r]
                
    print '作成文 = ' , str
    raw_input()

実行結果

onodes@onodes-asone:/media/disk/seminar/pgm04$ python ohnishi.py 
例文 =  神田さんは食べる。でも工藤は寝る。だから大村は走る。

 形態素解析開始
も  -  助詞
工藤  -  名詞
だから  -  助詞
神田  -  名詞
走る  -  動詞
寝る  -  動詞
食べる  -  動詞
大村  -  名詞
は  -  助詞
でも  -  助詞

 **名詞**

工藤   神田   大村   

**動詞**

走る   寝る   食べる   

**助詞**

も   だから   は   でも   


作成文 =  大村は神田だから工藤でも食べる

とりあえず
日本語でおk
とこのプログラムには言いたいですw

来週は室蘭工業大学勉強会(SAMIT)が開催されます。
SAMIT(Seminar At Muroran IT)では、集合知プログラミングをRubyを用いて実現していきたいなと考えています。