import nltk # NLTK 토크나이저 리소스 자동 다운로드 nltk.download("punkt") nltk.download("punkt_tab") import gradio as gr import trafilatura import requests from markdownify import markdownify as md from sumy.parsers.plaintext import PlaintextParser from sumy.nlp.tokenizers import Tokenizer from sumy.summarizers.text_rank import TextRankSummarizer def summarize_text(text, sentence_count=3): # 한국어도 문장 단위로 끊기 위해 english 토크나이저 사용 parser = PlaintextParser.from_string(text, Tokenizer("english")) summarizer = TextRankSummarizer() summary_sentences = summarizer(parser.document, sentence_count) return "\n".join(str(sentence) for sentence in summary_sentences) def extract_and_summarize(url): headers = {"User-Agent": "Mozilla/5.0"} try: r = requests.get(url, headers=headers, timeout=10) r.raise_for_status() # HTML 형태로 본문 추출 html_content = trafilatura.extract( r.text, output_format="html", include_tables=True, favor_recall=True ) if not html_content: return "본문을 추출할 수 없습니다.", "" # HTML → Markdown 변환 markdown_text = md(html_content, heading_style="ATX") # 요약 생성 summary = summarize_text(markdown_text, sentence_count=3) return markdown_text, summary except requests.exceptions.Timeout: return "요청이 시간 초과되었습니다.", "" except requests.exceptions.RequestException as e: return f"요청 실패: {e}", "" except Exception as e: return f"에러 발생: {e}", "" iface = gr.Interface( fn=extract_and_summarize, inputs=gr.Textbox(label="URL 입력", placeholder="https://example.com"), outputs=[ gr.Markdown(label="추출된 본문"), gr.Textbox(label="자동 요약", lines=5) ], title="본문 추출기 + 자동 요약", description="웹페이지 URL을 입력하면 본문을 추출하고, TextRank 알고리즘으로 3문장 요약을 제공합니다." ) if __name__ == "__main__": iface.launch()