Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

'import boilerpipe' causes 'TypeError: Package kr.lucypark.jhannanum.comm.HannanumInterface is not Callable' #66

Open
krkhnh opened this issue Jul 16, 2015 · 4 comments

Comments

@krkhnh
Copy link

krkhnh commented Jul 16, 2015

OS: Windows 7
Language: Python 2.7.10
IDE: PyCharm Community Edition 4.5.3

Example code:

# coding=utf-8
from __future__ import division
from __future__ import unicode_literals
from konlpy.tag import Hannanum, Twitter, Komoran
from collections import Counter
from boilerpipe.extract import Extractor



class KoNLP:
    def __init__(self):
        pass

    # @staticmethod
    # def get_tags(text, ntags=50, multiplier=10):
    #     h = Hannanum()
    #     nouns = h.nouns(text)
    #     count = Counter(nouns)
    #     return [{'color': color(), 'tag': n, 'size': c * multiplier} \
    #             for n, c in count.most_common(ntags)]

    @staticmethod
    def word_count(text):
        words_min_size = 2
        h = Hannanum()
        nouns = h.nouns(text)
        nouns = [noun for noun in nouns if len(noun) >= words_min_size]

        count = Counter(nouns)

        # print count
        return count


if __name__ == '__main__':
    konlp = KoNLP()
    tags = konlp.word_count('''그리스 사태가 어디로 흐를지, 불확실성이 커지면서 금융시장은 불안한 모습입니다.

주가, 유가는 떨어졌고 금값은 올랐습니다.

뉴욕 이언주 특파원입니다.

◀ 리포트 ▶

그리스 채권 최대 보유국인 독일 증시는 1.5%, 2위 보유국인 프랑스 증시는 2% 밀렸습니다.

장중 백 포인트 이상 떨어지며 출렁였던 뉴욕 다우지수는 지난 주말보다 46포인트 하락한 17,683으로 마감됐습니다.

등락을 거듭했던 나스닥 지수는 0.34%, S&P 지수는 0.39% 하락했습니다.

그리스 국민투표 이후 구제금융 재협상이 어떻게 전개될지 불확실성이 커지면서 투자 심리가 위축된 탓입니다.

유로존 경기 침체 우려로 국제유가도 하락해, 8월 인도분 서부 텍사스산 원유는 지난 주말보다 7.7% 떨어진 배럴당 52.53 달러로 지난 4월 이후 최저치를 기록했습니다.

반면 안전 자산인 금값은 온스당 1,173달러로 1% 가까이 올랐습니다.

[엘르 케플란/경제분석가]
"너무 많은 불확실성 때문에 세계적으로 주식을 매도하고 있습니다. 반면 안전 자산으로 몰리고 있습니다."

국제통화기금, IMF는 "그리스 상황을 면밀하게 관찰하고 있으며, 지원 요청이 오면 도울 준비가 돼있다"고 밝혔습니다.

또, 미국 백악관은 그리스가 경제 성장의 길을 걸으면서 유로존을 탈퇴하지 않도록 타협할 것을 그리스와 유럽연합 지도부에 촉구했습니다.

뉴욕에서 MBC뉴스 이언주입니다. ''')

    for tag in tags:
        print(tag)

Error msg:

Traceback (most recent call last):
  File "D:/Hans/CNTT/150323_onlineTrendAnalysisSolution/pycharm/program/konlp/konlp.py", line 63, in <module>
    뉴욕에서 MBC뉴스 이언주입니다. ''')
  File "D:/Hans/CNTT/150323_onlineTrendAnalysisSolution/pycharm/program/konlp/konlp.py", line 24, in word_count
    h = Hannanum()
  File "D:\Anaconda\lib\site-packages\konlpy\tag\_hannanum.py", line 103, in __init__
    self.jhi = HannanumInterfaceJavaClass() # Java instance
  File "D:\Anaconda\lib\site-packages\jpype\_jpackage.py", line 55, in __call__
    raise TypeError("Package {0} is not Callable".format(self.__name))
TypeError: Package kr.lucypark.jhannanum.comm.HannanumInterface is not Callable

If I remove 'from boilerpipe.extract import Extractor', the error dosen't occur and works well.

한글로 답변주셔도 됩니다.

@e9t
Copy link
Member

e9t commented Jul 16, 2015

안녕하세요. 확인해보니 boilerpipe 도 JPype1을 dependency로 쓰는 라이브러리군요.

제가 지금 밖이라 boilerpipe의 내부를 자세히 보지는 못했지만, 두 패키지에서 JPype1를 동시에 호출하고 작동시키면서 뭔가 충돌이 발생하는 것 같습니다.

혹시 라이브러리 로딩 순서를 아래와 같이 바꾸면 어떻게 되는지 확인해주실 수 있나요?

from __future__ import division
from __future__ import unicode_literals
from collections import Counter
from boilerpipe.extract import Extractor
from konlpy.tag import Hannanum, Twitter, Komoran

@e9t e9t changed the title 'import boilerpipe' cause 'TypeError: Package kr.lucypark.jhannanum.comm.HannanumInterface is not Callable' 'import boilerpipe' causes 'TypeError: Package kr.lucypark.jhannanum.comm.HannanumInterface is not Callable' Jul 16, 2015
@krkhnh
Copy link
Author

krkhnh commented Jul 16, 2015

여전히 에러가 납니다.

@e9t
Copy link
Member

e9t commented Jul 17, 2015

안녕하세요. 문제를 확인해봤습니다.
konlpy와 boilerpipe 모두, 다른 라이브러리들이 jpype를 사용할거라는 가능성을 고려하지 않아서 발생한 문제네요.

boilerpipe는 import시 jvm을 구동하고 konlpy는 클래스 메소드 실행시 lazy하게 jvm 구동하기 때문에, 스크립트 상단에서 import 문을 모두 선언하는 경우 konlpy가 필요한 classpath들을 로딩하지 못하게 되니까 exception이 발생하게 됩니다. (만일 konlpy로 문서를 다 처리한 후 boilerpipe를 import하면 반대로 boilerpipe 쪽에서 문제가 발생하게 됩니다.)

이 버그는 당장 quick fix하기는 어려워서 조금 시간을 두고 해결해야할 것 같은데, 불편하시겠지만 당분간은 boilerpipe와 konlpy를 각자 다른 프로세스로 돌려주시면 감사하겠습니다. 이 문제는 boilerpipe 측에도 전달하도록 하겠습니다.

@e9t
Copy link
Member

e9t commented Nov 14, 2016

This issue may be resolved via thread related methods in JPype. (See #85 (comment))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants