본문 바로가기

app/python

조건부 확률로 만든 문장의 긍정/부정 구하기


해당 문장이 긍정인지 부정인지 판단하는 프로그램~ (실은 홈페이지로 만들려고 했으나..... 한글 형태소 분석에 자원을 너무 많이 써서 서버가 멈추는... 돈이 없어서 가장 성능 낮은 서버를 쓰고 있으니..프로그램 하나 안돌아간......ㅜㅡㅜ)



먼저 조건부 확률은 (https://ko.wikipedia.org/wiki/%EC%A1%B0%EA%B1%B4%EB%B6%80_%ED%99%95%EB%A5%A0 )

확률 공간 Ω에서의 두 사건 A, B에 대해서 P(B) > 0일 때 사건 B가 일어났을 때 사건 A의 조건부 확률은





긍정 부정 두가지 상황이 있으므로 


P(c) = 1/2 

 

P1(x|c) = count(해당 문장에서 긍정 단어 리스트 수 ) / count(전체 긍정 단어 리스트 수 )


P2(x|c) = count(해당 문장에서 부정 단어 리스트 수 ) / count(전체 부정 단어 리스트 수 )



if p1 > p2: 
  
   긍정

else:
 
  부정

이 된다.



자세한 사항은 http://newpower.tistory.com/127 참조



from konlpy.tag import Kkma
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='123qwe', db='word', charset='utf8')
cur = conn.cursor()
kkma = Kkma()


#조건부 확률 계산
def conditional_probability(test, train_table, all_count, table_count):
    counter = 0
    list_count = []

    #해당 문장이 해당 테이블에 존재 하는지 확인
    for word in test:
        cur.execute("SELECT count(*) as cnt  FROM "+train_table+" where word = '"+word+"'")
        for cnt in cur:
            if int(cnt[0]) > 0:
                counter += 1

        list_count.append(counter)
        counter = 0

    print(list_count)

    cal_list = []
    for j in range(len(list_count)):
        #다음에 * 연산할떄 0이 되지 않기 위해 +1을 해줌
        cal_list.append((list_count[j]+1)/float(table_count+all_count))
    result = 1
    for j in range(len(cal_list)):
        result *= float(round(cal_list[j], 6))

    return_value = float(result)*float(1.0/2.0)
    print(return_value)
    return return_value

# get the data
input_file = open('input.txt', 'r')

list_positive = []
list_negative = []

#형태소 분리
input_line = input_file.readline()
input_kkma = kkma.pos(input_line)

print(input_kkma)

test_output = []
for i in input_kkma:
    test_output.append(i[0])

#긍정 단어 전체 갯수
cur.execute("SELECT count(*) as cnt  FROM positive ")
positive_count = 0
for response in cur:
    positive_count = int(response[0])

#부정 단어 전체 갯수
cur.execute("SELECT count(*) as cnt  FROM negative ")
negative_count = 0
for response in cur:
    negative_count = int(response[0])

# naive bayes 값 계산
result_pos = conditional_probability(test_output, 'positive', positive_count+negative_count, positive_count)
result_neg = conditional_probability(test_output, 'negative', positive_count+negative_count, negative_count)

if result_pos > result_neg:
    print(u'긍정')
else:
    print(u'부정')




결과


" 너는 아름답다."  는 다음과 같이 나옵니다.




끝.

'app > python' 카테고리의 다른 글

python timeit 함수 수행 시간 알아내기  (0) 2016.05.20
TRAVIS 연동 (python)  (0) 2016.05.19
gensim을 설치여정 (ubuntu 14.04)  (0) 2016.04.05
JetBrains edit font size control  (0) 2014.10.23
python dict in list sort to dict value  (0) 2014.10.17