최근 airflow로 batch작업을 이관 하던 중 dataframe을 DB로 바로 저장할 수 있는 라이브러리를 찾아서 소개시켜드립니다.

 

insert문을 실행하지 않고 python으로 생성한 dataframe을 DB로 저장 시킵니다.

from sqlalchemy import create_engine
import pandas as pd

#test.csv를 dataframe형태로 읽기
df = pd.read_csv('test.csv')

#mysql+pymysql은 mairaDB에 대한 sqlalchemy의 드라이버를 의미합니다.
#SQLite 데이터베이스는 mysql+pymysql대신 sqlite를 적어주시면 됩니다.
connection_string = 'mysql+pymysql://유저명:password@localhost:3306/database'

#mariadb에 연결
engine = create_engine(connection_string)

#dataframe을 mairadb에 저장
#if_exists는 테이블이 이미 존재하는 경우 어떻게 처리할지에 대한 매개변수입니다. replace를 입력하여 기존 테이블을 대체할 수 있습니다.
df.to_sql("table명", engine, index = False, if_exists="replace")

 

python을 사용하시는 분들은 dataframe을 이용해 편리하게 DB에 데이터를 적재할 수 있습니다.

현재 chromedriver는 114버전까지만 공식홈페이지에서 지원합니다.

 

115버전 이후부터는 이전과는 다른방법으로 지원한다고 하는데, 기존에 chromedriver.exe를 통해서 사용을 했기 때문에

exe파일로 사용할 수 없어 해결방법을 찾고 있었습니다.

 

현재 크롬은 119버전까지 나와있으며, chromedriver는 119버전을 지원하지 않습니다.

 

해결방법으로는 편리하게 자동으로 webdriver를 설치해주는 라이브러리를 사용합니다.

 

[해결방법]

webdriver_manager 라이브러리를 이용하여 자동 설치 및 버전관리를 통해 편리하게 사용가능 합니다.

#webdriver_manager를 사용하기 위해 라이브러리 설치
pip install webdriver_manager 

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

#필요한 chrome_options은 추가해주면 됩니다.
chrome_options = webdriver.ChromeOptions()


driver = webdriver.Chrome(executable_path=ChromeDriverManager().install(),
options=chrome_options)


URL = "접속이 필요한 URL 기입"
driver.get(URL)

 

webdriver_manager를 사용하여 chromedriver를 자동으로 다운로드합니다. 

반복문을 활용하다보면 하나이상의 리스트가 필요한 경우가 있습니다.

그럴때 zip()함수를 이용하여 여러개의 리스트를 불러올 수 있습니다.

 

li_1 = ["a","b","c","d","e"]
li_2 = [1,2,3,4,5]

#for문 밖에서 선언한 li_1의 변수들을 사용할 수 없음
for i,j in zip(li_1, li_2):
	i = j
    
for i,j in zip(li_1, li_2):
	globals()[i] = j  #for문 밖에서 선언한 li_1의 변수들을 사용할 수 있음

 

#주의사항

이때 선언한 변수 i를 그대로 사용하게되면, li_1의 변수명들을 사용할 수 없습니다.

그래서 추가적으로 필요한 개념이 globals()함수 입니다.

 

for문 안에서 변수명을 사용할 때는 globals()함수를 이용하여 for문 밖에서 선언한 변수명을 그대로 사용할 수 있게해줍니다.

자연어 처리 중 키워드의 출현빈도 및 자주 등장한 키워드에 대한 나열이 가능합니다.

 

collection 라이브러리에 Counter 패키지 사용하였습니다.

 

코드는 아래와 같습니다.

from collections import Counter #라이브러리 호출

df['noun'] = df['content'].apply(lambda x : mecab.nouns(x)) #데이터프레임 본문에서 명사만 추출

#전처리(불용어 제거 및 텍스트 정제)
noun = df['noun'].apply(lambda x : [item for item in x if item not in stop_words])
noun = noun.apply(lambda x : [word for word in x if len(word) > 1])

#counter 함수를 사용하기위해 list화 
noun_list = []

for tokens in noun:
    for token in tokens:
        noun_list.append(token)

#키워드 빈도수 확인
noun_count = Counter(noun_list)
#상위 50개 추출
noun_50 = noun_count.most_common(50)

 

자연어 처리 중 연관단어를 확인하기 위한 방법으로 n-gram을 사용합니다.

 

가장 보편적으로 사용되는 2개의 연속된 단어를 확인하는 bigram 사용해봤습니다. 

 

nltk 패키지 bigrams 사용했습니다.

 

from nltk import bigrams #nltk에 bigrams 패키지 사용

#전처리
noun = df['content'].apply(lambda x : [item for item in x if item not in stop_words]) #불용어 제거
noun = df['content'].apply(lambda x : [word for word in if len(word) > 1]) #글자 수가 1개보다 적은 단어는 제거

bgrams = [bigrams(word) for word in noun] #bgrams라는 변수에 전처리된 단어들을 적용

token = []
for i in bgrams:
    token += ([x for x in i])

 

 

 

 

 

 

 

 

자연어 처리를 하기위해 konlpy를 실행하는 도중...

JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVA_HOME environment variable properly. 오류를 마주했습니다.

 

konlpy 설치와 import까지 무사히 진행했으나,

okt를 실행했을때 JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVA_HOME environment variable properly 오류가 났습니다.

 

이전에는 정상적으로 썼던거같은데 오랜만에 사용하려고 하니 오류가 뜬걸까요..?

열심히 구글을 통해 저와 같은 오류가 있으신분들이 어떻게 해결했는지 찾아봤으나 다양한 경우와 해결방법이 있어 

제가 해결한 방법을 공유드리려고 합니다.

 

우선 순서는 아래와 같습니다.

1. JAVA_HOME 환경변수 설정

2. Jpype 설치 및 import

3. 정상작동

 

위와 같은 순서로 진행했습니다.

 

+ Recent posts