언어
피토니·2025-05-01
tkinter 창이 안 뜨는 건 보통 mainloop()를 안 써서 그렇습니다.import tkinter as tk
window = tk.Tk()
window.mainloop() # 이걸 꼭 써야 창이 떠요!

CPU 환경에서도 10배 빠른 Tokenizer, FlashTokenizer를 소개합니다!
안녕하세요!최근 인공지능(AI)과 대형 언어 모델(LLM)의 활용이 증가하면서 자연어 처리(NLP) 분야에서도 성능과 효율성이 더욱 중요해졌습니다. 텍스트 전처리 단계 중 하나인 토크나이제이션(Tokenization)은 모델의 추론 속도와 정확도에 큰 영향을 미칩니다. 이런 필요성으로 개발된 초고속 CPU 기반 토크나이저, FlashTokenizer를 소개합니다.FlashTokenizer가 왜 필요할까요?기존에 자주 쓰이는 토크나이저인 BertTokenizerFast는 사용이 편리하지만 속도 측면에서는 아쉬움이 있습니다. 특히 실시간 처리가 중요한 서비스나 빠른 반응 속도를 요구하는 환경에서는 성능 저하가 클 수 있습니다. FlashTokenizer는 바로 이러한 문제점을 해결하기 위해 탄생했습니다.FlashTokenizer 주요 특징⚡ 우수한 속도: 기존 HuggingFace 구현체 대비 8~15배 빠른 성능 제공🛠️ 고성능 C++ 구현체: CPU 사용을 최적화하여 자원 소모 최소화🔄 OpenMP 병렬 처리: 멀티코어 환경에서 효율적인 병렬 연산 지원📦 쉬운 설치: pip를 통해 Python 환경에서 간단히 설치 및 사용 가능💻 다양한 운영체제 호환성: Windows, macOS, Ubuntu 등 주요 OS 지원설치 및 사용 방법FlashTokenizer는 pip를 사용해 간편하게 설치할 수 있습니다:pip install flash-tokenizer더 많은 사용법과 예제는 공식 GitHub에서 확인하실 수 있습니다:FlashTokenizer GitHub 바로가기이런 분들께 추천합니다대규모 언어 모델 추론 과정에서 텍스트 처리 속도를 개선하고자 하는 분빠른 처리 속도를 요구하는 실시간 NLP 애플리케이션을 구축하고자 하는 분CPU 환경에서 언어 모델 성능을 효율적으로 높이고 싶은 분성능 데모 영상FlashTokenizer의 실제 성능을 영상으로 직접 확인해 보세요:▶️ 성능 측정 데모 영상뎁스노트 회원 여러분의 많은 관심과 피드백 부탁드립니다! 감사합니다.
588
0

