FC2ブログ
--.--
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

08.31
Fri
線形分類器で、ある文章がWindowsについてなのかLinuxについてなのか識別してみたいと思います

単に名詞を数えてるだけですがw

識別についてとかぜんぜんちゃんと勉強したわけじゃないので

いろいろ間違ってるかもしれないですが...

MeCabがないと動きません

windefとlindefというファイルからtargetというファイルがLinuxについてなのかWindowsについてなのかを識別します


#!/usr/bin/env python
#coding:utf-8

import MeCab


def count(lst):
    result = {}
    done = []
    for factorlst in lst:
        for eachfactor in factorlst:
            if eachfactor in done : continue
            result[eachfactor] = rcount(lst, eachfactor)
            done.append(eachfactor)
    return result


def rcount(lst , factor):
    result = 0
    for each in lst:result += each.count(factor)
    return result


def getfeature(text , feature = "名詞"):
	noun = []
	instance = MeCab.Tagger("-Ochasen")
	node = instance.parseToNode(text)
	while True:
		if node.next is None : break
		if node.next.feature.split(",")[0] == feature:noun.append(node.next.surface)
		node = node.next
	return noun


def score(dic1 , dic2 , text):
	score1 = 0
	score2 = 0
	textdic = count([getfeature(text)])
	for key in textdic:
		if ((key in dic1) and (key in dic2)):
			score1 += textdic[key] * dic1[key]
			score2 += textdic[key] * dic2[key]
		elif key in dic1:
			score1 += textdic[key] * dic1[key]
		elif key in dic2:
			score2 += textdic[key] * dic2[key]
	if score1 > score2 : print "This document is related to Windows."
	if score1 < score2: print "This document is related to Linux."
	if score1==score2:print "This document does not relate to either."


def main():score(count([getfeature(open("windef.txt" , "r").read())]) , count([getfeature(open("lindef.txt" , "r").read())]) , open("target.txt" , "r").read())

	
	
main()

文字コードてきな問題で動かなかったりしたら申し訳ないです

ファイルはshift-jisで書いた気がします

windef.txt

lindef.txt

target.txt
スポンサーサイト

comment 0 trackback 0
トラックバックURL
http://telracsmoratori.blog.fc2.com/tb.php/132-e527f10c
トラックバック
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。