AI 부트캠프/챕터3(11.08~12.04)

TIL 46 팀 프로젝트

musukie 2024. 11. 22. 20:12

팀 프로젝트

데이터셋 로드하기

1. NotionDirectoryLoader로 노션 파일 읽어오기

노션의 API를 활용하는 방법도 있지만, API를 활용하는 방법을 사용하지 않고 싶어서 노션 파일을 html, md, pdf 형식으로 각각 저장해서 읽어오는 방법을 선택했다.

from langchain_community.document_loaders.notion import NotionDirectoryLoader

위의 코드는 langchain_community 패키지의 document_loaders.notion 모듈에서 NotionDirectoryLoader 클래스를 가져오는 코드다.

  • 패키지/라이브러리: langchain_community
    • 이 패키지는 LangChain이라는 자연어 처리(NLP) 프레임워크와 관련된 커뮤니티 기반의 확장 패키지다. LangChain은 다양한 데이터 소스에서 정보를 추출하고, 이를 처리하여 AI 모델에 사용할 수 있도록 돕는 도구를 제공한다.
  • 모듈: document_loaders.notion
    • 이 모듈은 Notion에서 데이터를 로드하고 처리하는 기능을 제공한다.
  • 클래스: NotionDirectoryLoader
    • 이 클래스는 Notion 페이지 또는 디렉토리에서 데이터를 로드하는 역할을 한다. 일반적으로 Notion의 데이터를 LangChain을 사용하여 NLP 작업에 활용하려는 경우 사용된다.

이 클래스를 사용하면 Notion에서 제공하는 자료를 자동으로 가져와 NLP 모델이나 다른 처리 작업에 활용할 수 있게 된다.

 

  1. 노션을 html 형식으로 저장하고 읽기
    몇 개의 정보만 텍스트로 읽어오고, 대부분의 정보는 읽어오지 못했다.
  2. 노션을 Markdown & CSV 형식으로 저장하고 읽기
    모든 정보를 텍스트로 읽어왔지만, 이미지 데이터는 읽어오지 못했다.
  3. 노션을 pdf 형식으로 저장하고 읽기
    텍스트 순서가 뒤죽박죽으로 읽혔다.

2. 노션 페이지 URL 사용하기

1) requests 라이브러리로 HTML 크롤링

노션 페이지를 HTML로 렌더링한 후 데이터를 크롤링하여 가져오는 방법을 써봤다. 그러나 아무런 정보도 텍스트로 나타내지 못했다.

노션 페이지는 JavaScript로 동적으로 렌더링되기 때문에, 단순히 HTML을 요청하고 BeautifulSoup로 파싱하는 방식만으로는 원하는 데이터를 얻기 어려울 수 있다고 한다. 또한 노션 페이지는 보통 div 태그 안에 데이터가 포함되어 있지만, 데이터가 렌더링되는 방식이 예상과 다를 수 있다고 한다.

2) Selenium으로 렌더링 후 추출

그래서 이번에는 브라우저 자동화 도구를 사용해 데이터를 로드하고 추출했다.

※ 여기서 잠깐! 웹 자동화 도구에 대해 알아보고 가자.
PlaywrightSelenium은 웹 자동화 도구로, 웹 페이지를 자동으로 탐색하거나 데이터를 추출하는 데 사용된다. 두 도구 모두 웹 브라우저를 제어할 수 있으며, 자바스크립트로 동적으로 생성된 콘텐츠나, 사용자 인터페이스와 상호작용을 자동화하는 데 매우 유용하다. 이 둘을 비교하면 아래의 접은 글과 같다.

더보기

1. Playwright

개요

Playwright는 Microsoft에서 개발한 오픈소스 웹 자동화 도구다. Chrome, Firefox, Safari 등 여러 브라우저를 지원하며, Headless 모드(브라우저 UI 없이 백그라운드에서 실행)에서 실행할 수 있다.

