Day1 (9.28, 화)

본래 대회는 9.27 23:00 부터였으나, baseline 코드가 주어지지 않아 28일에 확인 후 진행하기로 하였다.

  • ❌Baseline 코드 돌려보기

  • ✔ 데이터 EDA 하기

  • ❌데이터 전처리하기

막상 데이터 셋을 받아보고 baseline 코드를 돌려보려 했으나, 생각만큼 잘 되지 않았다. 우선 baseline 코드가 tensorflow로 작성되어있었고, 버전에 따른 오류가 발생 + 우리가 사용할 hugging face등이 사용되지 않은 코드여서 사용할 수가 없었다.

우선 팀원들과 다음날까지 전처리를 하고 그에 대해서 서로 이야기 하는 시간을 가지기로 하였다. 전처리를 한다는게 어디까지 하는 걸 의미하는 건지 고민이 들었다.

  • 데이터에서 불필요한 정보를 제거하거나 유의미한 정보를 줄 수 있는 token을 추가해 주는 작업

  • 데이터를 토큰화 기법에 따라 토큰으로 만드는 작업

  • EDA 과정을 통해서 데이터 셋을 어떻게 활용해야 하는지에 대한 고민

내가 생각했을 땐 위에 3가지 정도가 전처리를 하는 작업이라는 생각이 들었다. 하지만 가장 큰 의문이 들었던 것이 "label이라고 할 수 있는 summary(요약, 정답) 데이터를 함께 전처리를 해주어야 하는지??" 생각 끝에 내릴 결론은 No 였다. 그 이유는 실제 test에 대한 summary도 train의 summary와 유사하게 되어있을 것이라는 생각 때문이었다. 만약 train의 summary에 한문이 있다면, test의 summary에도 한문이 있을 거기에 한문을 제거하면 안된다는 생각이었다. 위와 같이 결론을 내리고 두번째로 든 의문이 "summary에 있는 데이터는 text에서도 전처리로 제거하면 안된다?" 라는 생각이 들었다. 이 의문도 맞다는 생각이 들었고, 그럼 전처리로 어떤 작업을 해야할지 고민에 빠져들게 되었다. 생각보다 summary에 불필요하다고 생각했던 데이터들이 많이 그대로 포함하고 있었기 때문이다.

아직 pandas에 미흡하기도하고 데이터를 눈으로 보기 쉽고 익숙한 database를 사용해서 데이터를 조금 뜯어보기로 했다. mysql에 데이터를 넣고 이것저것 확인하다보니 요약이란 task인데 summary가 text보다 긴 경우가 있음을 확인할 수 있었다. "요약이란 text에서 중요하다고 생각되는 단어를 중심으로 summary를 만드는 것이 아닌가" 라고 생각하고 있었기에 너무 이상하다고 생각이 들었다. 멘토님께 이 의문에 대해 여쭈어 보게 되었고, 요약문을 생성하는 방식에 따라 extractive summarization(이하 ext)과 abstractive summarization(이하 abs)로 나누어 진다는 것을 알게 되었다. (Gudivada, 2018)

내가 생각한 것과 같이 text에서 핵심이 되는 단어를 바탕으로 요약하는것이 extractive summarization, 새롭게 문장을 생성해내는 것이 abstractive summarization 이고, 만약 주어진 데이터처럼 반이상이 summary의 길이가 더 길다면 이는 abstractive summarization일 것이다 라는 결론을 내릴 수 있었다.

이런 고민들을 하다보니 시간이 어느 덧 새벽 2시가 되어, 직접 코딩을 하거나 전처리를 하지는 못했던 하루가 되었다.

# 총 갯수
SELECT COUNT(*) FROM train_data
## 271,665

# summary 공백값
SELECT * FROM train_data
WHERE summary = ''
## id = [27556 34092 34201 66897 133273 216203]

# 길이 분석
SELECT 
  COUNT(*) AS 'total_cnt'
, SUM(CASE WHEN LENGTH(`text`) < LENGTH(summary) then 1 ELSE 0 END) AS 'summary_is_longer'
, SUM(case when LENGTH(`text`) >= LENGTH(summary) then 1 ELSE 0 END) AS 'text_is_longer'
FROM train_data
## 271,665건 / 140,741건 / 130,924건

# 중복 데이터 (text, summary 모두 중복)
SELECT SUM(CNT) FROM (
	SELECT COUNT(*) AS cnt FROM train_data
	GROUP BY `text`, summary
	HAVING COUNT(*) > 1
) T1
## 52건
SELECT * FROM train_data t1
INNER JOIN (
SELECT `text`, summary, COUNT(*) FROM train_data
GROUP BY `text`, summary
HAVING COUNT(*) > 1
) t2 ON t1.`text` = t2.`text` AND t1.summary = t2.summary
ORDER BY t1.`text`, t1.summary
## 대상 id
(16620 26389)(18329 18334)(25429 14908)(124425 124432)(7683 19722)(9585 7385)(19232 9589)
(3718 8795)(28104 28101)(28898 28901)(29454 29456)(72814 72840)(188731 188751)
(27915 27908)(27884 27883)(27877 27875 27909)(27897 27924 27898 27928 27913)
(22188 10354)(28391 28394)(30166 30168)(56703 56737)(187041 187123)(28903 28904)
(28088 28091)

# 중복 데이터 text 중복
SELECT SUM(CNT), COUNT(cnt) FROM (
	SELECT `text`, COUNT(*) AS cnt FROM train_data
	GROUP BY `text`
	HAVING COUNT(*) > 1
) T1
## 10,899건 / 5,276건
## 조회시간이 오래 걸리고 양이 많아 id 값 필요시 전달드리겠습니다.
SELECT * FROM train_data t1
INNER JOIN (
	SELECT `text`, COUNT(*) FROM train_data
	GROUP BY `text`
	HAVING COUNT(*) > 1
	) t2 ON t1.`text` = t2.`text` 
ORDER BY t1.`text`

다음에 학습시에 제거 혹은 고려해야할 만한 데이터에 대한 정리를 끝으로 오늘 하루를 마무리 하였다.

Last updated