React Native ExecuTorch를 이용해 모바일에서 AI 모델 실행하기
개요 최근 AI 기술이 급격히 발전하면서, 모바일 애플리케이션에서도 머신러닝(ML) 모델을 활용하는 사례가 증가하고 있다. 하지만 기존의 AI 모델을 모바일 환경에서 실행하려면 높은 연산 비용과 클라우드 의존도가 문제로 작용했다. 이런 문제를 해결하기 위해 React Native ExecuTorch가 등장했다. ExecuTorch는 Meta(구 페이스북)의 React Native와 PyTorch의 ExecuTorch를 결합하여 모바일에서 AI 모델을 효율적으로 실행할 수 있도록 돕는 기술이다. 이를 통해 React Native 기반의 모바일 앱에서도 AI 기능을 쉽게 통합할 수 있으며, 클라우드 서버에 의존하지 않고도 디바이스에서 직접 AI 연산을 수행할 수 있다. React Native를 기반으로 실행되기 때문에 한 번의 개발로 iOS와 Android에서 모두 작동하며, 네이티브 개발이 필요 없이 JavaScript 및 TypeScript 코드만으로 AI 모델을 쉽게 실행할 수 있다는 점이 가장 큰 장점이다. 또한, 앱 내에서 AI 기능을 직접 실행하므로 데이터가 외부 서버로 전송되지 않아 보안성이 높고, 네트워크 연결이 필요 없어 빠른 응답 속도를 제공한다. 그럼 React Native ExecuTorch의 개념, 특징, 사용 방법, 그리고 실제 적용 방법을 다뤄보겠다. 1. React Native ExecuTorch란? React Native ExecuTorch는 React Native 환경에서 PyTorch 모델을 실행할 수 있도록 지원하는 경량 머신러닝 실행 엔진이다. 기존에는 AI 모델을 모바일에서 실행하려면 TensorFlow Lite(TFLite)나 ONNX Runtime을 사용해야 했지만, 이제는 ExecuTorch를 활용하여 PyTorch 모델을 직접 실행할 수 있다. React Native에서 실행되기 때문에 갖는 주요 장점 iOS와 Android 동시 지원 – 한 번의 개발로 여러 플랫폼에서 실행할 수 있어 개발 비용 절감. 네이티브 브릿지 불필요 – 추가적인 네이티브 코드 작성 없이 AI 모델을 실행할 수 있어 유지보수 간편. 빠른 개발 속도 – JavaScript/TypeScript만으로 AI 모델을 사용할 수 있어 React Native 개발자들이 쉽게 접근 가능. 온디바이스 머신러닝(ML) 지원 – AI 모델이 스마트폰에서 직접 실행되므로 네트워크 의존성이 낮고 응답 속도가 빠름. 데이터 프라이버시 강화 – AI 연산이 클라이언트 측에서 실행되므로, 사용자의 개인 데이터가 서버로 전송되지 않아 보안성이 뛰어남. 배터리 및 리소스 효율성 – 클라우드 AI 대비 낮은 전력 소비와 빠른 실행 속도를 제공. 기존 AI 모델 실행 방식과 비교 실행 방식 클라우드 필요 여부 응답 속도 데이터 프라이버시 클라우드 기반 AI 필요 느림 (네트워크 의존) 낮음 (데이터가 서버로 전송됨) TensorFlow Lite 불필요 빠름 높음 ExecuTorch (React Native) 불필요 매우 빠름 매우 높음 ExecuTorch는 PyTorch 기반의 모델을 직접 React Native에서 실행할 수 있도록 지원하며, 클라우드 의존도를 최소화하면서도 빠른 속도를 제공한다. 2. React Native ExecuTorch의 구조 React Native에서 ExecuTorch를 활용하려면 다음과 같은 절차를 거쳐야 한다. PyTorch에서 AI 모델 학습 ExecuTorch 포맷으로 모델 변환 React Native 앱에서 ExecuTorch로 모델 로드 모델 실행 및 결과 반환 그럼 이제 단계별로 구현 방법을 살펴보자. 3. React Native ExecuTorch 적용 방법 Step 1: React Native 프로젝트 설정 먼저, React Native 프로젝트를 생성한다. npx react-native init MyExecuTorchApp cd MyExecuTorchApp 그다음, ExecuTorch 라이브러리를 설치한다. npm install react-native-executorch Step 2: PyTorch 모델 변환 PyTorch에서 간단한 머신러닝 모델을 생성하고 ExecuTorch 포맷으로 변환한다. import torch # 간단한 모델 정의 class SimpleModel(torch.nn.Module): def forward(self, x): return x * 2 # 모델 인스턴스 생성 model = SimpleModel() # ExecuTorch 실행을 위해 모델 변환 scripted_model = torch.jit.script(model) scripted_model.save("simple_model.pt") 변환된 simple_model.pt 파일을 React Native 프로젝트 내부에 추가한다. Step 3: React Native에서 ExecuTorch 실행 이제 변환된 AI 모델을 React Native 앱에서 실행해보겠다. import { ExecuTorch } from 'react-native-executorch'; // 모델 로드 const loadModel = async () => { const model = await ExecuTorch.loadModel('simple_model.pt'); // 입력 데이터 생성 const input = [1, 2, 3, 4, 5]; // 모델 실행 const output = await model.run(input); console.log('AI Model Output:', output); }; // 모델 실행 함수 호출 loadModel(); 이제 앱을 실행하면 AI 모델이 React Native 환경에서 실행된다. 4. React Native ExecuTorch의 활용 사례 ExecuTorch를 활용하면 다양한 AI 기능을 React Native 앱에서 직접 구현할 수 있다. ① 이미지 처리 및 객체 감지 const detectObjects = async (imageData) => { const model = await ExecuTorch.loadModel('object_detection.pt'); const results = await model.run(imageData); console.log('Detected Objects:', results); }; ② 실시간 음성 인식 const transcribeAudio = async (audioData) => { const model = await ExecuTorch.loadModel('speech_to_text.pt'); const transcript = await model.run(audioData); console.log('Transcribed Text:', transcript); }; ③ 자연어 처리(NLP) 기반 챗봇 const chatbotResponse = async (userMessage) => { const model = await ExecuTorch.loadModel('chatbot_model.pt'); const response = await model.run(userMessage); console.log('Chatbot Reply:', response); }; 5. 결론 React Native ExecuTorch는 모바일에서 AI 모델을 실행할 수 있도록 돕는 강력한 도구이다. 특히 React Native 기반으로 동작하기 때문에 멀티 플랫폼 지원, 빠른 개발 속도, 데이터 프라이버시 보호 등의 이점을 극대화할 수 있다. React Native 기반 앱에서 이미지 인식, 음성 인식, 자연어 처리, 추천 시스템 등 다양한 AI 기능을 추가하려면 ExecuTorch를 활용하는 것이 좋을 것이다.
2.2K
1
0

