이 판결문의 '성인지 감수성 점수'는 N점입니다!
Awesome summary
- 1. 사용 데이터
- 2. 어떤 기준으로 '성인지 감수성'을 평가할 것인가?
- 3. 판결문의 '성인지 감수성'을 어떻게 지수화할 것인가?
- 4. 성인지 감수성 지수 성능을 어떻게 평가할 것인가?
- 5. Summary
이 프로젝트는 @레이첼 외 1인과 함께 한 것임을 밝힙니다.
판결문의 성인지 감수성 탐지 프로젝트는 n번방 사건을 접하며 시작했다.
n번방은 판결을 먹고 자랐다
성범죄 솜방망이 처벌이 심각하다
판사들은 방조자와 다름없다
사회 곳곳에서 위와 같은 목소리가 쏟아졌다. 물론 법조계 내부에서도 예외는 아니었다. '강간 문화'를 간과하는 나의 법관 동료들에게라는 글이 시사인에 실리기도 했다.
이런 뉴스를 접하고 궁금증이 생겼다.
n번방은 정말 판결문을 먹고 자란걸까? 법원의 성인지 감수성이 정말 심각한 수준인가? 혹시 몇몇 나쁜 사례가 언론을 통해 ‘과대표'된 건 아닐까? 법원의 성인지 감수성은 정말 낮을까?
궁금증을 풀기 위해 성폭력범죄 판결문을 직접 들여다봤습니다. 그리고 그 분석 결과를 ‘성인지 감수성 지수'로 나타내보았다.
위 세 가지 기준을 참고해 성인지 감수성이 낮은 판결문 8개를 선정, 기준으로 삼았다.
3. 판결문의 '성인지 감수성'을 어떻게 지수화할 것인가?
IF-IDF 알고리즘을 이용한다.
from google.colab import drive
drive.mount('/content/drive')
import csv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import re
data = pd.read_csv('/content/drive/Shareddrives/텍스트마이닝_씨스루조/data/final(noJudge).csv')
data = data[['사건번호', '법원명', '날짜', '죄명', '주문', '이유']]
data.head(3)
bad_cases = [' 96도791', '95도2914', '2019누10176', '2008고합220', '2009고합6', '2018노3606', '2015노1180', '2018노2855']
bad_list = list()
for i, row in data.iterrows():
for number in bad_cases:
if number in row['사건번호']:
bad_list.append(row['이유']) # 판결문의 '이유' 부분에 판결 요지 등이 담겨 있으므로 이 부분을 분석한다.
# 이를 위해서는 먼저 colab에 mecab을 설치해야 한다
%%bash
apt-get update
apt-get install g++ openjdk-8-jdk python-dev python3-dev
pip3 install JPype1
pip3 install konlpy
%env JAVA_HOME "/usr/lib/jvm/java-8-openjdk-amd64"
%%bash
bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)
pip3 install /tmp/mecab-python-0.996
data.head(2)
def pre_process(text):
'''
문자열을 받아 형태소 분석을 한 후, 명사형과 동사형만 필터링한다.
'''
import konlpy
from konlpy.tag import Kkma, Komoran, Hannanum, Okt
from konlpy.utils import pprint
from konlpy.tag import Mecab # 형태소 분석기로 Mecab 사용
sent_tag = list() # 형태소 태그를 담을 리스트
words = str() # 특정 형태소만 필터링한 단어들만 남길 문자열
mecab = Mecab()
morph = mecab.pos(text)
sent_tag.append(morph)
for sent in sent_tag:
for word, tag in sent:
if tag in ['NNP', 'NNG', 'VV']: # 명사형 및 동사형만
words += word
words += ' '
return words
processed_bad_list = list() # 전처리를 마친 데이터가 담길 리스트
for case in bad_list:
processed = pre_process(case)
processed_bad_list.append(processed)
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer() # TF-IDF 객체 선언
tfidf_vectorizer.fit(processed_bad_list) # 단어를 학습시킴
bad_array = tfidf_vectorizer.transform(processed_bad_list).toarray() # TF-IDF를 이용해 단어 가중치가 적용된 숫자 벡터를 어레이 형태로 보자
bad_array
def cos_sim(doc1, doc2):
'''
코사인 유사도로 doc1과 doc2간 유사도를 구한다.
'''
from sklearn.metrics.pairwise import linear_kernel
result = linear_kernel(doc1, doc2)
return result
def mean_sim(doc_list, target):
'''
문서간 유사도 평균 구하기
'''
temp = 0
n = 1
for doc in doc_list:
temp += cos_sim(doc, target)
n += 1
return temp/len(doc_list)
그 결과 판결문 3개를 제외하고 나머지 7개 판결문은 비슷한 점수가 나왔다. 왼쪽은 문서간 유사도를 통해 산출한 성인지 감수성 점수이고 오른쪽은 연구자들이 직접 매긴 점수의 평균이다.
꽤 잘 들어맞는다!