주요 특징:

  • 다양한 브라우저 지원: Chromium, Firefox, WebKit(Safari 엔진)을 지원하여 다양한 환경에서 테스트가 가능.
  • 빠른 속도: Playwright는 브라우저와 직접 상호작용하는 구조로, 빠른 실행 속도를 자랑한다.
  • 자동화 기능: 브라우저 상호작용, 페이지 탐색, 폼 제출, 스크린샷 캡처, 파일 다운로드 등 다양한 기능을 제공한다.
  • 프로그래밍 언어 지원: Python, JavaScript, TypeScript, C# 등 여러 언어에서 사용 가능하다.
  • 동적 컨텐츠 처리: 자바스크립트로 동적으로 변경되는 페이지의 내용도 쉽게 처리 가능하다.
  • 자동화된 테스트: UI 테스트를 포함하여 브라우저와의 상호작용을 테스트할 수 있다.

설치

 
pip install playwright

기본 예제

 
from playwright.sync_api import sync_playwright
 
with sync_playwright() as p:
    browser = p.chromium.launch(headless=True) # headless=True로 UI 없이 실행
    page = browser.new_page() page.goto('https://example.com') # 원하는 웹사이트로 이동
    page.screenshot(path='example.png') # 스크린샷 찍기 browser.close()

장점

  • 다양한 브라우저 지원.
  • 빠른 속도와 안정성.
  • 복잡한 웹 애플리케이션을 쉽게 처리.
  • 테스트 자동화에 적합.

단점

  • 상대적으로 새로운 도구로, Selenium에 비해 문서화가 적을 수 있음.

2. Selenium

개요

Selenium은 웹 브라우저 자동화 도구로, WebDriver라는 개념을 사용하여 브라우저를 제어한다. Java로 시작되었지만, Python, JavaScript, C#, Ruby 등 여러 언어에서 사용할 수 있다.

주요 특징

  • 브라우저 다양성: Chrome, Firefox, Safari 등 다양한 브라우저를 지원한다.
  • 웹 애플리케이션 자동화: 웹 사이트와 상호작용하여 데이터를 추출하거나 UI 테스트를 할 수 있다.
  • 비동기적 처리: 자바스크립트로 처리되는 동적 페이지에서도 효과적으로 동작한다.
  • 기존 사용 사례: Selenium은 매우 오랜 역사를 가지고 있어, 많은 프로젝트와 라이브러리에서 사용되고 있다.
  • 로컬 및 원격 브라우저 지원: 브라우저가 설치된 로컬 환경에서나 원격 환경(예: Selenium Grid)에서 모두 사용할 수 있다.

설치

 
pip install selenium

기본 예제

 
from selenium import webdriver
 
# 웹드라이버 경로 설정
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
driver.get("https://example.com")
 
# 페이지 제목 출력
print(driver.title)
 
# 브라우저 종료
driver.quit()

장점

  • 오랜 역사와 안정성.
  • 다양한 브라우저와 원격 환경에서 동작.
  • 웹 애플리케이션 테스트와 크롤링에서 매우 널리 사용됨.

단점

  • 상대적으로 속도가 느림.
  • 여러 브라우저의 호환성 문제나 드라이버 버전 문제로 인해 설정이 번거로울 수 있음.

Playwright vs Selenium 비교

특징 Playwright Selenium
브라우저 지원 Chromium, Firefox, WebKit Chrome, Firefox, Safari, Edge 등 다양한 브라우저
속도 빠르며, 동시 실행에 유리 상대적으로 느릴 수 있음
동적 콘텐츠 처리 자바스크립트 기반 콘텐츠 잘 처리 동적 콘텐츠 처리에 다소 불편할 수 있음
언어 지원 Python, JavaScript, TypeScript, C# 등 Python, Java, JavaScript, C#, Ruby 등
테스트 및 자동화 UI 테스트 및 자동화가 쉽고 빠름 UI 테스트와 자동화에 매우 적합
설정 및 설치 비교적 간단한 설치와 사용 설정이 다소 복잡할 수 있음
개발 및 지원 커뮤니티 상대적으로 새로운 도구, 문서화가 적음 매우 긴 역사를 가지고 있으며, 방대한 커뮤니티와 문서화