피토니·2024-11-27
1. Flask 장점: 간단하고 배우기 쉬움, 필요한 기능만 추가 가능. 단점: 기본 기능 부족, 대규모 프로젝트에선 관리 어려움. 사용 경험: 빠르게 REST API를 개발했으나 확장성 부족으로 Django로 전환. 추천: 소규모 프로젝트나 빠른 프로토타입 개발에 적합. 2. Django 장점: 다양한 기능 기본 제공, 대규모 프로젝트와 보안에 강점. 단...

Python 클로저(Closure): 함수 내의 함수 활용법
Python에서 클로저(closure)는 다른 함수 안에 정의된 함수가, 자신이 선언된 환경에서 필요한 변수를 기억하는 개념입니다. 클로저는 고급 함수형 프로그래밍의 기초로, 더 효율적인 코드 작성과 유지보수에 도움을 줄 수 있습니다. 이번 글에서는 Python에서 클로저가 무엇인지, 어떻게 사용하는지, 그리고 실용적인 예제를 통해 이해해보겠습니다. 클로저란 무엇인가요? 클로저는 외부 함수 내에서 정의된 내부 함수로, 외부 함수가 종료된 후에도 내부 함수가 외부 함수의 변수를 '기억'할 수 있는 기능을 의미합니다. 이를 통해, 특정 데이터를 감싸는 컨테이너처럼 작동할 수 있습니다. 클로저가 필요한 이유 클로저는 다음과 같은 상황에서 유용합니다: 상태를 저장하여 이후의 호출에서 참조할 필요가 있을 때 함수형 프로그래밍의 장점을 살리고 싶을 때 변수의 범위를 제한하여 코드의 예측 가능성과 안전성을 높이고 싶을 때 이와 같은 상황에서 클로저를 사용하면 전역 변수 사용을 줄일 수 있고, 코드의 모듈성과 재사용성을 높일 수 있습니다. 클로저의 기본 구조 클로저는 다음과 같은 구조로 이루어집니다. def 외부_함수(외부_변수): def 내부_함수(내부_변수): return 외부_변수 + 내부_변수 return 내부_함수 외부 함수(외부_함수)가 호출되면 내부 함수(내부_함수)를 반환하며, 내부 함수는 외부 함수의 변수를 자유롭게 참조할 수 있습니다. 간단한 클로저 예제 아래 예제에서는 클로저를 활용하여 여러 번 호출되는 함수의 상태를 유지하는 방법을 보여줍니다. def make_multiplier(x): def multiplier(n): return x * n return multiplier times3 = make_multiplier(3) print(times3(10)) # 출력: 30 print(times3(20)) # 출력: 60 여기서 times3는 make_multiplier 함수에서 반환된 클로저입니다. 이 클로저는 x 값을 3으로 고정하여 내부 함수 multiplier에 전달합니다. 따라서 times3는 항상 x * n을 수행하며, x가 3으로 고정된 상태로 남아 있는 것입니다. 클로저의 활용 사례 클로저는 간단한 데코레이터를 만들 때 유용하게 사용됩니다. 예를 들어, 특정 작업의 실행 시간을 측정하는 데코레이터를 클로저를 사용해 만들 수 있습니다. import time def timer_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"실행 시간: {end_time - start_time} 초") return result return wrapper @timer_decorator def sample_task(): time.sleep(1) print("작업 완료") sample_task() 위 코드에서 timer_decorator 함수는 내부에 wrapper 함수를 정의하고 반환합니다. wrapper는 func의 실행 시간을 측정하고 출력합니다. 클로저의 장점과 주의점 Python에서 클로저는 데이터 은닉을 통한 함수형 프로그래밍의 이점을 제공합니다. 외부 변수의 참조를 유지하므로 함수 호출마다 동일한 환경을 유지할 수 있으며, 이를 통해 전역 변수의 남용을 방지하고 코드의 복잡도를 줄일 수 있습니다. 하지만 클로저는 과도하게 사용하면 코드 가독성을 떨어뜨릴 수 있으므로, 필요한 경우에만 사용하는 것이 좋습니다.
621
1
0

