[02.08] 법원 판례 데이터 자연어처리

2024. 2. 8. 12:13데이터 및 AI

원본 데이터 

930MB라 올리진 못하겠다..

import pandas as pd

# plt.style.use('seaborn')
# plt.rcParams['figure.figsize'] = [14,14]

# 데이터 불러오기
path = (r'C:\Users\bluecom011\Desktop\Sesac_AI\7주차\02.07\judicial_precedent_All_encoding.csv')
df = pd.read_csv(path)[:3000]
df.head()
# df.tail()

결과값헤드

 

df,info()로 정보보기

 

object인 컬럼만 골라보기

#df. info의 type이 object인 자료만 걸러냄
object_columns = df.select_dtypes(include=['object']).columns
object_columns

 

결과값

 

필드 만들기

field = object_columns[-1]
print(field)
len(df[field].value_counts()),df[field].value_counts()

결과값

【이 유】이후 값만 추출하기

split()이용하면 간단히 가능하다

#이유 이후만 추출하기 split하기
import re
# 주어진 DataFrame에서 첫 번째 판례내용을 가져옵니다.
content = df['판례내용'][0]
# '[이유]' 이후의 내용을 정규표현식을 사용하여 추출합니다.
reason = re.search(r'\【이    유】 \s*(.*)', content)
# 만약 '[이유]' 이후의 내용을 찾았다면 해당 내용을 출력합니다.
if reason:
    reason_content = reason.group(1)
    print(reason_content)
else:
    print("'【이    유】' 이후의 내용을 찾을 수 없습니다.")

 

판례내용과 이유를 df로

tmpList=[]
for x in df['판례내용']:
    try:
        tmpList.append(x.split('【이    유】')[1]) # 1번 인덱스가 이유 이므로 [1] 해줘야함
    except:
        tmpList.append('Nan')
######
df['이유']=tmpList
df.iloc[:,-2:].head()

 

결과값

df.head()로 보면 이유 컬럼이 추가되어 있다

 

카테고리별로 갯수보기

#카테고리별
cate = []
for field in object_columns:
    value_counts = df[field].value_counts()
    print(field, '-->', len(value_counts))
    if len(value_counts) < 40:
        cate.append(field)

 

konply  형태소 분석기 종류

  1. Hannanum
    • KAIST Semantic Web Research Center 개발.
    • 띄어쓰기가 없는 문장에서 분석 품질이 좋지 않아 정제되지 않은 문서에서의 형태소 분석을 할 시 정확도가 높지 않다.
  2.  Kkma
    -서울대학교 IDS(Intelligent Data Systems) 연구실 개발.
    -띄어쓰기 오류에 덜 민감한 형태소 분석기이다.
    -분석 기간이 가장 오래 걸리고 정제되지 않은 문서에 대한 형태소 분석의 정확도가 높지 않다.
  3. Komoran
    -Shineware에서 개발.
    -여러 어절을 하나의 품사로 분석이 가능해 적용 분야에 따라 공백이 포함된 단어를 더 정확하게 분석 가능하다.
    -자소가 분리된 문장이나 오탈자에 대해서도 분석 품질이 좋다
    -다른 형태소 분석기에 비해 로딩 시간이 길지만 분석속도는 빠르다.
    -띄어쓰기가 없는 문장을 분석하는데 좋지 않다.
    1. Mecab
      • 일본어용 형태소 분석기를 한국어를 사용할 수 있도록 수정하였다.
      • 형태소 분석기임에도 불구하고 띄어쓰기 구분의 오류나 공개 소스를 구하기 어려운 등의 문제에 대한 기여를 고민하는 차원에서 시작된 은전한닙(mecab) 프로젝트이다.
      • 새로운 사전을 추가할 수 있다.
      • 띄어쓰기에서 성능과 정확도 모두 좋은 성능을 보여준다.
      • 미등록어의 처리나 동음이의어의 처리문제에 취약하다.
  4. Okt(Open Korean Text)
    오픈 소스 한국어 분석기로, 과거 트위터(Twitter) 형태소 분석기이다.
    다른 형태소 분석기와 달리 유일하게 어근화(stemming)기능을 제공한다.
    이모티콘이나 해쉬태그왁 같은 인터넷 텍스트에 특화된 범주도 분석 가능해 비표준어, 비속어 등이 많이 포함되어 있는 정제되지 않은 데이터에 대해서 강점을 가진다
    미등록어의 처리나 동음이의어 처리가 어렵고 분석 범주가 다른 형태소 분석기에 비해 적다

