파이썬 Mecab 문서-단어 행렬 실행시 오류발생 도와주시면 감사하겠습니다.

조회수 591회
import os 
import pandas as pd
def searchFiles(path):
    filelist = []
    filenames = os.listdir(path)
    for filename in filenames:
        file_path = os.path.join(path, filename)
        filelist.append(file_path)
    return filelist

def main():
    reviews = []
    for filePath in searchFiles('./Reviews/'):
        review = pd.read_csv(filePath, encoding = 'utf-8')
        reviews.append(review)
        docs = pd.concat(reviews, ignore_index=True)
        print(docs)

if __name__=='__main__':
    main()

현재구글 스토어 리뷰를 크롤링으로해 csv 파일 하나를 만들었고 csv파일을 데이터프레임은 위와 같은 코드로 성공했습니다. 이후 이제 전체 문서 집합에서 2번 이상 등장한 단어들을 대상으로 문서-단어 행렬을 구축을 위해 다음 코드를 실행하였습니다.

import MeCab
import os
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import matplotlib.pyplot as plt

def searchFiles(path):
    filelist = []
    filenames = os.listdir(path)
    for filename in filenames:
        file_path = os.path.join(path, filename)
        filelist.append(file_path)
    return filelist

def getNVM_lemma(text):
    tokenizer = MeCab.Tagger()
    parsed = tokenizer.parse(text)
    word_tag = [w for w in parsed.split("\n")]
    pos = []
    tags = ['NNG','NNP','VV','VA','VX','VCP','VCN', 'MAG']
    for word_ in word_tag[:-2]:
        word = word_.split("\t")
        tag = word[1].split(",")
        if(len(word[0]) < 2):
            continue
        if(tag[-1] != '*'):
            t = tag[-1].split('/')
            if(len(t[0])>1 and ('VV' in t[1] or 'VA' in t[1] or 'VX' in t[1])):
                pos.append(t[0])
            else:
                if(tag[0] in tags):
                    pos.append(word[0])
        return pos

def main():
    reviews = []
    for filePath in searchFiles('./Reviews/'):
        review = pd.read_csv(filePath, encoding = 'utf-8')
        reviews.append(review)
    docs = pd.concat(reviews, ignore_index=True)
    tf_vect = CountVectorizer(tokenizer=getNVM_lemma, min_df=2)
    dtm = tf_vect.fit_transform(docs['내용'])

if __name__ == '__main__':
    main()

이때

Traceback (most recent call last):
  File "C:/Users/chlwn/PycharmProjects/untitled1/cos pro 2/2.py", line 71, in <module>
    main()
  File "C:/Users/chlwn/PycharmProjects/untitled1/cos pro 2/2.py", line 68, in main
    dtm = tf_vect.fit_transform(docs['내용'])
  File "C:\Users\chlwn\PycharmProjects\untitled1\venv\lib\site-packages\sklearn\feature_extraction\text.py", line 1199, in fit_transform
    self.fixed_vocabulary_)
  File "C:\Users\chlwn\PycharmProjects\untitled1\venv\lib\site-packages\sklearn\feature_extraction\text.py", line 1110, in _count_vocab
    for feature in analyze(doc):
TypeError: 'NoneType' object is not iterable

Process finished with exit code 1

이와 같은 오류가 발생하는데 어떻게하면 될까요?

  • docs pd.concat 하는 코드 부분부터 for 문 안이 아니라, 밖에서 해야 하는 것 아닐까요? nowp 2020.6.22 19:33
  • 수정하기전에 잘못올렸습니다 말씀하신 바와 같이 수정한 후에도 똑같은 오류가 발생하고 있습니다. 최준호 2020.6.22 20:02

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    제 생각에 가장 확률이 높은 원인을 추측해서 답변 달아요.

    • docs['내용'] 중에서 NaN 인 row가 있을 것 같아요.
    • docs['내용'].isna() 를 한번 보면, True 인 게 있겠죠.
    • 이게 이렇게 나올려면, csv 파일 중에서 내용 컬럼명이 잘못된 파일이 있거나, 아주 이상한 파일이 있거나 할 것 같고요.
    • 임시적으로 문제를 피해가려면, docs['내용'].fillna("") 같이 None인 데이터를 빈문자열로 바꾸어 주거나 하는 방법이 있을 듯 하고요.

    다시 보니, 위 답변은 에러메시지랑도 부합하지 않네요. analyze(doc) 이 None 이라고 했지, doc이 None 이라고 불평하지는 않은 거니까...

    다시 봤습니다.

    getNVM_lemma 함수에서도 마지막 return pos 인덴트가 잘못되어 있네요. 이게 텍스트뭉탱이에서 단어들을 쪼개주는 함수로 주어지잖아요. 그런데, for 루프에서 continue 조건으로만 쭉 돌다가, for 문 나가면, 마지막에 return 무엇 이 없어서, 디폴트로 함수가 None 리턴하겠습니다. pylint 같은 거 썼으면, 아마 알려줬을 것 같아요.

    이 함수가 아마도 analyze 함수 안에서 한 단계 처리를 담당할 텐데, None 을 리턴하면, analyzeNone 을 리턴하고, None이 이터러블이 아니니까, 에러메시지랑도 부합하고요.

    • 다 확인해봤는데 NaN인 값은 없네요..혹시 몰라 docs['내용'].fillna("")도 해봤는데 같은 문제이고 내용 칼럼도 제대로 되어있는데 문제가 뭘까요? ㅠ 최준호 2020.6.23 16:43

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

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

(ಠ_ಠ)
(ಠ‿ಠ)