10초만에 완성되는 readme 작성 서비스, Readme Generator를 이용해보세요 ‼️
안녕하세요, 저는 개발과 데이터분석을 공부하고 있는 학생입니다! Github에 프로젝트를 올릴 때 readme.md를 작성하곤 하는데요, 저의 경우에는 프로젝트를 진행할 때마다 리드미 작성이 번거로워 대충 짧게 적거나 아예 빈칸으로 비워두는 경우도 허다했습니다🙂↔️ 저만 그런거 아니죠? ㅎㅎ 그래서 readme를 발표자료나 코드에 맞게 내용을 알아서 잘 센스있게 작성해주는 서비스가 있으면 좋겠다 싶어 직접 만들어보았습니다! 제목과 코드나 PDF 파일을 첨부하면 readme 파일을 자동으로 생성해주는 방식입니다. 아직은 초기 단계라 직접 사용해보신 분들의 피드백이 절실합니다! 저희 서비스를 한번 사용해보시고 불편하거나 개선할 점이 있다면 공유해주시면 감사하겠습니다 ☺️🙇♀️ *참고로, 입력된 코드는 저장되지 않지만, GPT API를 활용하기 때문에 기밀 문서나 코드는 입력하지 않도록 주의해주세요! 링크: web-production-073a6.up.railway.app
1.1K
1
0
질문셀레늄으로 네이버 카페 수집시 ip우회방법
코린이에요.. 셀레늄으로 네이버 카페 수집시 ip우회방법이 있나요? 이것저것 해보다가 제 아이피가 막혔는지 카페에서 일부 내용들이 안보이고 있는데 ㅠㅠ
426
0
질문네이버 스토어 리뷰 크롤링 오류
import re import requests from bs4 import BeautifulSoup import pandas as pd from datetime import datetime import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from datetime import datetime, timedelta from selenium.webdriver.chrome.service import Service from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager options = webdriver.ChromeOptions() # 크롬 옵션 객체 생성 options.add_argument("window-size=1920x1080") # 화면크기(전체화면) options.add_argument("disable-gpu") options.add_argument("disable-infobars") options.add_argument("--disable-extensions") options.add_argument('--no-sandbox') chrome_driver_path = "C:\Users\JH\Desktop\스토어 분석\chromedriver-win64\chromedriver.exe" service = Service(executable_path=chrome_driver_path) driver = webdriver.Chrome(service = service, options=options) driver.implicitly_wait(3) driver.get('https://brand.naver.com/sempio/products/10003754695') time.sleep(3) driver.find_element(By.CSS_SELECTOR,'#content > div > div.z7cS6-TO7X > div._27jmWaPaKy > ul > li:nth-child(2) > a').click() time.sleep(3) driver.find_element(By.CSS_SELECTOR,'#REVIEW > div > div._2LvIMaBiIO > div._2LAwVxx1Sd > div._1txuie7UTH > ul > li:nth-child(2) > a').click() time.sleep(3) page_num = 1 page_ctl = 2 date_cut = (datetime.now() - timedelta(days = 365)).strftime('%Y%m%d') write_dt_lst = [] item_nm_lst = [] content_lst = [] while True : print(f'start : {page_num} page 수집 중, page_ctl:{page_ctl}') 1. 셀레니움으로 html가져오기 html_source = driver.page_source # 2. bs4로 html 파싱 soup = BeautifulSoup(html_source, 'html.parser') time.sleep(0.5) # 3. 리뷰 정보 가져오기 reviews = soup.findAll('li', {'class': 'BnwL_cs1av'}) # 4. 한페이지 내에서 수집 가능한 리뷰 리스트에 저장 for review in range(len(reviews)): # 4-1.리뷰작성일자 수집 write_dt_raw = reviews[review].findAll('span' ,{'class' : '_2L3vDiadT9'})[0].get_text() write_dt = datetime.strptime(write_dt_raw, '%y.%m.%d.').strftime('%Y%m%d') # 4-2.상품명 수집 # 4-2-(1) 상품명이 포함된 css 선택자 입력 item_nm_info_raw = reviews[review].findAll('div', {'class' : '_2FXNMst_ak'})[0].get_text() # 4-2-(2) re.sub() 를 활용해 dl class="XbGQRlzveO"부분부터 추출한 문장을 공백으로 대체 item_nm_info_for_del = reviews[review].findAll('div', {'class' : '_2FXNMst_ak'})[0].find('dl', {'class' : 'XbGQRlzveO'}).get_text() # 4-2-(3) re.sub(pattern, replacement, string) : string에서 pattern에 해당하는 부분을 replacement로 모두 대체 item_nm_info= re.sub(item_nm_info_for_del, '', item_nm_info_raw) # 4-2-(4) find() : 문자열 순서 (인덱스) 반환 : find()를 활용해 '제품 선택 : '이 나오는 인덱스 반환 str_start_idx = re.sub(item_nm_info_for_del, '', item_nm_info_raw).find('제품 선택: ') # 4-2-(5) 제품명만 추출. strip(): 공백 제거 item_nm = item_nm_info[str_start_idx + 6:].strip() # 4-3. 리뷰내용 수집 review_content_raw = reviews[review].findAll('div', {'class' : '_1kMfD5ErZ6'})[0].find('span', {'class' : '_2L3vDiadT9'}).get_text() review_content = re.sub(' +', ' ',re.sub('\n',' ',review_content_raw )) # 4-4. 수집데이터 저장 write_dt_lst.append(write_dt) item_nm_lst.append(item_nm) content_lst.append(review_content) # 리뷰 수집일자 기준 데이터 확인(최근 1년치만 수집) if write_dt_lst[-1] < date_cut : break if page_num % 10 == 0: next_button = driver.find_element(By.XPATH, '//a[contains(text(), "다음")]') next_button.click() time.sleep(3) else: page_ctl_str = str(page_ctl) page_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, f'//a[text()="{page_ctl_str}"]')) ) page_button.click() time.sleep(3) html_source = driver.page_source soup = BeautifulSoup(html_source, 'html.parser') time.sleep(0.5) page_num += 1 page_ctl += 1 print('done') result_df = pd.DataFrame({ 'RD_ITEM_NM' : item_nm_lst, 'RD_CONTENT' : content_lst, 'RD_WRITE_DT' : write_dt_lst }) result_df.to_csv('C:/Users/JH/Desktop/스토어 분석/navershopping_review_data.csv', index=None, encoding='utf-8-sig') 페이지가 넘어가면서 리뷰를 잘 수집하고 있는것같은데 마지막페이지가 되면 더 이상 넘어갈 페이지가 없어서 그런지 오류가 납니다. 원래 마지막페이지가 되면 수집을 중단하고 csv파일로 만들어서 지정된경로에 저장해야하는데 안됩니다.
606
1
0