결론

  • Playwright는 빠르고 효율적이며, 여러 브라우저에서 실행할 수 있어 최신 웹 애플리케이션을 테스트하거나 크롤링하는 데 유용하다.
  • Selenium은 더 많은 브라우저와 환경에서 안정적으로 동작하며, 오랜 기간 검증된 도구다.

따라서, 새로운 프로젝트에서는 Playwright를 추천하고, 기존 Selenium 기반의 프로젝트나 안정적인 도구가 필요한 경우에는 Selenium을 사용하는 것이 좋다고 한다.

webdriver_manager: 이 라이브러리는 자동으로 ChromeDriver를 설치해 주어, 매번 드라이버 경로를 설정할 필요가 없다. 그러나 아래의 코드에서 오류가 발생했다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time

# Selenium 드라이버 설정
driver = webdriver.Chrome(ChromeDriverManager().install())

AttributeError: 'str' object has no attribute 'capabilities' 오류는 Selenium의 webdriver.Chrome()을 사용할 때 발생하는 문제라고 한다. 주로 ChromeDriverManager와 관련된 설정 문제에서 발생한다.

webdriver.Chrome(ChromeDriverManager().install())의 코드에서 문제가 발생한 것 같아서 webdriver.Chrome()에 options를 올바르게 전달하는 방식으로 수정하라고 했다.

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# Chrome options 설정 (필요시)
options = Options()
options.add_argument("--headless")  # 헤드리스 모드, UI 없이 실행할 경우 (선택사항)

# ChromeDriverManager와 Service를 사용하여 ChromeDriver 경로 설정
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

 

  • webdriver.Chrome()에 service 매개변수를 명시적으로 추가한다. ChromeDriverManager().install()은 이제 Service 객체로 전달된다.
  • options를 명시적으로 설정할 수 있다. 예를 들어, --headless 모드를 사용하여 브라우저 UI 없이 실행할 수 있다.

여러 방식을 시도해본 이유는 이미지의 텍스트 정보를 읽어오기 위해서였다. 그러나 이미지의 텍스트를 읽어오는 것은 쉽지 않으며, 많은 비용이 든다는 것을 알게 되었다. 따라서 이미지의 텍스트를 읽어오는 작업은 포기하기로 했다. 시간이 너무 지체되어 팀원분들의 코드를 참고해 코드를 완성했다.


불러온 텍스트 데이터에 대해 전처리 작업을 했다. 불러온 텍스트 파일 몇 개를 읽어보고, 어떤 내용이 전처리를 해야 되는 지를 살펴보았다. 전처리를 이렇게 하는 게 맞는 건지는 모르겠지만, 내가 생각했을 때 필요없는 내용을 삭제하는 식으로 전처리 작업을 했다.

# 전처리 함수 정의
def preprocess_text(txt):
    # 1. '[ㅇㅇㅇㅇ코딩ㅇㅇ]' 제거
    txt = re.sub(r'\[?스파르타코딩클럽\]?', '', txt)

    # 2. 저작권 문구 제거
    txt = re.sub(r'Copyright.*$', '', txt)

    # 3. 정규식을 사용해 \\로 시작하는 LaTeX 명령어 제거
    txt = re.sub(r'\\[a-zA-Z]+', '', txt)

    # 4. 불필요한 공백 제거
    txt = re.sub(r'\s+', ' ', txt).strip()

    # 5. 특수 문자 제거
    txt = re.sub(r'[^\w\s]', '', txt)

    # 6. 줄바꿈 제거
    txt = re.sub(r'\n', '', txt)

    # 7. '모든 토글을 열고 닫는 단축키 Windows : Ctrl + alt + t' 제거
    txt = re.sub(r'모든 토글을 열고 닫는 단축키\s+Windows\s+Ctrl\s+alt\s+t\s+Mac\s+t', '', txt).strip()

    return txt

 

