텍스트 마이닝에서 attention 스타일의 시각화는 더 평가되어야한다.

attention 바람의 시각화는, 좀더 평가되어야 한다고 생각했기 때문에 공유합니다.
오리지널의 구현은, 이하의 링크처에 있습니다.

【 self attention 】 쉽게 예측 이유를 가시화할 수 있는 문서 분류 모델을 구현한다
Qiita 기사:
htps : // 이 m/사이 k_m해/있어 ms/아 d95425b6773985에 f959
Github:
htps : // 기주 b. 이 m/n 116003/세 lf 있어 텐치 온-c ぁしふぃかちおん/bぉb/마s r/ゔぃ에 w_있음. py

또, 이 구현은, 이하의 책으로부터 발견했습니다.

만들면서 배운다! PyTorch에 의한 발전 딥 러닝
htps //w w. 아마존. 이. jp / dp / B07VPDV n KW / re f = dp kin d 0-re ct? _엔코엔 g=우 TF8&btkr=1

attention 바람의 시각화



오리지널을 참고로, 저쪽에서 다소, 함수에 수정을 더하고 있습니다.

def highlight(word, attn):
    "Attentionの値が大きいと文字の背景が濃い赤になるhtmlを出力させる関数"

    html_color = '#%02X%02X%02X' % (
        255, int(255*(1 - attn)), int(255*(1 - attn)))
    return '<span style="background-color: {}"> {}</span>'.format(html_color, word)

def mk_html(words, attns):
    html = ""
    for word, attn in zip(words, attns):
        html += ' ' + highlight(word,attn)
    return html + "<br><br>"

mk_html 함수에 단어 열과 점수 열을 입력하면 attention 스타일의 시각화 결과가 출력됩니다.
이번에는 샘플 데이터를 규칙 기반으로 만듭니다.

from janome.tokenizer import Tokenizer

t = Tokenizer()

# 対象文章
sentence = "すもももももももものうち"

# ルールベースでのスコア計算
import random 

words = []
attns = []

for token in t.tokenize(sentence):
    words.append(token.surface)
    if token.part_of_speech.startswith('名詞'):
        attns.append(0.6 + 0.2 * random.random())  # 0~1。1に近いほど赤くなる
    else:
        attns.append(0.2 + 0.2 * random.random())  # 0~1。1に近いほど赤くなる

print(words)
print(attns)


산출:
['스모모', '모', '모모', '모', '모모', '의', '우리']
[0.7397653917795854, 0.38089028798835384, 0.7423692670794249, 0.27461082771113776, 0.614260883381291

이 결과를 이용해, attention풍에, 텍스트 해석 결과를 가시화합니다.
from IPython.display import HTML
display(HTML(mk_html(words, attns)))

산출:


이런 느낌의 결과가 출력됩니다.

텍스트의 시험 해석 결과의 가시화에서는, WordCloud등을 이용하고 있었습니다만,
attention풍의 가시화도, 주목할 단어가 알기 쉽고, 개인적으로는 밀어줍니다.

통상, transformer나, BERT등에서 이용되는 가시화 표현입니다만, 단어열과 스코어열마저 작성할 수 있으면 적용할 수 있으므로, 꽤 응용 범위는 넓다고 느꼈습니다.

여러분도 꼭 시험해 보세요.

좋은 웹페이지 즐겨찾기