닥터핸·2024-06-09
마지막 페이지에서 더 이상 페이지가 없을 때 오류가 발생하는 문제를 해결하려면 다음 페이지가 없을 때 수집을 중단하고 데이터를 CSV 파일로 저장하는 로직을 추가해야 할 것 같습니다.즉, 페이지 이동을 시도하기 전에 다음 페이지 버튼이 존재하는지 확인하는 형태의 코드를 추가해보시기 바랍니다.
질문네이버 지도 리뷰 크롤링
from selenium.webdriver.common.by import By from urllib3.util.retry import Retry from requests.adapters import HTTPAdapter from openpyxl import Workbook from bs4 import BeautifulSoup from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.keys import Keys import time import datetime import requests # 크롬 옵션 설정 from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.chrome.options import Options as ChromeOptions options = ChromeOptions() user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" options.add_argument('user-agent=' + user_agent) options.add_argument("lang=ko_KR") options.add_argument('headless') # 헤드리스 모드로 실행 (브라우저 창을 띄우지 않음) options.add_argument('window-size=1920x1080') options.add_argument("disable-gpu") options.add_argument("--no-sandbox") # 크롬 드라이버 최신 버전 설정 service = ChromeService(executable_path=ChromeDriverManager().install()) # 크롬 드라이버 실행 driver = webdriver.Chrome(service=service, options=options) # url url = 'https://m.place.naver.com/restaurant/1085956231/review/visitor?entry=ple&reviewSort=recent' # BS4 setting for secondary access session = requests.Session() headers = { "User-Agent": "user value"} retries = Retry(total=5, backoff_factor=0.1, status_forcelist=[500, 502, 503, 504]) session.mount('http://', HTTPAdapter(max_retries=retries)) # New xlsx file now = datetime.datetime.now() xlsx = Workbook() list_sheet = xlsx.create_sheet('output') list_sheet.append(['nickname', 'content', 'date', 'revisit']) # Start crawling/scraping! try: print("Starting webdriver and accessing URL...") driver.get(url) driver.implicitly_wait(30) print("Page loaded. Scrolling down...") driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.PAGE_DOWN) count = 0 try: while True: print("Clicking on '더보기' button...") driver.find_element(By.XPATH, '//*[@id="app-root"]/div/div/div/div[6]/div[2]/div[3]/div[2]/div/a').click() count += 1 print(f"'더보기' button clicked {count} times.") time.sleep(0.4) except Exception as e: print(f'No more "더보기" button found, finished scrolling after {count} clicks.') time.sleep(25) html = driver.page_source bs = BeautifulSoup(html, 'lxml') reviews = bs.select('li.YlrAu') print(f"Found {len(reviews)} reviews.") for r in reviews: nickname = r.select_one('div.VYGLG') content = r.select_one('div.vg7Fp.CyA_N') date = r.select('div.D40bm>span.CKUdu>time')[0] revisit = r.select('div.D40bm>span.CKUdu')[1] # exception handling nickname = nickname.text if nickname else '' content = content.text if content else '' date = date.text if date else '' revisit = revisit.text if revisit else '' time.sleep(0.06) print(f"Review: {nickname} / {content} / {date} / {revisit}") list_sheet.append([nickname, content, date, revisit]) time.sleep(0.06) # Save the file file_name = 'naver_review_' + now.strftime('%Y-%m-%d_%H-%M-%S') + '.xlsx' xlsx.save(file_name) print(f"File saved as {file_name}") except Exception as e: print(f"Exception occurred: {e}") # Save the file(temp) file_name = 'naver_review_' + now.strftime('%Y-%m-%d_%H-%M-%S') + '.xlsx' xlsx.save(file_name) print(f"File saved as {file_name} after exception") finally: driver.quit() print("Webdriver closed.") 네이버 지도 리뷰 크롤링 코드 이며, 위 와같이 작성시 엑셀파일은 생성되지만, 크롤링이 전혀안되고있는 상황입니다. 아래는 결과값입니다. DevTools listening on ws://127.0.0.1:51574/devtools/browser/16977761-9899-4120-9ba5-2ef94f71fbc6 Starting webdriver and accessing URL... Page loaded. Scrolling down... Clicking on '더보기' button... No more "더보기" button found, finished scrolling after 0 clicks. Found 0 reviews. File saved as naver_review_2024-06-07_10-45-31.xlsx Webdriver closed. PS C:\Users\ooooo\ 위는 결과값 입니다. 엑셀파일은 생성이 되지만 전혀 리뷰를 읽지 못하는 상황입니다. 도움을 주시면 감사드리겠습니다.
654
1
0

