본문 바로가기
루모의 일상사

FAQ :: polarity.csv와 어떻게 매칭하면 좋나요

by xenophilius 2019.05.10

감성 분석 관련 글을 올리고 난 뒤 댓글로 가장 많이 받는 질문 중 하나입니다. 이메일 주소를 남기고 코드를 보내달라고 요청하시는 분이 많아서 간단하게 작성 해 보았습니다. 방법은 그렇게 복잡하지 않기에 댓글에 일일이 답변을 달고 있지만 여전히 같은 질문을 많이들 주셔서....

 

{'Neg': '1', 'Neut': '0', 'Pos': '0'}

코드는 간단합니다. polarity.csv를 열고 dictionary에 mapping 한 것 뿐입니다. key는 단어(string)이고 value는 부정, 중립, 긍정을 가지고 있습니다. 마지막 라인에서 '화재'의 값을 찾아보면 Neg가 1이군요. 전적으로 부정적인 단어라는 것을 알 수 있습니다. 위 코드를 기반으로 아래와 같은 코드를 작성 해 볼 수 있겠습니다.

 

여러분이 수집한 문서 또는 분석을 원하는 문서를 형태소 분리 했다고 가정하고 반복문을 돌면서 각 감성 수치를 합산합니다. 

 

시간이 나면 형태소 분석까지 완전한 example을 작성 해 보도록 하겠습니다. 그러나 이 코드만으로도 충분 할 것이라고 생각합니다. 또 이와 같이 단순 무식하게 합산한 방식은 제 실험, 경험상 결코 좋지 못하다는 것을 이전 글에서 밝힌 적이 있습니다. 분석 데이터가 많아 질수록 기대치와 근접하는 경향을 보이지만 대부분의 경우 좋은 결과를 보여주진 않았고 치명적인 문제가 아주 많습니다. 단지 이 코드는 어떻게 감성 분석에 접근 할 것인가, 어떻게 사람의 감정을 분석 할 것인가에 대해 생각 해 볼 수 있는, 첫 걸음이 될 수 있는 코드입니다.

 

이 글과는 전혀 다른 방식인 fasttext로 감성을 분석한 HART라는 API를 공개 해 두기도 했습니다. HART가 어떻게 학습 되었는지는 아래 글을 읽어보면 좋습니다. 아직 작성 중이긴 하지만....

 

https://rumo.tistory.com/110