불러온 텍스트 중에서 [ㅇㅇㅇㅇ코딩ㅇㅇ] 라는 내용이 반복돼서 이 문구를 지웠다. 전처리 함수에서 순서도 중요하기 때문에, 내가 원하는 내용을 지우기 위해서는 특수 문자나 공백, 줄바꿈 등을 제거하기 전에 먼저 처리해주어야 한다. 또, 저작권 문구도 불필요한 내용이기 때문에 삭제해주었다.

 

LaTeX 명령어도 제거해주었다.

여기서 잠깐! LaTeX 명령어가 무엇인지 알아보자.

LaTeX 명령어는 LaTeX 문서에서 텍스트 형식, 수식, 표, 그림 등을 지정하거나 조작하기 위해 사용되는 명령어를 말한다. 

LaTeX 명령어는 주로 역슬래시(\)로 시작하며, 뒤에 명령 이름이 따라온다. 명령어의 형태는 크게 두 가지로 나뉜다.

 

  • 단일 명령어
    별도의 매개변수 없이 동작한다.
    예) \newline (새 줄 시작), \today (현재 날짜 출력)
  • 매개변수 포함 명령어
    명령어 뒤에 중괄호({})로 감싸 매개변수를 전달한다.
    예를 들면 아래와 같다.
\textbf{Hello World}  % 굵은 글씨
\section{Introduction}  % 'Introduction'이라는 제목 섹션 생성

 

 

주요 명령어 예시를 통해 자세히 알아보자.

 

  • 문서 구조 명령어
    • \documentclass{article}: 문서 클래스 지정
    • \begin{document}와 \end{document}: 문서 시작과 끝
  • 텍스트 스타일링
    • \textbf{}: 굵게
    • \textit{}: 기울임꼴
    • \underline{}: 밑줄
  • 수식 명령어
    • \frac{a}{b}: 분수 ab\frac{a}{b}
    • \sum_{n=1}^\infty n: 합 ∑n=1∞n\sum_{n=1}^\infty n
  • 표/그림
    • \begin{table}와 \end{table}: 표 환경
    • \includegraphics{filename}: 그림 삽입
  • 기타
    • \item: 목록 항목 추가
    • \cite{}: 참고문헌 인용

명령어 사용 예제는 아래와 같다.

\documentclass{article} % 문서 클래스 지정
\begin{document}
\section{Hello, LaTeX!}
This is a \textbf{bold} text and this is \textit{italicized}.

Here is a fraction: \(\frac{a}{b}\).

\begin{itemize}
    \item First item
    \item Second item
\end{itemize}

\end{document}

 

이 코드를 실행하면 굵은 텍스트와 기울임꼴 텍스트, 수식, 목록이 포함된 문서가 생성된다.

 

LaTeX 명령어는 사용자의 의도에 따라 문서를 체계적으로 구성하고 멋진 결과물을 만드는 데 유용하다.

 

LaTeX 명령어는 전문적인 문서 작성이 필요할 때 사용하는 도구다. 특히 수식, 표, 그림 등 복잡한 내용을 포함한 문서를 체계적으로 작성하고자 할 때 매우 유용하다. LaTeX 명령어를 사용하는 이유와 적절한 상황을 아래와 같이 정리할 수 있다.

1. 언제 사용하는가?

(1) 학술 문서 작성

  • 논문, 과제 보고서, 학술 발표 자료 등 수식이나 참고문헌 관리가 중요한 경우.
  • 예: 연구 논문에서 복잡한 수식을 깔끔하게 표현해야 할 때.

(2) 서식이 중요한 문서

  • 논문의 학술지 요구사항, 학위논문, 서적 등 엄격한 서식이 필요한 경우.
  • 예: 특정 학회에서 제공하는 LaTeX 템플릿에 맞춰 논문 작성.

(3) 다양한 콘텐츠 포함 문서

  • 표, 수식, 그림, 인용 등이 혼합된 문서를 깔끔하게 구성해야 할 때.
  • 예: 기술 매뉴얼, 교재, 프로젝트 보고서.

(4) 자동화된 문서 작성

  • 방대한 데이터를 포함한 문서를 자동으로 업데이트하거나 생성해야 할 때.
  • 예: 프로그래밍으로 데이터를 분석하고 결과를 LaTeX으로 작성.