닥터핸·2024-06-09
일단 '더보기' 버튼의 XPath가 잘못되어 있을 수 있는지 확인해보시기 바랍니다. 그리고 페이지 로딩 시간이 필요할 수 있으므로 로딩 대기 시간 조정도 해보시기 바랍니다. 리뷰 요소 선택자는 맞는지도 확인해보시기 바랍니다.
질문파이썬으로 다익스트라 알고리즘을 구현하려면 얼마나 걸릴까요?
안녕하세요. 아주 평범한 고등학생입니다. 아직 파이썬은 정식으로 배운 적은 없고 학교 생기부 채우느라 구글링하면서 제가 필요한 부분 찾아보면서 조금씩 파이썬 접하고 있습니다. 이번에 다익스트라 알고리즘 구현하려고 구글링해서 그냥 통째로 복사 붙여 넣기하고 아래 인접리스트만 조금 변형했습니다. 하지만 이걸 제가 다 했다고 하기에도 조금…. 이상해서 혹시 다익스트라 알고리즘 구현할 정도의 파이썬 다루는 실력을 만들려면 얼마나 걸리나요?? 저 혼자 코드 짜라고 하면 아무것도 못 할 거 같아서 질문합니다…. import sys def dijkstra(start): # 초기 배열 설정 distances = {node: sys.maxsize for node in graph} # 시작 노드의 거리는 0으로 설정 distances[start] = 0 queue = [] # 시작 노드부터 탐색 시작 하기 위함. (거리, 노드) - 거리, 노드 순으로 넣은 이유는 heapq 모듈에 첫 번째 데이터를 기준으로 정렬을 진행하기 때문 (노드, 거리) 순으로 넣으면 최소 힙이 예상한대로 정렬되지 않음 heapq.heappush(queue, (distances[start], start)) # 우선 순위 큐에 데이터가 하나도 없을 때까지 반복 while queue: # 가장 낮은 거리를 가진 노드와 거리를 추출 current_distance, node = heapq.heappop(queue) # 파이썬 heapq에 (거리, 노드) 순으로 넣다 보니까 동일한 노드라도 큐에 저장이 된다 예시: queue[(7, 'B'), (10, 'B')] # 이러한 문제를 아래 조건문으로 이미 계산되어 저장한 거리와 추출된 거리와 비교하여 저장된 거리가 더 작다면 비교하지 않고 큐의 다음 데이터로 넘어간다. if distances[node] < current_distance: continue # 대상인 노드에서 인접한 노드와 거리를 순회 for adjacency_node, distance in graph[node].items(): # 현재 노드에서 인접한 노드를 지나갈 때까지의 거리를 더함 weighted_distance = current_distance + distance # 배열의 저장된 거리보다 위의 가중치가 더 작으면 해당 노드의 거리 변경 if weighted_distance < distances[adjacency_node]: # 배열에 저장된 거리보다 가중치가 더 작으므로 변경 distances[adjacency_node] = weighted_distance # 다음 인접 거리를 계산 하기 위해 우선 순위 큐에 삽입 (노드가 동일해도 일단 다 저장함) heapq.heappush(queue, (weighted_distance, adjacency_node)) return distances graph = { 'A': {'C': 6.3, 'D': 4, 'E': 7}, 'B': {'C': 3.8, 'F': 7.5, 'K': 15}, 'C': {'A': 6.3, 'B': 3.8, 'D': 6.4, 'F': 4.3, 'K': 14}, 'D': {'A': 4, 'C': 6.4,'E': 5,'F': 4.4}, 'E': {'A': 7,'D': 5,'F': 8.9,'G': 4.5,'H': 8.8}, 'F': {'B': 7.5,'C': 4.3,'D': 4.4,'E': 8.9,'G': 6.5, 'I':5}, 'G': {'E': 4.5,'F': 6.5,'H': 8.5,'J': 6.3}, 'H': {'E': 8.8,'G': 8.5,'J': 7.7}, 'I': {'F': 5,'J': 6.6,'K': 7}, 'J': {'G': 6.3,'H': 7.7,'I': 6.6,'K': 10}, 'K': {'B': 15,'C': 14,'I': 7,'J': 10} } result = dijkstra('A') print(result)
242
1
0

피토니·2024-05-09
다익스트라 알고리즘을 스스로 구현할 수 있는 수준에 도달하기 위해 필요한 시간은 사람마다 다르지만, 일반적으로 몇 주에서 몇 달의 기간 동안 파이썬 기본 문법과 자료구조, 알고리즘에 대한 이해를 쌓아가는 것이 좋습니다. 기본적인 파이썬 문법을 이미 알고 있다면, 알고리즘에 대한 이해를 깊게 하는 데 집중하는 것이 좋을 것 같습니다. 다익스트라 알고리즘...