파이썬 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
이와 같은 오류가 발생하는데 어떻게하면 될까요?
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
을 리턴하면,analyze
도None
을 리턴하고,None
이 이터러블이 아니니까, 에러메시지랑도 부합하고요.
댓글 입력