댓글12

  • rladbstlr 2019.05.20 21:25

    import csv
    open_file ="C:\\down\\lexicon\\polarity.csv"
    table = dict()
    with open(open_file, 'r', encoding='utf-8') as polarity:
    next(polarity)
    # n gram Negative, Neutrual, Positive
    for line in csv.reader(polarity):
    key = str()
    for word in line[0].split(';'):
    key += word.split('/')[0]



    table[key] = {'Neg': line[3], 'Neut': line[4], 'Pos': line[6]}

    print(table['화재']['Pos'])

    from konlpy.tag import Komoran
    okt =Komoran()
    a="오랜만에 ITX열차 타고 귀가 중~ 깜깜하지만 2층 객차에서 보는 서울 밤 야경 좋으당ㅋㅋ 여행가는 기분"

    nouns =okt.morphs(a)


    for word in nouns:
    try:
    if table[word]:
    negative += table[word]['Neg']
    neutral += table[word]['Neut']
    positive += table[word]['Pos']
    except:
    KeyError

    이렇게 작성했는데요.. 그럼 저 문장이 긍정인지 부정인지 확인하려면 어떤 코드를 입력해야하나요,,
    답글

    • xenophilius 2019.05.20 21:28 신고

      "오랜만에 ITX열차 타고 귀가 중~ 깜깜하지만 2층 객차에서 보는 서울 밤 야경 좋으당ㅋㅋ 여행가는 기분"이 문장을 코모란으로 토크나이징 해 보니 polarity.csv와 매칭 될 수 있는 단어는 몇개 되지 않는 것 같습니다. 깜깜, 서울, 밤, 기분 정도가 매칭 될 수 있겠는데요. Neg 수치가 0이진 않는 것 같습니다. if table[i]: 라는 부분에서 실제로 key exist가 되는 noun가 있는지 한 번 print 해 보시면 될 것 같습니다.

    • xenophilius 2019.05.20 21:29 신고

      제가 답글 다는 사이에 원댓글이 수정 되었네요... 해당 문장의 Negative 수치와 Positive 수치를 비교 해 보시면 될 것 같습니다... HART로 분석 해 보면 약 60% 정도의 긍정적인 문장으로 판단됩니다.

  • rladbstlr 2019.05.20 22:08

    import csv
    open_file ="C:\\down\\lexicon\\polarity.csv"
    table = dict()
    with open(open_file, 'r', encoding='utf-8') as polarity:
    next(polarity)
    # n gram Negative, Neutrual, Positive
    for line in csv.reader(polarity):
    key = str()
    for word in line[0].split(';'):
    key += word.split('/')[0]



    table[key] = {'Neg': line[3], 'Neut': line[4], 'Pos': line[6]}


    print(table['화재']['Pos'])

    from konlpy.tag import Komoran
    okt =Komoran()
    a="오랜만에 ITX열차 타고 귀가 중~ 깜깜하지만 2층 객차에서 보는 서울 밤 야경 좋으당ㅋㅋ 여행가는 기분"

    nouns =okt.morphs(a)

    for word in nouns:
    try:
    if table[word]:
    negative += table[word]['Neg']
    neutral += table[word]['Neut']
    positive += table[word]['Pos']
    except:
    KeyError


    혹시 이 코드 그대로 사용하신건가요..?
    답글

    • xenophilius 2019.05.20 22:10 신고

      아니요 제가 Komoran을 설치하지 않아서 https://www.shineware.co.kr/products/komoran/ 여기서 토크나이징 해 봤습니다.

  • rladbstlr 2019.05.20 22:12

    for word in nouns:
    try:
    if table[word]:
    negative += table[word]['Neg']
    neutral += table[word]['Neut']
    positive += table[word]['Pos']
    except:
    KeyError

    그리고 이부분에서 negative ,neutral ,positive 가 다 빨간색으로 나옵ㄴ디ㅏ,,

    혹시 괜찮으시다면 저 문장의 전체 가중치를 구하는 코드가 추가되어야한다면 알려주시면 너무너무 감사하겠습니다,,,,
    답글

    • xenophilius 2019.05.20 22:15 신고

      negative, neutral, positive가 선언 된 적이 없어서 그런 것일 겁니다. 위에 먼저 선언 해 주시면 되겠습니다. 아직 python에 익숙하지 않으신 것 같은데 기본 문법을 먼저 배우는게... 크흠. 그리고 뭔가를 구하는 코드, 뭔가를 해 낼 수 있는 코드 같은건 없습니다. '코드'란 어떤 기능을 표방하는 것이 아닙니다. 그리고 가중치 관련해서는 코드 이야기를 한 것이 아니라 제가 만든 Hart API를 말한 것입니다. 아마 컴퓨터 소프트웨어 관련 학생은 아니신것 같으나 python과 코드의 개념에 대해 좀 더 알아야 할 필요가 있을 것 같습니다.

  • rladbstlr 2019.05.20 22:14

    import csv
    open_file ="C:\\down\\lexicon\\polarity.csv"
    table = dict()
    with open(open_file, 'r', encoding='utf-8') as polarity:
    next(polarity)
    # n gram Negative, Neutrual, Positive
    for line in csv.reader(polarity):
    key = str()
    for word in line[0].split(';'):
    key += word.split('/')[0]



    table[key] = {'Neg': line[3], 'Neut': line[4], 'Pos': line[6]}



    from konlpy.tag import Okt
    okt =Okt()
    a="오랜만에 ITX열차 타고 귀가 중~ 깜깜하지만 2층 객차에서 보는 서울 밤 야경 좋으당ㅋㅋ 여행가는 기분"

    nouns =okt.morphs(a)

    for word in nouns:
    try:
    if table[word]:
    negative += table[word]['Neg']
    neutral += table[word]['Neut']
    positive += table[word]['Pos']
    except:
    KeyError

    이코드를 작성하고 돌리고 print( negative)


    Traceback (most recent call last):
    File "C:\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3296, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
    File "<ipython-input-6-b1d241a3d10f>", line 1, in <module>
    negative
    NameError: name 'negative' is not defined

    라는 오류가 뜹니다.. ㅠㅠㅠㅠㅠㅠㅠㅠㅠ
    답글

  • rladbstlr 2019.05.20 22:19

    댓글 감사합니다.

    제가 파이썬은 처음 써봐서 아직 미숙한 부분이 많습니다..

    오류를 읽어보고 세가지 모두 0으로 초기화를 하고 여러가지 문장으로 코드를 돌려봐도

    세가지 모두 계속 0이 나와서 댓글을 남긴거였습니다..

    문제가 무엇인지 모르겠어서요..
    답글

  • rladbstlr 2019.05.20 22:39

    형변환 문제였던거 같습니다.
    딕셔너리 안에 값을 문자로 읽어오네요..
    답글 감사합니다 .
    블로그 도움 많이 받고갑니다.
    답글