2. 왜 사용하는가?

(1) 정확하고 아름다운 출력

  • LaTeX은 출력 품질이 뛰어나 학술 문서나 책과 같은 인쇄물이 깔끔하게 작성됨.
  • 특히, 수식의 경우 Word와 같은 일반 워드 프로세서보다 훨씬 보기 좋고, 복잡한 수식도 쉽게 작성 가능.
    • 예: E=mc2E = mc^2, ∫0∞e−x2dx\int_{0}^{\infty} e^{-x^2} dx.

(2) 서식 관리의 편리함

  • 논문 형식, 보고서 서식 등을 직접 신경 쓸 필요 없이 템플릿만 지정하면 자동으로 일관성 유지.
    • 예: 각종 제목 크기, 간격, 페이지 번호, 목차 등을 자동 처리.

(3) 복잡한 작업 지원

  • 대규모 문서에서 참조, 인용, 목차, 색인 등을 자동으로 관리 가능.
    • 예: \cite 명령어를 사용해 참고문헌을 자동으로 생성하고, 번호를 매기거나 형식을 맞춤.

(4) 오래 유지 가능한 문서 작성

  • LaTeX 문서는 텍스트 파일 형식으로 작성되기 때문에 시간이 지나도 깨지거나 열리지 않는 문제가 없음.
    • 반면 Word 문서는 버전 문제로 열리지 않을 수 있음.

(5) 협업 및 재사용 가능성

  • LaTeX 문서는 깃허브(Git)와 같은 협업 도구와 잘 어울리며, 텍스트 기반이라 수정 내역을 쉽게 관리 가능.
  • 작성한 코드는 여러 프로젝트에서 재사용 가능.

3. LaTeX를 사용하는 이유를 예시로 표현

Word에서 작성할 때의 문제점

  • 복잡한 수식과 표가 잘 맞지 않거나 깨지는 경우.
  • 수식 번호와 참조를 수동으로 관리해야 함.
  • 문서 서식을 직접 맞추다 시간이 오래 걸림.

LaTeX의 장점을 아래 코드를 통해 살펴보자.

\section{Einstein's Equation}
The famous equation is given by:
\[
E = mc^2
\]
Here, \(E\) is energy, \(m\) is mass, and \(c\) is the speed of light.

이 코드를 작성하면 수식과 관련 설명이 자동 정렬되고, 템플릿에 따라 서식도 일정하게 유지된다.

 

정리 : LaTeX 명령어 사용의 핵심

  • 언제: 복잡한 서식, 수식, 표 등이 필요한 전문 문서를 작성할 때.
  • : 출력 품질, 자동화된 관리, 서식 일관성, 협업 편리성을 위해.

LaTeX은 익숙해지면 복잡한 작업을 훨씬 효율적으로 처리할 수 있는 강력한 도구다.


그리고 전처리 작업까지 완료한 텍스트를 로컬 폴더에 각각 저장할 수 있게 코드를 구성했다.

# 저장할 폴더 경로
output_folder = "cleaned_texts"  # 원하는 폴더 이름 지정

# 폴더가 없으면 생성
os.makedirs(output_folder, exist_ok=True)

# 각 텍스트를 개별 파일로 저장
for idx, txt in enumerate(txt_list, start=1):
    output_file = os.path.join(output_folder, f"cleaned_text_{idx}.txt")  # 폴더 경로 포함
    with open(output_file, 'w', encoding='utf-8') as file:
        file.write(txt)  # 전처리된 텍스트를 파일에 저장

    print(f"텍스트가 '{output_file}'에 저장되었습니다.")

저장할 폴더는 output_folder고, 이 폴더가 없으면 폴더를 새로 만들게 했다.

'AI 부트캠프 > 챕터3(11.08~12.04)' 카테고리의 다른 글

TIL 47  (0) 2024.11.23
WIL 7  (0) 2024.11.22
TIL 45  (0) 2024.11.21
TIL 44  (1) 2024.11.20
TIL 43 도전 과제  (2) 2024.11.19