위 다섯개의 형태소들은 공통적으로 nouns, morphs, pos 메서드를 제공한다.

nouns : 주어진 문장의 명사를 추출하는데 사용
morphs : 주어진 문장의 형태소를 추출하는데 사용
pos : 주어진 문장의 형태소와 각 단어의 품사를 식별하여 태그를 추가해 함께 출력

 

 

pos 메서드 같은 경우는 형태소 분석기마다 받는 인자가 조금씩 다르다.

  • Hannanum.pos(phrase, ntags = 9, flatten = True)
  • Kkma.pos(phrase, flatten = True)
  • Komoran.pos(phrase, flatten = True)
  • Mecab.pos(phrase, flatten = True)
  • Okt.pos(phrase, norm = False, stem = False

Okt를 사용했고, '이유' 컬럼에서 명사(nouns)만 추출

형용사나 부사도 가능 

####### 이거가 명사 추출
from konlpy.tag import Okt
import re
from tqdm import tqdm
tokensList = []

# Initialize Okt tokenizer
okt = Okt()

# Assuming 'df' is a pandas DataFrame and it has a column named 'text_column' containing the texts
for text in tqdm(df['이유']):
    tokens = okt.nouns(text)
    tokensList.append(tokens)

 

최종 정리코드후 csv로 저장하기

from konlpy.tag import Okt
import pandas as pd
from tqdm import tqdm

# 한글 형태소 분석기 초기화
okt = Okt()
# 빈 데이터프레임 생성
combined_df = pd.DataFrame(columns=['이유', 'str','사건종류명'])
# 주어진 데이터프레임의 특정 범위에 대해 작업 수행
for i in range(2000):  # 0부터 1000까지의 인덱스를 반복
    text = df['판례내용'][i]  # 해당 인덱스의 '판례내용' 텍스트를 가져옴
    # '이유'라는 단어의 인덱스 찾기
    reason_index = text.find('【이    유】')
    # '이유' 이후의 내용 가져오기
    reason_text = text[reason_index + len('【이    유】'):]
    # 명사만 추출하여 토큰화
    nouns = okt.nouns(reason_text)
    nouns_text = ' '.join(nouns)
    # 추출된 내용을 데이터프레임에 추가
    combined_df = combined_df.append({'판례내용': text, '이유': reason_text, 'str': nouns_text,'사건종류명': df['사건종류명'][i]}, ignore_index=True)
# CSV 파일로 저장
combined_df.to_csv('reason2_text.csv', index=False, encoding='utf-8-sig')

 

메모리 사용으로 인해 다운될 수 있어, csv로 새로 저장하는것

저장한 파일을 불러와보

#새로저장한 csv불러오기
import pandas as pd
df_result = pd.read_csv(r'C:\Users\bluecom011\Desktop\Sesac_AI\7주차\02.07\reason_text.csv')
df_result.head()

 

2. 사용자가 질문한 사건과 유사한 판례 추천하기

str과 사용자 질문을 TF-IDF 벡터화 시켜서 코사인 유사도를 계산하여 유사한 판례 찾기

여기서는 유사도가 높은 상위 5개판례만 추천하도록함

 

코사인 유사도란?

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 판례 데이터를 불러옵니다.
df = pd.read_csv(r'파일경로')

# TF-IDF 벡터화를 위한 객체 생성
vectorizer = TfidfVectorizer()

# 텍스트 데이터를 TF-IDF 행렬로 변환
tfidf_matrix = vectorizer.fit_transform(df['str'])

# 사용자 입력을 받습니다.
user_question = input("질문을 입력하세요: ")

# 사용자 입력을 TF-IDF 벡터로 변환
user_tfidf = vectorizer.transform([user_question])

# TF-IDF 벡터 간의 코사인 유사도를 계산하여 유사한 판례를 찾습니다.
similarities = cosine_similarity(user_tfidf, tfidf_matrix)

# 코사인 유사도가 높은 순으로 정렬하여 상위 5개 판례의 인덱스와 유사도를 찾습니다.
most_similar_indices = similarities.argsort(axis=1)[0][-5:][::-1]
most_similar_values = similarities[0, most_similar_indices]

# 상위 5개 유사한 판례와 해당 유사도를 출력합니다.
print("상위 5개 유사한 판례 및 유사도:")
for idx, sim_value in zip(most_similar_indices, most_similar_values):
    recommended_case = df.loc[idx]
    print("유사도:", sim_value)
    print(recommended_case)

 

입력을 '매매' 로 받아서 매매와 유사한 판례 5개가 추천되었다.

결과값