(수정) 불용어를 삭제하는 코드를 실행하자 데이터가 사라져버리는 문제

조회수 387회

안녕하세요, 제가 앞서 질문한 내용을 통해 불용어 삭제 코드를 수정하여 실제로 불용어가 삭제되는 결과를 받을 수 있었습니다.

그런데 코드를 돌리다보니, 불용어를 삭제하자 데이터가 반절 이상 날아가버리는 것을 확인할 수 있었습니다.

코드 쭉 보여드리겠습니다.

import konlpy
import re

def tokenize_korean_text(text):
    text = re.sub(r'[^,.?!\w\s]','', text)

    okt = konlpy.tag.Okt()
    Okt_morphs = okt.pos(text)

    words = []
    for word, pos in Okt_morphs:
        if pos == 'Verb' or pos == 'Noun':
            words.append(word)

    return words


tokenized_list = []

for text in df['Keyword']:
    tokenized_list.append(tokenize_korean_text(text))

print(len(tokenized_list))
print(tokenized_list[1800])

여기까지 실행하면 결과가 나와서, tokenized_list는 1800줄의 데이터가 있음을 알 수 있습니다. 아래는 그 결과입니다.

1832
['오늘날', '국가', '환경', '부정', '상태', '개선', '구성원', '각자', '환경', '이익', '대한']

코드를 계속 실행합니다.

drop_corpus = []

for index in range(len(tokenized_list)):
    corpus = tokenized_list[index]
    if len(set(corpus)) < 3:  
        review_df.drop(index, axis='index', inplace=True)
        drop_corpus.append(corpus)

for corpus in drop_corpus:
    tokenized_list.remove(corpus)

df.reset_index(drop=True, inplace=True)

바로 아래가 불용어 삭제 코드입니다.

stopwords = ['입니다','있습니다','우리','할','수','하는','합니다','여러분']

clean_words = []
for i in tokenized_list:
    a = 0
    for ii in stopwords:
        if ii in i:
            a += 1
    if a < 1:
        clean_words.append(i)

여기서 print(clean_words[991]) 를 실행하면

IndexError: list index out of range

991번째 데이터는 없다고 나오고, 실제로 결과값을 저장했을때도 990번째 데이터까지만 저장됩니다. 나머지 데이터가 전부 날아간 듯 합니다.

어떻게 코드를 수정해야 하는 것일지요?

  • 문제가 없어 보이는데요. 검사 결과 990개 데이터만 걸러냈으니 990개만 추출되는 것 아닙니까? 초보자 2022.6.10 16:40
  • 아뇨, 리스트 데이터라서 리스트 안의 불용어는 사라졌다고 해도 나머지 단어들이 있어서 리스트 자체가 삭제되면 안됩니다. 참고하실 수 있도록 질문 본문에 데이터를 표시했습니다. Honeybee 2022.6.10 17:05
  • 무슨 소리를 하고 싶은건지 전혀 모르겠는데요. 정작 리스트 요소 삭제는 안된다면서 이미 리스트 요소 삭제 명령은 들어가있고, 정작 확인하는 리스트는 마지막에 걸러낸 요소들만 담아놓는 리스트인데 대체 뭐가 삭제됐다는거죠? 초보자 2022.6.10 17:12
  • 데이터 형식이 1 ['가', '나', 다] 2 ['라', '마', '바'] 와 같은 헝식인데, stopwords를 '나'와 '바'로 설정해서 결과값이 1 ['가', '다] 2 ['라', '마'] 가 되어야 한다는 의미입니다. Stopwords 가 들어가있다고 그 줄의 데이터를 지워버리는 것이 아니라 그 stopwords만 제외하고 나머지 단어들은 return 해야 합니다. Honeybee 2022.6.10 17:16
  • 그래서 실제로는 어떤 것들이 남는데요? input 예시가 있으면 그걸로 끝이 아니라 현재 output 예시는 어떻고, 이게 자신의 생각으로는 어떻게 되어야 한다까지 나와있어야 맞는 것 아닐까요? 초보자 2022.6.10 17:17
  • 제일 이해가 안 가는 건 원본 리스트는 tokenized_list 인데 왜 clean_words 보고 원본 리스트라고 생각하는 거죠? 초보자 2022.6.10 17:25
  • 제가 밖이라서 input output 예시는 바로 올려드리지 못하는 점 양해 구합니다. Tokenized list는 말그대로 토큰화된 단어들 리스트고, 여기서 불용어(stopword)를 한번 제거해야 전처리가 끝나서 모델에 투입할 수 있습니다. Clean words가 바로 그 전처리 완료된, 모델에 실질적으로 투입되는 데이터리스트라서 그렇습니다. 위에 말씀드렸다시피 데이터가 단어의 집합으로 되어있기 때문에, 지정한 단어만 삭제하고 나머지 단어들은 데이터에 계속 있어야 합니다. 그래서 데이터 안의 단어 수는 줄어도 데이터 자체의 갯수는 줄어들 수가 없습니다. 위에 예제드린것처럼 1 [가 나 다] // 2[라 마 바] 에서 나와 바를 지워도 1[가 다] // 2[라 마]로 데이터 갯수(줄 수)는 여전히 2줄인것처럼요 Honeybee 2022.6.10 17:38
  • 잘못 봤네요. 원본 리스트는 df['Keyword']네요. 초보자 2022.6.10 17:44
  • 다시 한 번 잘 생각해보세요. 본인이 지금 하고 있는 작업이랑, 본인이 원하는 작업이랑, 본인이 어떤 말을 하고 있는지. 제 생각에는 본인이 원하는 작업이랑 전혀 다른 설명을 하고 있습니다. 초보자 2022.6.10 17:46

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)