[Python] TextRank 구현 코드

Posted by 적분 ∫2tdt=t²+c
2017.04.20 17:13 프로그래밍

앞선글(TextRank 기법을 이용한 핵심 어구 추출 및 텍스트 요약) 에서 텍스트 랭크 알고리즘을 소개하면서 직접 실험해보고자 파이썬 코드를 짰었는데요, 정리해서 공유해드립니다. 페이지랭크 계산에 networkx 패키지를 사용하므로, networkx가 설치되어있는지 확인부탁드립니다.


* 의존 패키지: networkx





사용법은 어렵지 않습니다. 다음과 같이 쓰면 됩니다.

TextRank 생성자는 인수로 window, coef, threshold를 받습니다.

* window : 문맥으로 사용할 단어의 개수. 기본값 5로 주면 특정 단어의 좌우 5개씩, 총 10개 단어를 문맥으로 사용합니다.

* coef : 동시출현 빈도를 weight에 반영하는 비율입니다. 기본값은 1.0로, 동시출현 빈도를 weight에 전부 반영합니다. 0.0일 경우 빈도를 반영하지 않고 모든 간선의 weight을 1로 동일하게 간주합니다.

* threshold: 문서 요약시 관련있는 문장으로 여길 최소 유사도값. 기본값은 0.005이고, 이 값보다 작은 유사도를 가지는 문장쌍은 관련없는문장으로 처리합니다.


문서요약시에는 loadSents로 문장을 읽어들이고, summarize로 결과를 얻습니다.




키워드 추출시에는 load로 문장을 읽어들이고, extract로 키워드를 추출합니다.




이 댓글을 비밀 댓글로
  1. 감사합니다!
  2. 좋은 글 감사합니다 !! 정말 큰 도움이 되었습니다 !! ㅎㅎ
    코드를 실행해보고싶은데

    Traceback (most recent call last):
    File "C:/Users/user1/PycharmProjects/untitled12/tr.py", line 186, in <module>
    tr.loadSents(RawSentenceReader('test2.txt'), lambda sent: filter(lambda x:x not in stopword and x[1] in ('NNG', 'NNP', 'VV', 'VA'), tagger.pos(sent)))
    File "C:/Users/user1/PycharmProjects/untitled12/tr.py", line 107, in loadSents
    for sent in filter(None, sentenceIter):
    File "C:/Users/user1/PycharmProjects/untitled12/tr.py", line 26, in __iter__
    for line in open(self.filepath, encoding='utf-8'):
    File "C:\Program Files\Anaconda3\lib\codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte

    이러한 에러가 발생하는데 .. 해결방법을 모르겠어서 도움 얻고자 이렇게 댓글 남깁니다 .....!! ㅠㅠ
    답변 주시면 감사하겠습니다 !!
    • 인코딩 에러네요.
      입력파일이 utf-8로 인코딩이 되었는지 확인해보시길 바랍니다!
    • junsama
    • 2018.02.23 17:07 신고
    너무 잘 보고 저희 회사에서 꼭 필요한 내용입니다. 감사합니다.
    python이 초보라 이것저것 옵션 설치하고 돌렸는데 아래와 같은 오류 메시지가 나와서요~

    도와주세요 ㅠㅠ

    ===================================================================

    Load...
    Traceback (most recent call last):
    File "D:\MK\10. python\textrank.py", line 191, in <module>
    tr.load(RawTaggerReader('test2.txt'), lambda w: w not in stopword and (w[1] in ('NNG', 'NNP', 'VV', 'VA')))
    File "D:\MK\10. python\textrank.py", line 52, in __init__
    from konlpy.tag import Komoran
    File "C:\Users\junsam\AppData\Local\Programs\Python\Python36-32\lib\site-packages\konlpy\__init__.py", line 15, in <module>
    from . import tag
    File "C:\Users\junsam\AppData\Local\Programs\Python\Python36-32\lib\site-packages\konlpy\tag\__init__.py", line 4, in <module>
    from ._hannanum import Hannanum
    File "C:\Users\junsam\AppData\Local\Programs\Python\Python36-32\lib\site-packages\konlpy\tag\_hannanum.py", line 7, in <module>
    import jpype
    ModuleNotFoundError: No module named 'jpype'
    • konlpy가 제대로 설치되지 않은것 같습니다.
      http://konlpy.org/ko/v0.4.3/install/
      위 사이트를 참조하셔서 다시 한번 설치해보시길 추천드립니다.
    • junsama
    • 2018.02.23 18:25 신고
    감사합니다~
    다시 설치하니 잘 됩니다.
    한가지 더 질문이요~ 소스중에 아래와 같은 소스가 있는데..
    이게 무슨뜻인지 설명해주시면 정말 감사하겠습니다..

    tr.load(RawTaggerReader('test2.txt'), lambda w: w not in stopword and (w[1] in ('NNG', 'NNP', 'VV', 'VA')))
    • TextRank 클래스의 load 메서드는 첫번째 인자로 sentenceIter를 받고, 두번째 인자로 wordFilter를 받습니다.

      RawTaggerReader는 파일로부터 문장을 읽어들여 형태소 분석을 하여 돌려주는 iterator입니다.
      lambda w~ 부분은 stopword에는 포함되어있지 않으며, 품사는 NNG, NNP, VV, VA만 선택하여 분석에 사용하라고 단어를 필터링해주는 역할을 합니다.