├── LICENSE ├── README.md ├── lecture-note ├── text-mining-for-practice_lecture-guide_220108.pdf ├── text-mining-for-practice_week01_220108.pdf ├── text-mining-for-practice_week03_220122.pdf ├── text-mining-for-practice_week05_220212.pdf ├── text-mining-for-practice_week06_220219.pdf ├── text-mining-for-practice_week07_220226.pdf ├── text-mining-for-practice_week08_220305.pdf ├── text-mining-for-practice_week09_220312.pdf ├── text-mining-for-practice_week10_220319.pdf ├── text-mining-for-practice_week11_220326.pdf └── text-mining-for-practice_week12_220401.pdf └── practice-note ├── week_01 └── W01-1_text-mining-for-practice_colaboratory.ipynb ├── week_02 ├── W02-1_text-mining-for-practice_python-basic.ipynb ├── W02-2_text-mining-for-practice_python-data-structure.ipynb ├── W02-3_text-mining-for-practice_python-conditional&loop.ipynb ├── W02-4_text-mining-for-practice_python-function&file.ipynb └── data │ ├── files │ ├── sample_file_01.txt │ ├── sample_file_02.txt │ ├── sample_file_03.txt │ ├── sample_file_04.txt │ ├── sample_file_05.txt │ ├── sample_file_06.txt │ ├── sample_file_07.txt │ ├── sample_file_08.txt │ ├── sample_file_09.txt │ ├── sample_file_10.txt │ ├── sample_file_11.txt │ ├── sample_file_12.txt │ ├── sample_file_13.txt │ ├── sample_file_14.txt │ ├── sample_file_15.txt │ ├── sample_file_16.csv │ ├── sample_file_17.csv │ ├── sample_file_18.csv │ ├── sample_file_19.csv │ └── sample_file_20.csv │ ├── novel_sample_en.txt │ └── novel_sample_ko.txt ├── week_03 ├── W03-1_text-mining-for-practice_python-crawling-intro.ipynb └── W03-2_text-mining-for-practice_python-crawling-practice-1.ipynb ├── week_04 ├── W04-1_text-mining-for-practice_python-crawling-practice-2.ipynb ├── W04-2_text-mining-for-practice_python-crawling-practice-3.ipynb └── W04-3_text-mining-for-practice_python-crawling-practice-4.ipynb ├── week_05 ├── W05-1_text-mining-for-practice_python-korean-nlp.ipynb ├── W05-2_text-mining-for-practice_python-ner.ipynb └── data │ ├── article_sample.txt │ ├── novel_sample_en.txt │ └── novel_sample_ko.txt ├── week_06 ├── W06-1_text-mining-for-practice_python-tf-idf.ipynb └── data │ ├── article_sample.txt │ ├── novel_sample_en.txt │ └── novel_sample_ko.txt ├── week_08 ├── W08-1_text-mining-for-practice_python_text-classification.ipynb └── data │ ├── chat_intent.txt │ └── chat_intent_total.txt ├── week_09 ├── W09_1_text_mining_for_practice_text_clustering.ipynb └── data │ ├── article_sample.txt │ └── football_news_data.txt ├── week_10 ├── W10-1_text-mining-for-practice_python_text-summerization.ipynb └── data │ ├── article_sample.txt │ └── article_temp.txt └── week_11 ├── W11-1_advanced-text-mining_python-network-analysis.ipynb └── data ├── abstract_list.txt └── article_sample.txt /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TEXT MINING for PRACTICE 2 | 3 | > 비정형 데이터는 전세계 전체 데이터의 70% 이상을 차지하고 있으며, 비정형 데이터에서 가치를 찾아내는 것이 데이터 분석의 성과를 좌우하고 있습니다. 본 자료는 비정형 데이터 중 텍스트 데이터에 집중하여, 실무에서 활용 가능한 다양한 텍스트 분석기법에 대해 소개합니다. 특히 한국어 텍스트 분석에 집중하여 한국어 처리의 장벽을 넘어 실무에서 무리 없이 텍스트 데이터 분석에 접근할 수 있도록 내용을 구성하였습니다. 이론은 텍스트 분석에 대한 기초개념부터 머신러닝을 활용한 텍스트 분석기법에 대한 개념에 대해 다루며, 실습에서는 이론수업에서 배운 내용을 Python 프로그래밍 언어를 활용하여 실제 적용해볼 수 있도록 코드를 제공합니다. 프로그래밍 언어에 익숙하지 않은 학생들을 위해 Python 기본문법에 대해 반복적으로 학습하며, 완성된 코드를 제공하고 핵심 포인트를 수정하는 방식으로 진행하여 비정형 데이터 분석에 전혀 경험이 없는 학생들도 이해할 수 있도록 내용을 구성하였습니다. 4 | 5 | - 본 자료는 텍스트 마이닝을 활용한 연구 및 강의를 위한 목적으로 제작되었습니다. 6 | - 본 자료를 강의 목적으로 활용하고자 하시는 경우 꼭 아래 메일주소로 연락주세요. 7 | - 본 자료에 대한 허가되지 않은 배포를 금지합니다. 8 | - 강의, 저작권, 출판, 특허, 공동저자에 관련해서는 문의 바랍니다. 9 | - **Contact : ADMIN(admin@teanaps.com)** 10 | 11 | --- 12 | ## Notice! 13 | > - 본 자료는 2019년 부터 연세대학교 텍스트 마이닝(비정형 데이터 분석) 강의자료로 활용되고 있습니다. 14 | 15 | --- 16 | ## Curriculum 17 | 18 | > `WEEK 04`를 제외한 모든 실습은 `Google Colabotory`와 텍스트 마이닝을 위한 `TEANAPS` Python 패키지를 활용하여 구성하였습니다. `Google Colabotory`는 `Jupyter Notebook`을 `Google Drive`에 업로드하여 로컬 환경의 `Jupyter Notebook`과 동일하게 사용할 수 있도록 도와줍니다. `Google Colabotory`의 사용법은 강의자료의 [메뉴얼](https://github.com/fingeredman/text-mining-for-practice/blob/master/lecture-note/text-mining-for-practice_lecture-guide_210830.pdf) 파일을, `TEANAPS`의 사용법 및 설치방법은 [TEANAPS WIKI](https://github.com/fingeredman/teanaps/wiki#teanaps-text-analysis-apis-for-education)를 참고 바랍니다. `WEEK 04` 실습자료는 가상의 웹브라우저를 사용하는 데이터 수집방법(`Selenium`)을 포함하고 있어 클라우드 환경에서의 실습이 어렵습니다. `WEEK 04` 실습은 예외적으로 로컬 환경의 `Jupyter Notebook`을 활용합니다. 19 | 20 | #### WEEK 01. 텍스트 마이닝 개요 21 | - 텍스트 마이닝 기본개념 및 유형 22 | - Python 3.7 & Jupyter Notebook 23 | - 실습 24 | > _W01-1. 실습환경: Python 3.7 & Jupyter Notebook & Google Colaboratory [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_01/W01-1_text-mining-for-practice_colaboratory.ipynb)_ 25 | 26 | #### WEEK 02. 텍스트 마이닝 사례연구 27 | - 텍스트 마이닝 연구/실무 적용사례 28 | - 텍스트 데이터를 위한 Python 프로그래밍 29 | - 실습 30 | > _W02-1. 텍스트 데이터를 다루기 위한 Python: 기본문법 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_02/W02-1_text-mining-for-practice_python-basic.ipynb)_ 31 | > _W02-2. 텍스트 데이터를 다루기 위한 Python: 자료구조 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_02/W02-2_text-mining-for-practice_python-data-structure.ipynb)_ 32 | > _W02-3. 텍스트 데이터를 다루기 위한 Python: 반복문과 조건문 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_02/W02-3_text-mining-for-practice_python-conditional%26loop.ipynb)_ 33 | > _W02-4. 텍스트 데이터를 다루기 위한 Python: 함수와 파일입출력 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_02/W02-4_text-mining-for-practice_python-function%26file.ipynb)_ 34 | 35 | #### WEEK 03. 텍스트 데이터 수집 1 36 | - 텍스트 데이터 유형 및 수집방법 37 | - 웹 스크래핑 기초 38 | - 실습 39 | > _W03-1. 데이터 크롤링 원리 이해하기 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_03/W03-1_text-mining-for-practice_python-crawling-intro.ipynb)_ 40 | > _W03-2. 정적페이지 수집하기: 영화댓글 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_03/W03-2_text-mining-for-practice_python-crawling-practice-1.ipynb)_ 41 | 42 | #### WEEK 04. 텍스트 데이터 수집 2 43 | - 웹 스크래핑 자동화 및 실전 활용법 44 | - 텍스트 데이터 핸들링 45 | - 실습 46 | > _W04-1. 동적페이지 수집하기: 네이버 카페 게시글/댓글 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_04/W04-1_text-mining-for-practice_python-crawling-practice-2.ipynb)_ 47 | > _W04-2. 동적페이지 수집하기: Google 플레이스토어, Apple 앱스토어 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_04/W04-2_text-mining-for-practice_python-crawling-practice-3.ipynb)_ 48 | > _W04-3. 동적페이지 수집하기: 네이버 뉴스기사 본문/댓글 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_04/W04-3_text-mining-for-practice_python-crawling-practice-4.ipynb)_ 49 | 50 | #### WEEK 05. 텍스트 데이터 전처리 51 | - 형태소분석과 개체명인식 52 | - KoNLPy & NLTK & TEANAPS 53 | - 실습 54 | > _W05-1. 한국어 텍스트 데이터 전처리하기: KoNLPy & TEANAPS [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_05/W05-1_text-mining-for-practice_python-korean-nlp.ipynb)_ 55 | > _W05-2. 개체명인식 수행하기: TEANAPS NER [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_05/W05-2_text-mining-for-practice_python-ner.ipynb)_ 56 | 57 | #### WEEK 06. 단어의 가중치를 표현하는 방법 58 | - 단어빈도와 TF-IDF 59 | - 단어 네트워크와 중심성 60 | - 실습 61 | > _W06-1. 단어빈도와 TF-IDF 계산하기 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_06/W06-1_text-mining-for-practice_python-tf-idf.ipynb)_ 62 | 63 | #### WEEK 07. 텍스트 분석을 위한 머신러닝/딥러닝 64 | - 머신러닝 기초 65 | - 순차 레이블링: MM, HMM, CRF 66 | 67 | #### WEEK 08. 텍스트 분석 방법론 1 68 | - CNN, RNN을 활용한 텍스트 데이터 분류 69 | - Transformer 모델 기반 텍스트 감성분석 70 | - 실습 71 | > _W07-1. 문장 의도분류 및 감성분석 수행하기 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_08/W08-1_text-mining-for-practice_python_text-classification.ipynb)_ 72 | 73 | #### WEEK 09. 텍스트 분석 방법론 2 74 | - 텍스트 유사도와 군집화 75 | - 토픽모델링 76 | - 실습 77 | > _W08-1. K-평균 군집화와 LDA 토픽모델링을 활용해 문서 군집화하기 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_09/W09_1_text_mining_for_practice_text_clustering.ipynb)_ 78 | 79 | #### WEEK 10. 텍스트 분석 방법론 3 80 | - 문서요약: 추출요약과 생성요약 81 | - 핵심 키워드 추출 82 | - 실습 83 | > _W09-1. 뉴스기사 요약과 키워드 추출하기 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_10/W10-1_text-mining-for-practice_python_text-summerization.ipynb)_ 84 | 85 | #### WEEK 11. 텍스트 분석 방법론 4 86 | - 그래프 기초이론과 네트워크 분석 87 | - 단어 네트워크와 중심성 88 | - 실습 89 | > _W10-1. 단어 네트워크 중심성 계산하기 [(Colab)](https://colab.research.google.com/github/fingeredman/text-mining-for-practice/blob/master/practice-note/week_11/W11-1_advanced-text-mining_python-network-analysis.ipynb)_ 90 | 91 | #### WEEK 12. 머신러닝/딥러닝 기반 대화 모델링 92 | - Question & Answering 93 | - Chat-bot: 질의응답부터 일상대화 까지 94 | - 카카오 i 오픈빌더 95 | - 실습 96 | > _W12-1. 카카오 i 오픈빌더를 활용해 Q/A 챗봇 구축하기_ 97 | 98 | --- 99 | ## References 100 | > 본 강의자료는 아래 문헌들을 참고해 구성되었습니다. 101 | - A Byte of Python [(Link)](https://python.swaroopch.com/) 102 | - 패스트캠퍼스 <텍스트 분석 유치원 1기~5기> 실습자료 [(Link)](https://www.fastcampus.co.kr/data_class_textmining/) 103 | - 텍스트 마이닝(Text Mining), 송민 지음, 청람출판사, 2017 104 | - 파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문, 쿠지라 히코우즈쿠에, 위키북스, 2017 105 | - Natural Language Processing with PyTorch, 김기현 [(Link)](https://kh-kim.gitbook.io/natural-language-processing-with-pytorch/) 106 | 107 | --- 108 | ## Update History 109 | > 2022.04.02. `WEEK 10~12` 강의자료 및 실습자료 업데이트 110 | > 2022.03.13. `WEEK 07~09` 강의자료 및 실습자료 업데이트 111 | > 2022.02.26. `WEEK 04~06` 강의자료 및 실습자료 업데이트 112 | > 2021.09.11. 2021 하반기 커리큘럼 업데이트, `WEEK 01~03` 강의자료 및 실습자료 업데이트 113 | > 2020.12.05. `WEEK 07~12` 강의자료 및 실습자료 업데이트 114 | > 2020.11.08. `WEEK 01~06` 강의자료 및 실습자료 업데이트 115 | > 2020.04.12. 목차 구성 수정 116 | > 2019.11.23. `TEANAPS v0.4.1` 업데이트 반영 117 | > 2019.09.29. 목차 구성 수정, `TEANAPS v0.3.1` 업데이트 반영 118 | > 2019.08.26. 실습자료 `Colabotory` 링크 추가 119 | > 2019.07.12. 목차 구성 수정, `WEEK 01~12` 강의자료, `WEEK 01~08` 실습자료 업데이트 120 | > 2019.06.22. 목차 구성 수정, `WEEK 01~03` 실습자료 업데이트 121 | > 2019.06.17. 목차 구성 수정 122 | > 2019.06.16. 목차 구성 수정, `WEEK 01~05` 실습자료 업로드 123 | > 2019.06.14. 목차 구성 수정, `WEEK 01` 실습자료 업로드 124 | > 2019.06.07. 목차 구성 초안 입력 125 | 126 | --- 127 |
128 | 마블 3000만큼 사랑합니다 태그로 둘러쌓여 있습니다.\n",
200 | "# 태그로도 해당 부분을 가져올 수 있지만 정확도를 높이기 위해 그 상위태그인 \n",
230 | "관람객\n",
231 | "\n",
232 | "\r\n",
233 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
234 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
235 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
236 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t기대도 안했는데 기대이하였음 디즈니에 개실망 \r\n",
237 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
238 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
239 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
240 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\n",
241 | " 태그가 아닌 상위태그 \n",
276 | "관람객\n",
277 | "\n",
278 | "\r\n",
279 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
280 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
281 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
282 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t기대도 안했는데 기대이하였음 디즈니에 개실망 \r\n",
283 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
284 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
285 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n",
286 | "\t\t\t\t\t\t\t\t\t\t\t\t\t\n",
287 | " 태그만 골라 가져옵니다.\n",
293 | "# class 속성이 없는 경우 입력하지 않아도 됩니다.\n",
294 | "for comment in comment_list:\n",
295 | " print(comment.find(\"p\"))\n",
296 | " break"
297 | ]
298 | },
299 | {
300 | "cell_type": "code",
301 | "execution_count": 15,
302 | "metadata": {},
303 | "outputs": [
304 | {
305 | "name": "stdout",
306 | "output_type": "stream",
307 | "text": [
308 | "기대도 안했는데 기대이하였음 디즈니에 개실망\n",
309 | "디즈니..넘 실망....어떻게 그럴수있니\n",
310 | "영화에 짜장이 묻으면 이 꼴 나는구나 ㅋ\n",
311 | "내 어린시절 뮬란을 이렇게 망치지마\n",
312 | "중국이 싫다고 1점 주지는 맙시다. 저는 이 영화가 싫어서 1점 줍니다.\n",
313 | "돈으로 헐리우드를 샀지만 관객마음은 못사지\n",
314 | "이번 영화는 그저 유역비를 보고싶어하는 이들을 위한 팬심 영화인듯 이거 보지 마시고 예고편이 더 재밌어요\n",
315 | "개봉하기전에 이미 봤다...ㅋㅋㅋㅋ견자단하고 이연걸 아깝다... 여기 왜 출연했어..\n",
316 | "이번만큼은 동의 합니다. 찌꺼기라는 평론가의 평점을..\n",
317 | "21세기 희대의 망작. 디즈니 주주로써 화가 치밀어 오른다\n"
318 | ]
319 | }
320 | ],
321 | "source": [
322 | "# findAll 함수를 한번 더 활용하여 태그 하위태그 중 태그만 골라 가져옵니다.\n",
323 | "for comment in comment_list:\n",
324 | " #print(comment.find(\"p\").findAll(\"span\"))\n",
325 | " span_tag_list = comment.find(\"p\").findAll(\"span\")#.findALL(\"span\")\n",
326 | " if span_tag_list[0].text == \"관람객\":\n",
327 | " print(span_tag_list[1].text.strip())\n",
328 | " else:\n",
329 | " print(span_tag_list[0].text.strip())"
330 | ]
331 | },
332 | {
333 | "cell_type": "code",
334 | "execution_count": 16,
335 | "metadata": {},
336 | "outputs": [],
337 | "source": [
338 | "# 6. 가져온 데이터 정리해서 파일에 저장하기\n",
339 | "# 새로운 파일을 생성해서 영화댓글을 저장합니다.\n",
340 | "f = open(\"movie_comment.txt\", \"w\", encoding=\"utf-8\")\n",
341 | "for comment in comment_list:\n",
342 | " #print(comment.find(\"p\").findAll(\"span\"))\n",
343 | " span_tag_list = comment.find(\"p\").findAll(\"span\")#.findALL(\"span\")\n",
344 | " if span_tag_list[0].text == \"관람객\":\n",
345 | " f.write(span_tag_list[1].text.strip() + '\\n')\n",
346 | " else:\n",
347 | " f.write(span_tag_list[0].text.strip() + '\\n')\n",
348 | "f.close()"
349 | ]
350 | },
351 | {
352 | "cell_type": "code",
353 | "execution_count": 17,
354 | "metadata": {},
355 | "outputs": [
356 | {
357 | "name": "stdout",
358 | "output_type": "stream",
359 | "text": [
360 | "기대도 안했는데 기대이하였음 디즈니에 개실망\n",
361 | "디즈니..넘 실망....어떻게 그럴수있니\n",
362 | "영화에 짜장이 묻으면 이 꼴 나는구나 ㅋ\n",
363 | "내 어린시절 뮬란을 이렇게 망치지마\n",
364 | "중국이 싫다고 1점 주지는 맙시다. 저는 이 영화가 싫어서 1점 줍니다.\n",
365 | "돈으로 헐리우드를 샀지만 관객마음은 못사지\n",
366 | "이번 영화는 그저 유역비를 보고싶어하는 이들을 위한 팬심 영화인듯 이거 보지 마시고 예고편이 더 재밌어요\n",
367 | "개봉하기전에 이미 봤다...ㅋㅋㅋㅋ견자단하고 이연걸 아깝다... 여기 왜 출연했어..\n",
368 | "이번만큼은 동의 합니다. 찌꺼기라는 평론가의 평점을..\n",
369 | "21세기 희대의 망작. 디즈니 주주로써 화가 치밀어 오른다\n"
370 | ]
371 | }
372 | ],
373 | "source": [
374 | "# 파일에 저장된 실시간 검색어를 불러옵니다.\n",
375 | "f = open(\"movie_comment.txt\", encoding=\"utf-8\")\n",
376 | "for comment in f:\n",
377 | " print(comment.strip())\n",
378 | "f.close()"
379 | ]
380 | },
381 | {
382 | "cell_type": "markdown",
383 | "metadata": {
384 | "collapsed": true
385 | },
386 | "source": [
387 | "### Assignment 02. 네이버 영화댓글을 대량으로 가져오기\n",
388 | "> - 본 자료를 응용하여 네이버 영화댓글을 부가정보와 함께 대량으로 가져오는 코드를 작성합니다.\n",
389 | "> - 영화댓글 페이지의 100페이지 분량의 댓글을 수집합니다.\n",
390 | "> - 영화댓글 텍스트와 함께, 작성일자와 평점을 같이 가져옵니다.\n",
391 | "> - 영화댓글, 작성일자, 평점을 탭(\\t) 단위로 구분하여 파일에 저장합니다. \n",
392 | "\n",
393 | "> HINT. 영화댓글 URL 맨 뒤의 숫자는 페이지 번호를 의미합니다. (\"&page=1\")\n",
394 | "\n",
395 | "---"
396 | ]
397 | },
398 | {
399 | "cell_type": "code",
400 | "execution_count": null,
401 | "metadata": {},
402 | "outputs": [],
403 | "source": [
404 | "from bs4 import BeautifulSoup \n",
405 | "import requests\n",
406 | "\n",
407 | "PAGE_LIMIT = 100\n",
408 | "SAVE_FILE_PATH = \"movie_comment.txt\"\n",
409 | "\n",
410 | "f = open(SAVE_FILE_PATH, \"w\", encoding=\"utf-8\")\n",
411 | "for page in range(1, PAGE_LIMIT+1):\n",
412 | " print(page, end=\"\\r\")\n",
413 | " URL = \"https://movie.naver.com/movie/bi/mi/pointWriteFormList.nhn?code=193194&type=after&isActualPointWriteExecute=false&isMileageSubscriptionAlready=false&isMileageSubscriptionReject=false&page=\"\n",
414 | " URL = URL + str(page)\n",
415 | " response = requests.get(URL)\n",
416 | " soup = BeautifulSoup(response.text, \"html.parser\")\n",
417 | " comment_list = soup.findAll(\"div\", {'class': \"score_reple\",})\n",
418 | " for comment in comment_list:\n",
419 | " span_tag_list = comment.find(\"p\").findAll(\"span\")\n",
420 | " if span_tag_list[0].text == \"관람객\":\n",
421 | " #print(span_tag_list[1].text.strip())\n",
422 | " f.write(span_tag_list[1].text.strip() + \"\\n\")\n",
423 | " else:\n",
424 | " #print(span_tag_list[0].text.strip())\n",
425 | " f.write(span_tag_list[0].text.strip() + \"\\n\")\n",
426 | " f.flush()\n",
427 | "f.close()"
428 | ]
429 | },
430 | {
431 | "cell_type": "markdown",
432 | "metadata": {},
433 | "source": [
434 | "> HINT. zip() 함수를 활용하면 여러개 리스트를 하나의 for문으로 처리할 수 있습니다.\n",
435 | "\n",
436 | "---"
437 | ]
438 | },
439 | {
440 | "cell_type": "code",
441 | "execution_count": null,
442 | "metadata": {},
443 | "outputs": [],
444 | "source": [
445 | "list_a = [1, 2, 3, 4, 5]\n",
446 | "list_b = [\"a\", \"b\", \"c\", \"d\", \"e\"]"
447 | ]
448 | },
449 | {
450 | "cell_type": "code",
451 | "execution_count": null,
452 | "metadata": {},
453 | "outputs": [],
454 | "source": [
455 | "length = len(list_a)\n",
456 | "\n",
457 | "for i in range(length):\n",
458 | " print(list_a[i], list_b[i])"
459 | ]
460 | },
461 | {
462 | "cell_type": "code",
463 | "execution_count": null,
464 | "metadata": {},
465 | "outputs": [],
466 | "source": [
467 | "for i, j in zip(list_a, list_b):\n",
468 | " print(i, j)"
469 | ]
470 | },
471 | {
472 | "cell_type": "code",
473 | "execution_count": null,
474 | "metadata": {},
475 | "outputs": [],
476 | "source": []
477 | }
478 | ],
479 | "metadata": {
480 | "anaconda-cloud": {},
481 | "kernelspec": {
482 | "display_name": "Python 3",
483 | "language": "python",
484 | "name": "python3"
485 | },
486 | "language_info": {
487 | "codemirror_mode": {
488 | "name": "ipython",
489 | "version": 3
490 | },
491 | "file_extension": ".py",
492 | "mimetype": "text/x-python",
493 | "name": "python",
494 | "nbconvert_exporter": "python",
495 | "pygments_lexer": "ipython3",
496 | "version": "3.8.3"
497 | }
498 | },
499 | "nbformat": 4,
500 | "nbformat_minor": 1
501 | }
502 |
--------------------------------------------------------------------------------
/practice-note/week_04/W04-1_text-mining-for-practice_python-crawling-practice-2.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# TEXT MINING for PRACTICE\n",
8 | "- 본 자료는 텍스트 마이닝을 활용한 연구 및 강의를 위한 목적으로 제작되었습니다.\n",
9 | "- 본 자료를 강의 목적으로 활용하고자 하시는 경우 꼭 아래 메일주소로 연락주세요.\n",
10 | "- 본 자료에 대한 허가되지 않은 배포를 금지합니다.\n",
11 | "- 강의, 저작권, 출판, 특허, 공동저자에 관련해서는 문의 바랍니다.\n",
12 | "- **Contact : ADMIN(admin@teanaps.com)**\n",
13 | "\n",
14 | "---"
15 | ]
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {},
20 | "source": [
21 | "## WEEK 04-1. 동적 페이지 수집하기: 네이버 카페\n",
22 | "- Python을 활용해 가상의 브라우저를 띄워 웹페이지에서 데이터를 크롤링하는 방법에 대해 다룹니다.\n",
23 | "\n",
24 | "---"
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "> **\\*\\*\\* 주의사항 \\*\\*\\*** \n",
32 | "본 자료에서 설명하는 웹크롤링하는 방법은 해당 기법에 대한 이해를 돕고자하는 교육의 목적으로 사용되었으며, \n",
33 | "이를 활용한 대량의 무단 크롤링은 범죄에 해당할 수 있음을 알려드립니다."
34 | ]
35 | },
36 | {
37 | "cell_type": "markdown",
38 | "metadata": {},
39 | "source": [
40 | "### 1. 가상의 브라우저 실행하기: Chrome Driver\n",
41 | "\n",
42 | "---"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 2,
48 | "metadata": {},
49 | "outputs": [],
50 | "source": [
51 | "# 가상의 브라우저를 컨트롤 할 수 있도록 도와주는 selenium 패키지를 설치합니다.\n",
52 | "# 아래 주석을 해지하고 셀을 실행합니다.\n",
53 | "# 설치는 한번만 수행하면 되며, 재설치시 Requirement already satisfied: ~ 라는 메시지가 출력됩니다.\n",
54 | "\n",
55 | "#!pip install selenium"
56 | ]
57 | },
58 | {
59 | "cell_type": "code",
60 | "execution_count": 27,
61 | "metadata": {},
62 | "outputs": [],
63 | "source": [
64 | "# Python 코드를 통해 가상의 브라우저를 띄우기 위해 selenium 패키지를 import 합니다.\n",
65 | "import selenium\n",
66 | "from selenium import webdriver\n",
67 | "from selenium.webdriver.common.by import By\n",
68 | "from selenium.webdriver.chrome.service import Service\n",
69 | "\n",
70 | "# selenium을 활용해 브라우저를 직접 띄우는 경우, 실제 웹서핑을 할때처럼 로딩시간이 필요합니다.\n",
71 | "# 로딩시간 동안 대기하도록 코드를 구성하기위해 time 패키지를 import 합니다.\n",
72 | "import time\n",
73 | "\n",
74 | "# Python 코드를 통해 웹페이지에 정보를 요청하기 위해 BeautifulSoup, urllib 패키지를 import 합니다.\n",
75 | "from bs4 import BeautifulSoup\n",
76 | "import requests"
77 | ]
78 | },
79 | {
80 | "cell_type": "code",
81 | "execution_count": 28,
82 | "metadata": {},
83 | "outputs": [
84 | {
85 | "name": "stdout",
86 | "output_type": "stream",
87 | "text": [
88 | "1\n",
89 | "2\n"
90 | ]
91 | }
92 | ],
93 | "source": [
94 | "print(1)\n",
95 | "time.sleep(5)\n",
96 | "print(2)"
97 | ]
98 | },
99 | {
100 | "cell_type": "code",
101 | "execution_count": 29,
102 | "metadata": {},
103 | "outputs": [
104 | {
105 | "name": "stdout",
106 | "output_type": "stream",
107 | "text": [
108 | "W04-1_text-mining-for-practice_python-crawling-practice-2.ipynb\r\n",
109 | "W04-2_text-mining-for-practice_python-crawling-practice-3.ipynb\r\n",
110 | "W04-3_text-mining-for-practice_python-crawling-practice-4.ipynb\r\n",
111 | "article_코로나19_2021.01.01_2021.01.30_1.txt\r\n",
112 | "article_코로나19_2022.01.01_2022.01.30_1.txt\r\n",
113 | "\u001b[31mchromedriver\u001b[m\u001b[m\r\n",
114 | "chromedriver_mac64_m1.zip\r\n",
115 | "comment_코로나19_2021.01.01_2021.01.30_1.txt\r\n",
116 | "comment_코로나19_2022.01.01_2022.01.30_1.txt\r\n",
117 | "coupang_play.txt\r\n",
118 | "naver_cafe_dieselmania.txt\r\n"
119 | ]
120 | }
121 | ],
122 | "source": [
123 | "!ls"
124 | ]
125 | },
126 | {
127 | "cell_type": "code",
128 | "execution_count": 30,
129 | "metadata": {},
130 | "outputs": [],
131 | "source": [
132 | "# Chrome Driver를 호출합니다.\n",
133 | "chrome_options = webdriver.ChromeOptions()\n",
134 | "\n",
135 | "# 브라우저에 임의로 User-agent 옵션을 넣어 Python 코드로 접속함을 숨깁니다.\n",
136 | "chrome_options.add_argument('--user-agent=\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36\"')\n",
137 | "\n",
138 | "# Chrome Driver 파일의 경로를 지정하고 실행합니다.\n",
139 | "# Chrome Driver는 아래 링크에서 다운로드 가능합니다.\n",
140 | "# 본 Jupyter Notebook 파일과 동일한 경로에 Chrome Driver가 존재하는 경우 아래 경로를 그대로 사용합니다.\n",
141 | "\n",
142 | "#service = Service(\"chromedriver.exe\") # Windows 운영체제\n",
143 | "service = Service(\"./chromedriver\") # MAC, Linux 운영체제\n",
144 | " # 경고메시지 출력시 조치 : [시스템 환경설정] > [보안 및 개인정보 보호] > \"Chrome Drive ~ 확인없이 허용\"\n",
145 | "\n",
146 | "driver = webdriver.Chrome(service=service, options=chrome_options)"
147 | ]
148 | },
149 | {
150 | "cell_type": "markdown",
151 | "metadata": {},
152 | "source": [
153 | "Chrome Driver 다운로드 URL : http://chromedriver.chromium.org/downloads"
154 | ]
155 | },
156 | {
157 | "cell_type": "code",
158 | "execution_count": 4,
159 | "metadata": {},
160 | "outputs": [],
161 | "source": [
162 | "#driver.close()"
163 | ]
164 | },
165 | {
166 | "cell_type": "markdown",
167 | "metadata": {},
168 | "source": [
169 | "### 2. 가상의 브라우저를 활용에 사이트 접속하기\n",
170 | "\n",
171 | "---"
172 | ]
173 | },
174 | {
175 | "cell_type": "code",
176 | "execution_count": 31,
177 | "metadata": {},
178 | "outputs": [],
179 | "source": [
180 | "# 브라우저에서 URL에 해당하는 페이지로 이동합니다.\n",
181 | "URL = \"https://icons8.com/icons/set/customer-service\"\n",
182 | "driver.get(URL)\n",
183 | "# 실제 페이지가 불러와지는 시간을 고려해 sleep(SEC) 함수로 기다리는 시간을 지정해줍니다.\n",
184 | "time.sleep(2)"
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": 17,
190 | "metadata": {},
191 | "outputs": [],
192 | "source": [
193 | "# 네이버 메인페이지로 이동합니다.\n",
194 | "URL = \"https://naver.com\"\n",
195 | "driver.get(URL)\n",
196 | "time.sleep(2)"
197 | ]
198 | },
199 | {
200 | "cell_type": "code",
201 | "execution_count": 18,
202 | "metadata": {},
203 | "outputs": [],
204 | "source": [
205 | "# 네이버 카페에 접근하기 위해서는 로그인이 필요합니다.\n",
206 | "# 네이버 로그인 페이지로 이동합니다.\n",
207 | "# click() 함수로 원하는 요소(태그)를 클릭할 수 있습니다.\n",
208 | "# request > .find, .findAll\n",
209 | "#soup.find / findALL()\n",
210 | "driver.find_element(By.CLASS_NAME, \"link_login\").click()\n",
211 | "time.sleep(2)"
212 | ]
213 | },
214 | {
215 | "cell_type": "code",
216 | "execution_count": 19,
217 | "metadata": {},
218 | "outputs": [],
219 | "source": [
220 | "# 네이버 로그인 페이지에서 아이디(ID)와 비밀번호(PW)를 입력합니다.\n",
221 | "# 아이디와 비밀번호를 브라우저에서 직접 입력해도 됩니다.\n",
222 | "ID = \"여기에 ID를 입력합니다.\"\n",
223 | "PW = \"여기에 PW를 입력합니다.\"\n",
224 | "driver.find_element(By.NAME, \"id\").send_keys(ID)\n",
225 | "driver.find_element(By.NAME, \"pw\").send_keys(PW)"
226 | ]
227 | },
228 | {
229 | "cell_type": "code",
230 | "execution_count": 9,
231 | "metadata": {},
232 | "outputs": [],
233 | "source": [
234 | "# 로그인 버튼을 클릭해 로그인합니다.\n",
235 | "# 대부분의 경우 자동입력 방지문자 입력이 화면이 출력됩니다.\n",
236 | "# 이 경우 브라우저에서 직접 로그인합니다.\n",
237 | "# 직접 로그인 하는 경우 이 셀을 실행하지 않아도 됩니다.\n",
238 | "#driver.find_element(By.NAME, \"frmNIDLogin\").submit()\n",
239 | "#time.sleep(2)"
240 | ]
241 | },
242 | {
243 | "cell_type": "markdown",
244 | "metadata": {},
245 | "source": [
246 | "### 3. 네이버 카페 게시물 링크 수집하기\n",
247 | "\n",
248 | "---"
249 | ]
250 | },
251 | {
252 | "cell_type": "code",
253 | "execution_count": 21,
254 | "metadata": {},
255 | "outputs": [],
256 | "source": [
257 | "# 수집할 카페 게시물의 링크주소를 저장할 리스트를 생성합니다.\n",
258 | "post_list = []\n",
259 | "\n",
260 | "# 브라우저에서 직접 내가 수집할 카페에 접속합니다.\n",
261 | "# 카페 검색기능을 활용해 수집하고 싶은 내용을 검색합니다.\n",
262 | "# 키워드, 기간, 정렬기준 등을 지정해 원하는 검색결과를 화면에 띄웁니다.\n",
263 | "# 검색 후 게시물 리스트가 포함된 \"진짜 URL\"을 찾아냅니다.\n",
264 | "# URL을 복사할 때 맨뒤에 \"...%26search.page=3\" 부분의 숫자(페이지번호)는 제거하고 입력합니다.\n",
265 | "# 예시는 네이버 카페 \"디젤매니아\"에서 \"청바지\"라는 키워드로 검색된 게시물 URL 입니다.\n",
266 | "# 게시물 열람이 가능한 계정으로 카페에 접근해야 수집이 가능합니다.\n",
267 | "URL = \"https://cafe.naver.com/ArticleSearchList.nhn?search.clubid=11262350&search.media=0&search.searchdate=all&userDisplay=15&search.option=0&search.sortBy=date&search.searchBy=0&search.query=%C3%BB%B9%D9%C1%F6&search.viewtype=title&search.page=\"\n",
268 | "\n",
269 | "# 몇 페이지 까지 게시물의 URL을 수집할지 지정합니다.\n",
270 | "# 최대 페이지 수를 넘지 않도록 주의합니다.\n",
271 | "page_limit = 3\n",
272 | "\n",
273 | "# FOR 문을 활용해 페이지 번호를 반복합니다.\n",
274 | "for page_num in range(1, page_limit+1):\n",
275 | " # 검색결과 페이지로 이동합니다.\n",
276 | " driver.get(URL + str(page_num))\n",
277 | " # 페이지에서 게시물 리스트가 포함된 프레임으로 이동합니다.\n",
278 | " # 21.10.16 수정\n",
279 | " #driver.switch_to_frame(driver.find_element(By.NAME, \"cafe_main\"))\n",
280 | " driver.switch_to.frame(driver.find_element(By.NAME, \"cafe_main\"))\n",
281 | " \n",
282 | " # 게시물 태그를 모두 불러옵니다.\n",
283 | " elem = driver.find_elements(By.CLASS_NAME, \"article\")\n",
284 | " for e in elem:\n",
285 | " # 웹페이지의 하이퍼링크 URL은 항상 href 속성에 존재합니다.\n",
286 | " # href 속성에 저장된 URL을 불러와 post_list에 추가합니다.\n",
287 | " post_list.append(e.get_attribute(\"href\"))\n",
288 | " # 아래 주석부분은 위 25~29번째 라인과 동일한 코드입니다.\n",
289 | " # 혹시 post_list에 URL이 저장되지 않는 경우 아래처럼 태그의 Class 속성을 \"article\"에서 \"aaa\"로 변경해줍니다.\n",
290 | " '''\n",
291 | " elem = driver.find_elements(By.CLASS_NAME, \"aaa\")\n",
292 | " for e in elem:\n",
293 | " post_list.append(e.find_element(By.TAG_NAME, \"a\").get_attribute(\"href\"))\n",
294 | " '''\n",
295 | " # 페이지의 기본 프레임으로 이동합니다.\n",
296 | " driver.switch_to.default_content() \n",
297 | " time.sleep(2)"
298 | ]
299 | },
300 | {
301 | "cell_type": "code",
302 | "execution_count": 22,
303 | "metadata": {},
304 | "outputs": [
305 | {
306 | "name": "stdout",
307 | "output_type": "stream",
308 | "text": [
309 | "수집된 게시물 URL 개수 : 45\n"
310 | ]
311 | }
312 | ],
313 | "source": [
314 | "# 총 몇개의 게시물 URL이 저장되었는지 확인합니다.\n",
315 | "print(\"수집된 게시물 URL 개수 :\", len(post_list))"
316 | ]
317 | },
318 | {
319 | "cell_type": "code",
320 | "execution_count": 23,
321 | "metadata": {},
322 | "outputs": [
323 | {
324 | "name": "stdout",
325 | "output_type": "stream",
326 | "text": [
327 | "['https://cafe.naver.com/ca-fe/ArticleRead.nhn?clubid=11262350&page=1&inCafeSearch=true&searchBy=0&query=%EC%B2%AD%EB%B0%94%EC%A7%80&includeAll=&exclude=&include=&exact=&searchdate=all&media=0&sortBy=date&articleid=37226605&referrerAllArticles=true']\n"
328 | ]
329 | }
330 | ],
331 | "source": [
332 | "# URL이 잘 저장되어 있는지 인덱싱을 통해 일부만 확인해봅니다.\n",
333 | "print(post_list[:1])"
334 | ]
335 | },
336 | {
337 | "cell_type": "code",
338 | "execution_count": 24,
339 | "metadata": {},
340 | "outputs": [
341 | {
342 | "name": "stdout",
343 | "output_type": "stream",
344 | "text": [
345 | "https://cafe.naver.com/ca-fe/ArticleRead.nhn?clubid=11262350&page=1&inCafeSearch=true&searchBy=0&query=%EC%B2%AD%EB%B0%94%EC%A7%80&includeAll=&exclude=&include=&exact=&searchdate=all&media=0&sortBy=date&articleid=37226605&referrerAllArticles=true\n"
346 | ]
347 | }
348 | ],
349 | "source": [
350 | "print(post_list[0])"
351 | ]
352 | },
353 | {
354 | "cell_type": "markdown",
355 | "metadata": {},
356 | "source": [
357 | "### 4. 네이버 카페 게시물 본문과 댓글 수집하기\n",
358 | "\n",
359 | "---"
360 | ]
361 | },
362 | {
363 | "cell_type": "code",
364 | "execution_count": 25,
365 | "metadata": {},
366 | "outputs": [
367 | {
368 | "name": "stdout",
369 | "output_type": "stream",
370 | "text": [
371 | "9/9\r"
372 | ]
373 | }
374 | ],
375 | "source": [
376 | "# 게시물 URL이 저장된 post_list에서 몇번째 부터(start) 몇번째 까지(end) URL에 접근할지 지정합니다.\n",
377 | "start = 0\n",
378 | "end = 9\n",
379 | "\n",
380 | "# 게시물 내용을 저장할 파일을 생성합니다.\n",
381 | "f = open(\"naver_cafe_dieselmania.txt\", \"w\", encoding=\"utf-8\")\n",
382 | "\n",
383 | "# FOR 문을 활용해 페이지 URL을 반복합니다.\n",
384 | "for url in post_list[start:end]:\n",
385 | " # 현재 수집이 진행중인 인덱스를 출력합니다.\n",
386 | " print(str(start+1) + \"/\" + str(end), end=\"\\r\")\n",
387 | " start += 1\n",
388 | " try:\n",
389 | " # URL을 통해 게시물 페이지로 이동합니다.\n",
390 | " driver.get(url)\n",
391 | " time.sleep(5)\n",
392 | " # 페이지에서 게시물 내용이 포함된 프레임으로 이동합니다.\n",
393 | " driver.switch_to.frame(driver.find_element(By.NAME, \"cafe_main\"))\n",
394 | "\n",
395 | " # 페이지에서 태그의 속성을 활용해 원하는 부분을 불러옵니다.\n",
396 | " # 1. 게시물 제목\n",
397 | " title = driver.find_element(By.CLASS_NAME, \"title_text\").text.strip()\n",
398 | " #title = elem.find_elements(By.TAG_NAME, \"td\")[0].text\n",
399 | " # 2. 게시판 이름\n",
400 | " board_type = driver.find_element(By.CLASS_NAME, \"link_board\").text.strip()\n",
401 | " # 3. 게시물 작성일자\n",
402 | " datetime = driver.find_element(By.CLASS_NAME, \"date\").text\n",
403 | " # 4. 게시물 작성자(닉네임)\n",
404 | " user = driver.find_element(By.CLASS_NAME, \"nickname\").text\n",
405 | " # 5. 게시물 내용\n",
406 | " # 파일에서 게시물 구분을 줄단위로 하기위해 줄바꿈을 모두 제거합니다.\n",
407 | " contents = driver.find_element(By.CLASS_NAME, \"article_viewer\").text.replace(\"\\n\", \" \")\n",
408 | " # 파일에 수집한 게시물 내용을 기록합니다.\n",
409 | " f.write(\"POSTING\" + \"\\t\" + user + \"\\t\" + datetime + \\\n",
410 | " \"\\t\" + board_type + \"\\t\" + title + \"\\t\" + contents + \"\\n\") \n",
411 | "\n",
412 | " # 댓글을 모두 불러옵니다.\n",
413 | " reply_list = driver.find_elements(By.CLASS_NAME, \"comment_box\")\n",
414 | " # FOR 문을 활용해 댓글을 모두 반복합니다.\n",
415 | " for reply in reply_list:\n",
416 | " # 6. 댓글 내용\n",
417 | " comment = reply.find_element(By.CLASS_NAME, \"text_comment\").text.replace(\"\\n\", \" \")\n",
418 | " # 7. 댓글 작성자(닉네임)\n",
419 | " user_nik = reply.find_element(By.CLASS_NAME, \"comment_nickname\").text\n",
420 | " # 8. 댓글 작성일자\n",
421 | " reply_date = reply.find_element(By.CLASS_NAME, \"comment_info_date\").text\n",
422 | " # 파일에 수집한 댓글 내용을 기록합니다.\n",
423 | " f.write(\"COMMENT\" + \"\\t\" + user_nik + \"\\t\" + reply_date + \\\n",
424 | " \"\\t\" + board_type + \"\\t\" + \"None\" + \"\\t\" + comment + \"\\n\")\n",
425 | " # 페이지의 기본 프레임으로 이동합니다.\n",
426 | " driver.switch_to.default_content()\n",
427 | " time.sleep(2)\n",
428 | " except:\n",
429 | " driver.switch_to.default_content()\n",
430 | " time.sleep(2)\n",
431 | " continue\n",
432 | "f.close()"
433 | ]
434 | },
435 | {
436 | "cell_type": "code",
437 | "execution_count": 15,
438 | "metadata": {},
439 | "outputs": [],
440 | "source": [
441 | "# Chrome Driver를 닫습니다.\n",
442 | "driver.close()"
443 | ]
444 | },
445 | {
446 | "cell_type": "code",
447 | "execution_count": 16,
448 | "metadata": {
449 | "scrolled": false
450 | },
451 | "outputs": [
452 | {
453 | "name": "stdout",
454 | "output_type": "stream",
455 | "text": [
456 | "POSTING\t무시하지마세요\t2022.01.31. 12:34\t■디매인 라이프■\t요즘 유행하는 청바지가 있나요?\t디젤 돌체 디퀘 누디 이런거 이후에 지금 유행하는 청바지가 있나요? 없으면 추천좀... ㅠㅠ\n",
457 | "COMMENT\tlililllllil\t2022.01.31. 12:34\t■디매인 라이프■\tNone\t보세\n",
458 | "COMMENT\t아가리해\t2022.01.31. 12:35\t■디매인 라이프■\tNone\t에비수\n",
459 | "COMMENT\t모쏠아다찐따\t2022.01.31. 12:35\t■디매인 라이프■\tNone\t무파진\n",
460 | "COMMENT\t젖\t2022.01.31. 12:35\t■디매인 라이프■\tNone\t트루릴리전\n",
461 | "COMMENT\t따듯한아메리카노좋아\t2022.01.31. 12:35\t■디매인 라이프■\tNone\t트루릴리젼 락리바이벌\n",
462 | "COMMENT\t그게아니구\t2022.01.31. 12:35\t■디매인 라이프■\tNone\t잠뱅이\n",
463 | "COMMENT\t금쪽같은개새끼\t2022.01.31. 12:36\t■디매인 라이프■\tNone\t뱅뱅 tbj\n",
464 | "COMMENT\t시즈오카\t2022.01.31. 12:57\t■디매인 라이프■\tNone\t발렌티노 예쁘던데욤\n",
465 | "POSTING\t기본템매니아\t2022.01.31. 02:28\t디매인 패션\t[청바지매니아] 뒷북인데 핫시 김현우님 청바지 마르지엘라인가요? 아시는 분\t김현우님이 입은게 옛날 마르지엘라 청바지라는 사람도 있고 솔리드옴므라는 사람도 있고 분분한데 밑에 사진 2장은 rote라는 없어진 국내브랜드? 청바지거든요 이 디자인이 마르지엘라 카피인가요? 아니면 자체 디자인? 김현우님이 보세 입는거는 본 적 없는듯해서,, 헷갈리네요\n",
466 | "COMMENT\t재상이김치\t2022.01.31. 02:30\t디매인 패션\tNone\t카피져\n",
467 | "COMMENT\t기본템매니아\t2022.01.31. 02:33\t디매인 패션\tNone\t아하! 혹시 모델 아신다면 정보좀 부탁드려요\n",
468 | "COMMENT\t포로리야아아아\t2022.01.31. 11:29\t디매인 패션\tNone\t커멜에 똑같은더 있었는데 품절됨\n",
469 | "POSTING\t단활\t2022.01.30. 22:11\t■디매인 라이프■\t아끼던 청바지 엉덩이 터졌어요ㅋㅋ\n",
470 | "COMMENT\t흑희영\t2022.01.30. 22:11\t■디매인 라이프■\tNone\n",
471 | "COMMENT\t단활\t2022.01.30. 22:12\t■디매인 라이프■\tNone\t박스들다가 그만 ,,\n",
472 | "COMMENT\t왕왕멍멍냥냥\t2022.01.30. 22:12\t■디매인 라이프■\tNone\t파워엉덩맨\n",
473 | "COMMENT\t단활\t2022.01.30. 22:12\t■디매인 라이프■\tNone\n",
474 | "COMMENT\t아카리 츠무기\t2022.01.30. 22:13\t■디매인 라이프■\tNone\t찢청...\n",
475 | "COMMENT\t단활\t2022.01.30. 22:14\t■디매인 라이프■\tNone\t찢엉...\n",
476 | "POSTING\t피구왕통ㅋ\t2022.01.29. 20:56\t■디매인 라이프■\t똥퀘 그분은 청바지 어떻게 세탁 했을까요?\t갑자기 궁금…\n",
477 | "COMMENT\t댓글\t2022.01.29. 20:57\t■디매인 라이프■\tNone\t떵 치우는건 쉬워요 그냥 물로 덩어리 좀 털어내고 솔로 살살 문지르고 세탁기 돌리면 됩니다\n",
478 | "COMMENT\t섹도시발\t2022.01.29. 20:58\t■디매인 라이프■\tNone\t디퀘에 똥싼사건이 있었나여?\n",
479 | "COMMENT\t북극\t2022.01.29. 21:02\t■디매인 라이프■\tNone\t네 레전드ㅋㅋㅋ 심지어 그거 중고로 판다고 그래서 비상걸렸음요ㅋㅋㅋㅋ 사이즈도 몰라서 당분간 그 모델 거르라고ㅋㅋㅋㅋㅋ\n",
480 | "POSTING\t백곰과여우\t2022.01.29. 20:45\t■디매인 라이프■\t청바지에 투자하시는 분들 많이 계신가요??\t모드나 피스 등 국내 도메랑 해외 고가? 청바지랑 차이가 있을까요?? 아크네나 아페세 구매할려고 뒤져보고 있는데 너무 피곤해서요 ㅠㅠㅠ\n",
481 | "COMMENT\t북극\t2022.01.29. 20:45\t■디매인 라이프■\tNone\t핏 >>> 브랜드, 가격\n",
482 | "COMMENT\t백곰과여우\t2022.01.29. 20:47\t■디매인 라이프■\tNone\t피스워커뺴고 다 안입어봣는데.. 국내 도메부터 하나씩 사봐야겠네요 ㅠ\n",
483 | "COMMENT\t488spider\t2022.01.29. 20:45\t■디매인 라이프■\tNone\t디테일도잇고뭐 다양하져 차이는\n",
484 | "POSTING\t짧은다리182\t2022.01.29. 18:30\t디매인 패션\t아워레가시 청바지 사이즈 질문이요!\t써드컷 31 사이즈 딱 좋은데 포멀컷은 사이즈 어떻게 가면 될까요?\n",
485 | "COMMENT\t디매쿤\t2022.01.29. 18:30\t디매인 패션\tNone\t정사이즈요\n",
486 | "COMMENT\t오늘만 사는놈\t2022.01.29. 19:09\t디매인 패션\tNone\t서드컷이 포멀컷보다 클텐데 동사이즈가면 좋게 맞으실거같은데용. 이게 얇아서 금방 늘어나기도할거같아서요\n",
487 | "POSTING\t힙합빠삐용\t2022.01.29. 18:26\t■디매인 라이프■\t청바지 하나에 30이면 어때요?\t솔옴 청바지 30만,아페쎄 생지 30만.. 둘다 입어보니까 이쁘긴하더라고요..청바지에 30은 오바인가요?? 그냥 플랙진이나 리바이스급 2~3개 사는게 나을까요,, 무기명 투표 중 청바지 30만원짜리 1개 10만원짜리 3개 투표하기\n",
488 | "COMMENT\tMinerva\t2022.01.29. 18:27\t■디매인 라이프■\tNone\t사실 여기는 디젤청바지카페였음 ㅋㅋ\n",
489 | "COMMENT\t흑희영\t2022.01.29. 18:27\t■디매인 라이프■\tNone\tㄱㄱㄱㄱ\n",
490 | "COMMENT\t아젠다\t2022.01.29. 18:28\t■디매인 라이프■\tNone\t바지는 핏이 중요하다고 생각해서 2\n",
491 | "COMMENT\thyalu\t2022.01.29. 18:28\t■디매인 라이프■\tNone\t핏 잘맞으면 끝이죠\n",
492 | "COMMENT\t아 사귈까\t2022.01.29. 18:29\t■디매인 라이프■\tNone\t30하나\n",
493 | "COMMENT\t호빗킹\t2022.01.29. 18:29\t■디매인 라이프■\tNone\t리바이스 lvc도 20만원 중반\n",
494 | "COMMENT\t시즈오카\t2022.01.29. 18:42\t■디매인 라이프■\tNone\t15만 2개\n",
495 | "COMMENT\triie\t2022.01.29. 18:44\t■디매인 라이프■\tNone\t오바 아닌데 리바이스는 충분히 좋더라구요\n",
496 | "COMMENT\t츄뎡\t2022.01.29. 18:58\t■디매인 라이프■\tNone\t덜도말고 리바이스로 두개하시죠\n",
497 | "POSTING\t식혜몬\t2022.01.29. 13:37\t■디매인 라이프■\t피스워커 청바지 잘알님??\t플매2랑 플매2 라이트랑 색감 차이 많이 날까요? 플매2 라이트랑 마인워커랑 안겹치겠죠?\n",
498 | "POSTING\t키츠네3\t2022.01.29. 11:25\t■디매인 라이프■\t슬랙스나 청바지 브랜드 추천좀요!\t슬랙스는 솔타시 청바지는 아크네 아페쎄 띠어리 제외하고 다른 괜찮은 브랜드 없나요?! 가격 상관 x 도메 x\n",
499 | "COMMENT\t크르르를응\t2022.01.29. 11:53\t■디매인 라이프■\tNone\t무탠다드\n"
500 | ]
501 | }
502 | ],
503 | "source": [
504 | "# 파일에 저장된 카페 게시글 내용을 확인합니다.\n",
505 | "f = open(\"naver_cafe_dieselmania.txt\", encoding=\"utf-8\")\n",
506 | "for post in f:\n",
507 | " print(post.strip())\n",
508 | "f.close()"
509 | ]
510 | },
511 | {
512 | "cell_type": "code",
513 | "execution_count": null,
514 | "metadata": {},
515 | "outputs": [],
516 | "source": []
517 | }
518 | ],
519 | "metadata": {
520 | "kernelspec": {
521 | "display_name": "Python 3 (ipykernel)",
522 | "language": "python",
523 | "name": "python3"
524 | },
525 | "language_info": {
526 | "codemirror_mode": {
527 | "name": "ipython",
528 | "version": 3
529 | },
530 | "file_extension": ".py",
531 | "mimetype": "text/x-python",
532 | "name": "python",
533 | "nbconvert_exporter": "python",
534 | "pygments_lexer": "ipython3",
535 | "version": "3.8.12"
536 | }
537 | },
538 | "nbformat": 4,
539 | "nbformat_minor": 2
540 | }
541 |
--------------------------------------------------------------------------------
/practice-note/week_04/W04-3_text-mining-for-practice_python-crawling-practice-4.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# TEXT MINING for PRACTICE\n",
8 | "- 본 자료는 텍스트 마이닝을 활용한 연구 및 강의를 위한 목적으로 제작되었습니다.\n",
9 | "- 본 자료를 강의 목적으로 활용하고자 하시는 경우 꼭 아래 메일주소로 연락주세요.\n",
10 | "- 본 자료에 대한 허가되지 않은 배포를 금지합니다.\n",
11 | "- 강의, 저작권, 출판, 특허, 공동저자에 관련해서는 문의 바랍니다.\n",
12 | "- **Contact : ADMIN(admin@teanaps.com)**\n",
13 | "\n",
14 | "---"
15 | ]
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {},
20 | "source": [
21 | "## WEEK 04-3. 동적 페이지 수집하기: 네이버 뉴스기사\n",
22 | "- Python을 활용해 가상의 브라우저를 띄워 웹페이지에서 데이터를 크롤링하는 방법에 대해 다룹니다.\n",
23 | "\n",
24 | "---"
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "> **\\*\\*\\* 주의사항 \\*\\*\\*** \n",
32 | "본 자료에서 설명하는 웹크롤링하는 방법은 해당 기법에 대한 이해를 돕고자하는 교육과 이를 활용한 연구 목적으로 사용되었으며, 대량의 무단 크롤링 및 상업적 활용을 금합니다."
33 | ]
34 | },
35 | {
36 | "cell_type": "markdown",
37 | "metadata": {},
38 | "source": [
39 | "## 1. 데이터 수집 준비하기"
40 | ]
41 | },
42 | {
43 | "cell_type": "markdown",
44 | "metadata": {},
45 | "source": [
46 | "### 1-1. Selenium 라이브러리 설치"
47 | ]
48 | },
49 | {
50 | "cell_type": "code",
51 | "execution_count": 1,
52 | "metadata": {},
53 | "outputs": [],
54 | "source": [
55 | "# 가상의 브라우저를 컨트롤 할 수 있도록 도와주는 selenium 패키지를 설치합니다.\n",
56 | "# 아래 주석을 해지하고 셀을 실행합니다.\n",
57 | "# 설치는 한번만 수행하면 되며, 재설치시 Requirement already satisfied: ~ 라는 메시지가 출력됩니다.\n",
58 | "\n",
59 | "#!pip install selenium"
60 | ]
61 | },
62 | {
63 | "cell_type": "markdown",
64 | "metadata": {},
65 | "source": [
66 | "### 1-2. 라이브러리 Import 및 Chrome Driver 실행"
67 | ]
68 | },
69 | {
70 | "cell_type": "code",
71 | "execution_count": 2,
72 | "metadata": {},
73 | "outputs": [],
74 | "source": [
75 | "# Python 코드를 통해 가상의 브라우저를 띄우기 위해 selenium 패키지를 import 합니다.\n",
76 | "import selenium\n",
77 | "from selenium import webdriver\n",
78 | "from selenium.webdriver.common.by import By\n",
79 | "from selenium.webdriver.chrome.service import Service\n",
80 | "\n",
81 | "# selenium을 활용해 브라우저를 직접 띄우는 경우, 실제 웹서핑을 할때처럼 로딩시간이 필요합니다.\n",
82 | "# 로딩시간 동안 대기하도록 코드를 구성하기위해 time 패키지를 import 합니다.\n",
83 | "import time\n",
84 | "\n",
85 | "# Python 코드를 통해 웹페이지에 정보를 요청하기 위해 BeautifulSoup, urllib 패키지를 import 합니다.\n",
86 | "from bs4 import BeautifulSoup\n",
87 | "import requests"
88 | ]
89 | },
90 | {
91 | "cell_type": "code",
92 | "execution_count": 3,
93 | "metadata": {},
94 | "outputs": [],
95 | "source": [
96 | "# Chrome Driver를 호출합니다.\n",
97 | "chrome_options = webdriver.ChromeOptions()\n",
98 | "\n",
99 | "# 브라우저에 임의로 User-agent 옵션을 넣어 Python 코드로 접속함을 숨깁니다.\n",
100 | "chrome_options.add_argument('--user-agent=\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36\"')\n",
101 | "\n",
102 | "# Chrome Driver 파일의 경로를 지정하고 실행합니다.\n",
103 | "# Chrome Driver는 아래 링크에서 다운로드 가능합니다.\n",
104 | "# 본 Jupyter Notebook 파일과 동일한 경로에 Chrome Driver가 존재하는 경우 아래 경로를 그대로 사용합니다.\n",
105 | "\n",
106 | "#service = Service(\"./chromedriver\") # Windows 운영체제\n",
107 | "service = Service(\"./chromedriver\") # MAC, Linux 운영체제\n",
108 | " # 경고메시지 출력시 조치 : [시스템 환경설정] > [보안 및 개인정보 보호] > \"Chrome Drive ~ 확인없이 허용\"\n",
109 | "\n",
110 | "driver = webdriver.Chrome(service=service, options=chrome_options)"
111 | ]
112 | },
113 | {
114 | "cell_type": "markdown",
115 | "metadata": {},
116 | "source": [
117 | "## 2. 뉴스기사 및 댓글 수집하기\n",
118 | "\n",
119 | "---"
120 | ]
121 | },
122 | {
123 | "cell_type": "markdown",
124 | "metadata": {},
125 | "source": [
126 | "### 2-1. 뉴스기사 정보 입력"
127 | ]
128 | },
129 | {
130 | "cell_type": "code",
131 | "execution_count": 6,
132 | "metadata": {},
133 | "outputs": [],
134 | "source": [
135 | "# 수집할 뉴스기사 정보를 입력합니다.\n",
136 | "QUERY = \"코로나19\" # 필터링 키워드\n",
137 | "START_DATE = \"2022.01.01\" # 필터링 일자 (작성일 기준)\n",
138 | "END_DATE = \"2022.01.30\"\n",
139 | "START_PAGE = 1 # 검색결과 저장 페이지 범위 (네이버 뉴스기사는 검색결과 중 최대 4,000페이지만 제공)\n",
140 | "END_PAGE = 2 \n",
141 | " # 기사와 댓글을 저장할 파일명\n",
142 | "article_filename = \"article_\" + QUERY + \"_\" + START_DATE + \"_\" + END_DATE + \"_\" + str(START_PAGE) + \".txt\"\n",
143 | "comment_filename = \"comment_\" + QUERY + \"_\" + START_DATE + \"_\" + END_DATE + \"_\" + str(START_PAGE) + \".txt\""
144 | ]
145 | },
146 | {
147 | "cell_type": "markdown",
148 | "metadata": {},
149 | "source": [
150 | "### 2-2. 뉴스기사 수집"
151 | ]
152 | },
153 | {
154 | "cell_type": "code",
155 | "execution_count": 7,
156 | "metadata": {
157 | "scrolled": true
158 | },
159 | "outputs": [
160 | {
161 | "name": "stdout",
162 | "output_type": "stream",
163 | "text": [
164 | "1/3 Page, [신년사]이재명 \"오직 국민, 오직 민생 각오로 경제회복에 온 힘\" (댓글: 18건) \n",
165 | "* 최대 10 개 기사 수집이 완료되었습니다.\n",
166 | "* 수집된 기사는 아래 파일에 저장되었습니다.\n",
167 | " - 기사본문 : article_코로나19_2022.01.01_2022.01.30_1.txt\n",
168 | " - 댓글 : comment_코로나19_2022.01.01_2022.01.30_1.txt\n"
169 | ]
170 | }
171 | ],
172 | "source": [
173 | "fa = open(article_filename, \"w\", encoding=\"utf-8\")\n",
174 | "fc = open(comment_filename, \"w\", encoding=\"utf-8\")\n",
175 | "news_count = 0\n",
176 | "\n",
177 | "for page in range(START_PAGE, END_PAGE+1, 10):\n",
178 | " #print(page, \"번째 기시부터 최대 10개 수집중...\", end=\"\\r\")\n",
179 | " URL = \"https://search.naver.com/search.naver?&where=news&query=\" + QUERY \n",
180 | " URL += \"&sm=tab_pge&sort=2&photo=0&field=0&reporter_article=&pd=3&ds=\"\n",
181 | " URL += START_DATE + \"&de=\" + END_DATE + \"&docid=&&start=\" + str(page) + \"&refresh_start=0\"\n",
182 | " driver.get(URL)\n",
183 | " time.sleep(2)\n",
184 | " \n",
185 | " try:\n",
186 | " news_list = driver.find_element(By.CLASS_NAME, \"list_news\").find_elements(By.CLASS_NAME, \"bx\")\n",
187 | " except:\n",
188 | " break\n",
189 | " \n",
190 | " news_count += len(news_list)\n",
191 | " for news in news_list[:]:\n",
192 | " link_list = news.find_element(By.CLASS_NAME, \"info_group\").find_elements(By.TAG_NAME, \"a\")\n",
193 | " if len(link_list) == 1:\n",
194 | " continue\n",
195 | " article_url = link_list[1].get_attribute(\"href\").strip()\n",
196 | " link_list[1].click()\n",
197 | " time.sleep(3)\n",
198 | " current_window = driver.current_window_handle\n",
199 | " try:\n",
200 | " new_window = [window for window in driver.window_handles if window != current_window][0]\n",
201 | " driver.switch_to.window(new_window)\n",
202 | " except:\n",
203 | " driver.switch_to.window(current_window)\n",
204 | " continue\n",
205 | " time.sleep(4)\n",
206 | " \n",
207 | " try:\n",
208 | " try:\n",
209 | " source_label = driver.find_element(By.CLASS_NAME, \"press_logo\")\n",
210 | " except:\n",
211 | " source_label = driver.find_element(By.ID, \"pressLogo\")\n",
212 | " source_img = source_label.find_element(By.TAG_NAME, \"img\")\n",
213 | " source = source_img.get_attribute(\"alt\").strip()\n",
214 | "\n",
215 | " datetime = \"\"\n",
216 | " content = \"\"\n",
217 | " title = \"\"\n",
218 | " etc_good_count = \"\"\n",
219 | " etc_warm_count = \"\"\n",
220 | " etc_sad_count = \"\"\n",
221 | " etc_angry_count = \"\"\n",
222 | " etc_want_count = \"\"\n",
223 | " ent_good_count = \"\"\n",
224 | " ent_cheer_count = \"\"\n",
225 | " ent_congrats_count = \"\"\n",
226 | " ent_expect_count = \"\"\n",
227 | " ent_suprise_count = \"\"\n",
228 | " ent_sad_count = \"\"\n",
229 | " basic_good_count = \"\"\n",
230 | " basic_sad_count = \"\"\n",
231 | " basic_angry_count = \"\"\n",
232 | " basic_fan_count = \"\"\n",
233 | " basic_want_count = \"\"\n",
234 | "\n",
235 | " try:\n",
236 | " # 기타 섹션 기사\n",
237 | " datetime = driver.find_element(By.CLASS_NAME, \"t11\").text.strip()\n",
238 | " content = driver.find_element(By.CLASS_NAME, \"_article_body_contents\").text.strip().replace(\"\\n\", \" \")\n",
239 | " title = driver.find_element(By.CLASS_NAME, \"tts_head\").text.strip()\n",
240 | " reaction_list = driver.find_element(By.CLASS_NAME, \"end_btn\").find_element(By.CLASS_NAME, \"_reactionModule\").find_elements(By.TAG_NAME, \"a\")\n",
241 | " etc_good_count = reaction_list[0].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
242 | " etc_warm_count = reaction_list[1].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
243 | " etc_sad_count = reaction_list[2].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
244 | " etc_angry_count = reaction_list[3].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
245 | " etc_want_count = reaction_list[4].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
246 | " except:\n",
247 | " try:\n",
248 | " # 연예 섹션 기사\n",
249 | " datetime = driver.find_element(By.CLASS_NAME, \"author\")\n",
250 | " datetime = datetime.find_element(By.TAG_NAME, \"em\").text.strip()\n",
251 | " content = driver.find_element(By.ID, \"articeBody\").text.strip().replace(\"\\n\", \" \")\n",
252 | " title = driver.find_element(By.CLASS_NAME, \"end_tit\").text.strip()\n",
253 | " reaction_list = driver.find_element(By.CLASS_NAME, \"end_btn\").find_element(By.CLASS_NAME, \"_reactionModule\").find_elements(By.TAG_NAME, \"a\")\n",
254 | " ent_good_count = reaction_list[0].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
255 | " ent_cheer_count = reaction_list[1].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
256 | " ent_congrats_count = reaction_list[2].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
257 | " ent_expect_count = reaction_list[3].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
258 | " ent_suprise_count = reaction_list[4].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
259 | " ent_sad_count = reaction_list[5].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
260 | " except:\n",
261 | " # 일반 섹션 기사\n",
262 | " datetime = driver.find_element(By.CLASS_NAME, \"info\").find_element(By.TAG_NAME, \"span\").text.replace(\"기사입력\", \"\").strip()\n",
263 | " content = driver.find_element(By.CLASS_NAME, \"news_end\").text.strip().replace(\"\\n\", \" \")\n",
264 | " title = driver.find_element(By.CLASS_NAME, \"title\").text.strip()\n",
265 | " reaction_list = driver.find_element(By.CLASS_NAME, \"news_end_btn\").find_element(By.CLASS_NAME, \"_reactionModule\").find_elements(By.TAG_NAME, \"a\")\n",
266 | " basic_good_count = reaction_list[0].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
267 | " basic_sad_count = reaction_list[1].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
268 | " basic_angry_count = reaction_list[2].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
269 | " basic_fan_count = reaction_list[3].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
270 | " basic_want_count = reaction_list[4].find_element(By.CLASS_NAME, \"u_likeit_list_count\").text.strip()\n",
271 | "\n",
272 | " review_count_list = driver.find_elements(By.CLASS_NAME, \"u_cbox_count\")\n",
273 | " if len(review_count_list) > 0:\n",
274 | " review_count = review_count_list[0].text.replace(\",\", \"\")\n",
275 | " else:\n",
276 | " review_count = \"0\"\n",
277 | " #print(source + \"\\t\" + datetime + \"\\t\" + review_count + \"\\t\" + \n",
278 | " # good_count + \"\\t\" + warm_count + \"\\t\" + sad_count + \"\\t\" + \n",
279 | " # angry_count + \"\\t\" + want_count + \"\\t\" + article_url + \"\\t\" + \n",
280 | " # title + \"\\t\" + content)\n",
281 | " print(\" \"*100, end=\"\\r\")\n",
282 | " print(str(page)+\"/\"+str(END_PAGE+1)+\" Page,\", title + \" (댓글: \"+str(review_count)+\"건)\", end=\"\\r\")\n",
283 | " fa.write(source + \"\\t\" + datetime + \"\\t\" + review_count + \"\\t\" + \n",
284 | " ent_good_count + \"\\t\" + ent_cheer_count + \"\\t\" + ent_congrats_count + \"\\t\" + \n",
285 | " ent_expect_count + \"\\t\" + ent_suprise_count + \"\\t\" + ent_sad_count + \"\\t\" + \n",
286 | " basic_good_count + \"\\t\" + basic_sad_count + \"\\t\" + basic_angry_count + \"\\t\" + \n",
287 | " basic_fan_count + \"\\t\" + basic_want_count + \"\\t\" + \n",
288 | " etc_good_count + \"\\t\" + etc_warm_count + \"\\t\" + etc_sad_count + \"\\t\" + \n",
289 | " etc_angry_count + \"\\t\" + etc_want_count + \"\\t\" + \n",
290 | " article_url + \"\\t\" + \n",
291 | " title + \"\\t\" + content + \"\\n\")\n",
292 | " # 댓글 더보기 클릭\n",
293 | " if int(review_count) > 0:\n",
294 | " driver.find_element(By.CLASS_NAME, \"u_cbox_in_view_comment\").click()\n",
295 | " time.sleep(3)\n",
296 | "\n",
297 | " # 더보기 버튼 클릭\n",
298 | " for i in range(10):\n",
299 | " try:\n",
300 | " more_button_status = driver.find_element(By.CLASS_NAME, \"u_cbox_paginate\").get_attribute(\"style\").strip()\n",
301 | " if more_button_status == '':\n",
302 | " driver.find_element(By.CLASS_NAME, \"u_cbox_more_wrap\").click()\n",
303 | " time.sleep(1)\n",
304 | " except:\n",
305 | " continue\n",
306 | "\n",
307 | " # 답글 클릭\n",
308 | " comment_list = driver.find_elements(By.CLASS_NAME, \"u_cbox_area\")\n",
309 | " driver.execute_script('window.scrollTo(0, 0);')\n",
310 | " for comment in comment_list:\n",
311 | " reply_count_list = comment.find_elements(By.CLASS_NAME, \"u_cbox_btn_reply\")\n",
312 | " if len(reply_count_list) > 0:\n",
313 | " reply_count = reply_count_list[0].text.strip()\n",
314 | " if reply_count != \"답글0\":\n",
315 | " #reply_button = comment.find_element(By.CLASS_NAME, \"u_cbox_btn_reply\")\n",
316 | " #reply_button.click()\n",
317 | " reply_count_list[0].click()\n",
318 | " time.sleep(3)\n",
319 | "\n",
320 | " # 댓글 수집\n",
321 | " driver.execute_script('window.scrollTo(0, 0);')\n",
322 | " comment_box_list = driver.find_elements(By.CLASS_NAME, \"u_cbox_area\")\n",
323 | " for i in range(len(comment_box_list)):\n",
324 | " comment_box = comment_box_list[i]\n",
325 | " comment_nick = comment_box.find_element(By.CLASS_NAME, \"u_cbox_nick\").text\n",
326 | " comment_content = comment_box.find_element(By.CLASS_NAME, \"u_cbox_text_wrap\").text\n",
327 | " comment_datetime = comment_box.find_element(By.CLASS_NAME, \"u_cbox_date\").text\n",
328 | " try:\n",
329 | " comment_good = comment_box.find_element(By.CLASS_NAME, \"u_cbox_cnt_recomm\").text\n",
330 | " comment_bed = comment_box.find_element(By.CLASS_NAME, \"u_cbox_cnt_unrecomm\").text\n",
331 | " except:\n",
332 | " comment_good = \"0\"\n",
333 | " comment_bed = \"0\"\n",
334 | " reply_count_list = comment_box.find_elements(By.CLASS_NAME, \"u_cbox_reply_cnt\")\n",
335 | " if len(reply_count_list) > 0:\n",
336 | " is_reply = \"1\"\n",
337 | " parent_id = \"-1\"\n",
338 | " temp_parent_id = i\n",
339 | " reply_count = reply_count_list[0].text\n",
340 | " else:\n",
341 | " is_reply = \"0\"\n",
342 | " parent_id = str(temp_parent_id)\n",
343 | " reply_count = \"0\"\n",
344 | " #print(str(i) + \"\\t\" + is_reply + \"\\t\" + reply_count + \"\\t\" + \n",
345 | " # parent_id + \"\\t\" + comment_nick + \"\\t\" + comment_datetime + \"\\t\" + \n",
346 | " # comment_good + \"\\t\" + comment_bed + \"\\t\" + comment_content + \"\\t\" +\n",
347 | " # article_url)\n",
348 | " fc.write(str(i) + \"\\t\" + is_reply + \"\\t\" + reply_count + \"\\t\" + \n",
349 | " parent_id + \"\\t\" + comment_nick + \"\\t\" + comment_datetime + \"\\t\" + \n",
350 | " comment_good + \"\\t\" + comment_bed + \"\\t\" + comment_content + \"\\t\" + \n",
351 | " article_url + \"\\n\")\n",
352 | " except:\n",
353 | " driver.close()\n",
354 | " time.sleep(3)\n",
355 | " driver.switch_to.window(current_window)\n",
356 | " fa.flush()\n",
357 | " fc.flush()\n",
358 | " continue\n",
359 | " \n",
360 | " driver.close()\n",
361 | " time.sleep(3)\n",
362 | " driver.switch_to.window(current_window)\n",
363 | " fa.flush()\n",
364 | " fc.flush()\n",
365 | " \n",
366 | "fa.close()\n",
367 | "fc.close()\n",
368 | "\n",
369 | "# 수집종료\n",
370 | "print()\n",
371 | "print(\"* 최대\", news_count, \"개 기사 수집이 완료되었습니다.\")\n",
372 | "print(\"* 수집된 기사는 아래 파일에 저장되었습니다.\")\n",
373 | "print(\" - 기사본문 :\", article_filename)\n",
374 | "print(\" - 댓글 :\", comment_filename)"
375 | ]
376 | },
377 | {
378 | "cell_type": "code",
379 | "execution_count": 8,
380 | "metadata": {},
381 | "outputs": [],
382 | "source": [
383 | "driver.close()"
384 | ]
385 | },
386 | {
387 | "cell_type": "markdown",
388 | "metadata": {},
389 | "source": [
390 | "> **\\*\\*\\* TIP \\*\\*\\*** \n",
391 | "새탭에서 기사가 열린 후 수집이 종료된 경우 아래 셀을 실행합니다."
392 | ]
393 | },
394 | {
395 | "cell_type": "code",
396 | "execution_count": null,
397 | "metadata": {},
398 | "outputs": [],
399 | "source": [
400 | "driver.switch_to.window(current_window)"
401 | ]
402 | },
403 | {
404 | "cell_type": "code",
405 | "execution_count": null,
406 | "metadata": {},
407 | "outputs": [],
408 | "source": []
409 | }
410 | ],
411 | "metadata": {
412 | "kernelspec": {
413 | "display_name": "Python 3 (ipykernel)",
414 | "language": "python",
415 | "name": "python3"
416 | },
417 | "language_info": {
418 | "codemirror_mode": {
419 | "name": "ipython",
420 | "version": 3
421 | },
422 | "file_extension": ".py",
423 | "mimetype": "text/x-python",
424 | "name": "python",
425 | "nbconvert_exporter": "python",
426 | "pygments_lexer": "ipython3",
427 | "version": "3.8.12"
428 | }
429 | },
430 | "nbformat": 4,
431 | "nbformat_minor": 2
432 | }
433 |
--------------------------------------------------------------------------------
/practice-note/week_08/data/chat_intent.txt:
--------------------------------------------------------------------------------
1 | 몇시야 date
2 | 몇시지 date
3 | 몇시일까 date
4 | 몇시게 date
5 | 시간 date
6 | 몇시 date
7 | 시간 알려줘 date
8 | 지금 몇시야 date
9 | 지금 몇시지 date
10 | 몇시인지 알아 date
11 | 몇시인지 알려줘 date
12 | 몇신지 알려줘 date
13 | 시간좀 알려줘 date
14 | 몇시인지를 모르겠네 date
15 | 오늘 며칠이야 date
16 | 오늘 날짜 date
17 | 오늘 날짜 알려줘 date
18 | 오늘 몇 일이지 date
19 | 며칠이지 date
20 | 날짜 date
21 | 오늘 몇일이에요 date
22 | 오늘 몇일이죠 date
23 | 몇일이니 date
24 | 몇일이야 date
25 | 오늘 몇일인지 아시나요 date
26 | 오늘 며칠인지 알아 date
27 | 오늘 며칠인지 아시나요 date
28 | 몇일이나요 date
29 | 몇일이에요 date
30 | 몇일이였지 date
31 | 몇일이라그랬더라 date
32 | 오늘 몇일이야 date
33 | 오늘 몇일이지 date
34 | 몇일이지 date
35 | 오늘 몇일인지 아니 date
36 | 오늘 몇일인지 알려주라 date
37 | 오늘 몇일인지좀 알려주라 date
38 | 날짜 알려줘 date
39 | 오늘 날짜는 date
40 | 오늘 무슨 요일이지 date
41 | 무슨 요일이지 date
42 | 오늘 무슨 날이지 date
43 | 무슨 날이야 date
44 | 오늘 며칠인지 아니 date
45 | 오늘 요일 아니 date
46 | 오늘 요일 알려줘 date
47 | 오늘 날짜 좀 알려줘 date
48 | 오늘 무슨 날인지 알려줄래 date
49 | 오늘 며칠인지 알려주라 date
50 | 오늘 무슨 날이니 date
51 | 며칠이니 date
52 | 며칠이야 date
53 | 오늘 며칠이에요 date
54 | 오늘 날짜요 date
55 | 오늘 날짜 알려줘요 date
56 | 오늘 몇 일이죠 date
57 | 며칠이죠 date
58 | 날짜요 date
59 | 날짜 알려줘요 date
60 | 오늘 날짜는요 date
61 | 오늘 무슨 요일이죠 date
62 | 무슨 요일이죠 date
63 | 오늘 무슨 날이죠 date
64 | 무슨 날이에요 date
65 | 오늘 요일 아시나요 date
66 | 오늘 요일 알려줘요 date
67 | 오늘 날짜 좀 알려줘요 date
68 | 오늘 무슨 날인지 알려줄래요 date
69 | 오늘 며칠인지 알려주세요 date
70 | 오늘 무슨 날이니요 date
71 | 며칠이니요 date
72 | 며칠이에요 date
73 | 오늘 몇 일인가요 date
74 | 며칠인가요 date
75 | 오늘 무슨 요일인가요 date
76 | 무슨 요일인가요 date
77 | 오늘 무슨 날인가요 date
78 | 오늘 며칠이더라 date
79 | 며칠인데 date
80 | 오늘 며칠이지 date
81 | 며칠인지 모르겠네 date
82 | 며칠이더라 date
83 | 며칠인데 그래 date
84 | 며칠이였지 date
85 | 날짜알려줘요 date
86 | 몇 일인가요 date
87 | 날짜는요 date
88 | 무슨 날인가요 date
89 | 오늘 무슨 날이에요 date
90 | 며칠인지 아시나요 date
91 | 며칠인지 아세요 date
92 | 며칠인지 알려줘요 date
93 | 며칠인지 알려줘 date
94 | 오늘 며칠인지 알려줘요 date
95 | 오늘 며칠인지 알려줘 date
96 | 오늘 며칠이였지 date
97 | 오른 며칠인데 date
98 | 오늘 며칠인지 모르겠네 date
99 | 며칠일까요 date
100 | 요일 알려주세요 date
101 | 요일 알고있나 date
102 | 요일 알고싶어요 date
103 | 무슨 요일인지 까먹었어 date
104 | 무슨 요일이였더라 date
105 | 무슨 요일인지 알려주세요 date
106 | 무슨 요일인지 알려줘 date
107 | 무슨 요일인지 알고있나 date
108 | 날짜가 어떻게 되더라 date
109 | 날짜를 까먹었어 date
110 | 무슨 요일이였는지 까먹었어 date
111 | 무슨 요일인지 알려줬으면 해 date
112 | 요일 알려줬으면 해 date
113 | 무슨 날짜인가요 date
114 | 무슨 날짜인지 아니 date
115 | 무슨 날짜인지 궁금해 date
116 | 무슨 요일인지 궁금해 date
117 | 무슨 요일이였는지 궁금해 date
118 | 무슨 요일일까 궁금해 date
119 | 날짜좀 알려줄래 date
120 | 무슨 날짜인지 알려줄래 date
121 | 어떤 날인지 알려줄래 date
122 | 무슨 날인지 알려줄래 date
123 | 어떤 날인지 알려주라 date
124 | 무슨 날인지 알려주라 date
125 | 며칠인지 알려주라 date
126 | 요일 알려주라 date
127 | 날짜 알려주라 date
128 | 날짜 아시나요 date
129 | 무슨 날짜인지 아시나요 date
130 | 어떤 날짜인지 아시나요 date
131 | 며칠 일까요 date
132 | 무슨 날짜 일까요 date
133 | 며칠인지 아니 date
134 | 며칠일까 date
135 | 무슨 날짜 일까 date
136 | 날짜 뭐야 date
137 | 날짜 궁금해 date
138 | 며칠인지 궁금해 date
139 | 며칠일까 궁금해 date
140 | 며칠이였나 궁금해 date
141 | 며칠이였는지 궁금해 date
142 | 어떤 날인지 궁금해 date
143 | 며칠인지 모르겠어 date
144 | 날짜 모르겠어 date
145 | 며칠일까 모르겠어 date
146 | 며칠이였나 모르겠어 date
147 | 며칠이였는지 모르겠어 date
148 | 어떤 날인지 모르겠어 date
149 | 오늘 며칠일까요 date
150 | 오늘 요일 알려주세요 date
151 | 오늘 요일 알고있나 date
152 | 오늘 요일 알고싶어요 date
153 | 오늘 무슨 요일인지 까먹었어 date
154 | 오늘 무슨 요일이였더라 date
155 | 오늘 무슨 요일인지 알려주세요 date
156 | 오늘 무슨 요일인지 알려줘 date
157 | 오늘 무슨 요일인지 알고있나 date
158 | 오늘 날짜가 어떻게 되더라 date
159 | 오늘 날짜를 까먹었어 date
160 | 오늘 무슨 요일이였는지 까먹었어 date
161 | 오늘 무슨 요일인지 알려줬으면 해 date
162 | 오늘 요일 알려줬으면 해 date
163 | 오늘 무슨 날짜인가요 date
164 | 오늘 무슨 날짜인지 아니 date
165 | 오늘 무슨 날짜인지 궁금해 date
166 | 오늘 무슨 요일인지 궁금해 date
167 | 오늘 무슨 요일이였는지 궁금해 date
168 | 오늘 무슨 요일일까 궁금해 date
169 | 오늘 날짜좀 알려줄래 date
170 | 오늘 무슨 날짜인지 알려줄래 date
171 | 오늘 어떤 날인지 알려줄래 date
172 | 오늘 어떤 날인지 알려주라 date
173 | 오늘 무슨 날인지 알려주라 date
174 | 오늘 요일 알려주라 date
175 | 오늘 날짜 알려주라 date
176 | 오늘 날짜 아시나요 date
177 | 오늘 무슨 날짜인지 아시나요 date
178 | 오늘 어떤 날짜인지 아시나요 date
179 | 오늘 며칠 일까요 date
180 | 오늘 무슨 날짜 일까요 date
181 | 오늘 며칠일까 date
182 | 오늘 무슨 날짜 일까 date
183 | 오늘 날짜 뭐야 date
184 | 오늘 날짜 궁금해 date
185 | 오늘 며칠인지 궁금해 date
186 | 오늘 며칠일까 궁금해 date
187 | 오늘 며칠이였나 궁금해 date
188 | 오늘 며칠이였는지 궁금해 date
189 | 오늘 어떤 날인지 궁금해 date
190 | 오늘 며칠인지 모르겠어 date
191 | 오늘 날짜 모르겠어 date
192 | 오늘 며칠일까 모르겠어 date
193 | 오늘 며칠이였나 모르겠어 date
194 | 오늘 며칠이였는지 모르겠어 date
195 | 오늘 어떤 날인지 모르겠어 date
196 | 날씨 좋아 weather
197 | 날씨 좋니 weather
198 | 날씨 어떠니 weather
199 | 영월 날씨 좋니 weather
200 | 오늘 비 오나요 weather
201 | 눈 오나요 weather
202 | 날씨 비 와 weather
203 | 오늘 눈 와 weather
204 | 4월 12일 날씨 맑나요 weather
205 | 이번주 토요일 맑나요 weather
206 | 내일 맑나요 weather
207 | 이번 주 맑아 weather
208 | 다음 주 구름 꼈나요 weather
209 | 이번 주 바람 부니 weather
210 | 날씨 weather
211 | 날씨도 weather
212 | 날씨는 weather
213 | 날씨는 어때 weather
214 | 날씨는 어떠니 weather
215 | 날씨도 알려줘 weather
216 | 오늘 날씨 바람 부니 weather
217 | 오늘 바람 부니 weather
218 | 내일 구름 꼈나요 weather
219 | 모레 구름 꼈나요 weather
220 | 모레 비 올까 weather
221 | 내일 눈 오나요 weather
222 | 내일 눈 올까 weather
223 | 모레 흐릴까 weather
224 | 내일 흐리니 weather
225 | 내일 흐려 weather
226 | 모레 흐려 weather
227 | 내일 날씨 흐려 weather
228 | 모레 날씨 흐리니 weather
229 | 모레 맑나요 weather
230 | 오늘 맑은지 알려줘 weather
231 | 포항 날씨 좋아 weather
232 | 양양 오늘 날씨 알려줘 weather
233 | 강릉 오늘 날씨좀 알려줄래 weather
234 | 속초의 오늘 날씨는 어떨까 weather
235 | 다다음 주 날씨 어때보여 weather
236 | 글피 날씨 어때요 weather
237 | 글피 날씨 알려줘 weather
238 | 인천 날씨 어때요 weather
239 | 오늘 날씨 알려줘 weather
240 | 오늘 날씨좀 알려줄래 weather
241 | 다음 달 날씨 어떨까 weather
242 | 다음 주 날씨 어때보여 weather
243 | 이번 주 날씨 어때요 weather
244 | 내일 날씨 알려줘 weather
245 | 오늘 날씨 알려주라 weather
246 | 이번 주 전주 날씨 알려줘 weather
247 | 이번 주 날씨 알려줘 weather
248 | 내일 부산 날씨 알려줄래 weather
249 | 다음 주 논산 날씨 알려줘 weather
250 | 3월 15일 날씨 알려줘 weather
251 | 9월 12일 대구 날씨 알려줄래 weather
252 | 날씨 좀 알려줄 수 있겠니 weather
253 | 날씨 어떠니 좋니 weather
254 | 내일 비 오나요 weather
255 | 전주 바람 많이 부니 weather
256 | 대구 바람 많이 부니 weather
257 | 서울 바람 부니 weather
258 | 서울 바람 상태 어떠니 weather
259 | 울산 바람 많이 부니 weather
260 | 인천 바람 많이 부니 weather
261 | 부산 바람 부니 weather
262 | 대전 바람 상태 어떠니 weather
263 | 덕진구 바람 많이 부니 weather
264 | 서초구 바람 많이 부니 weather
265 | 강릉 바람 부니 weather
266 | 광주 바람 상태 어떠니 weather
267 | 진천 바람 많이 부니 weather
268 | 청주 바람 많이 부니 weather
269 | 영등포 바람 부니 weather
270 | 강남구 바람 상태 어떠니 weather
271 | 춘천 바람 많이 부니 weather
272 | 포항 바람 많이 부니 weather
273 | 속초 바람 부니 weather
274 | 제주 바람 상태 어떠니 weather
275 | 군산 지금 눈 오나요 weather
276 | 대구 눈 오나요 weather
277 | 마포구 지금 비 오나요 weather
278 | 여의도 비 오는지 알려줘 weather
279 | 미룡동 지금 눈 오나요 weather
280 | 울산 눈 오나요 weather
281 | 동구 지금 비 오나요 weather
282 | 제주 비 오는지 알려줘 weather
283 | 울산 지금 눈 오나요 weather
284 | 양양 눈 오나요 weather
285 | 산천 지금 비 오나요 weather
286 | 신천 비 오는지 알려줘 weather
287 | 내일 구름 꼈니 weather
288 | 모레 구름 꼈니 weather
289 | 오늘 비 오니 weather
290 | 내일 눈 오니 weather
291 | 내일 눈 올까요 weather
292 | 모레 흐릴까요 weather
293 | 오늘 우산 챙길까 weather
294 | 내일 우산 챙겨야 하니 weather
295 | 오늘 우비 입을까 weather
296 | 전주 날씨 어떠니 weather
297 | 전주 우산 챙겨야 하니 weather
298 | 부산 우산 챙길까 weather
299 | 대전 비 옷 입을까 weather
300 | 광주 비 옷 입을까 weather
301 | 모레 전북 우비 입어야 하니 weather
302 | 우비 입을까 weather
303 | 우산 챙길까 말까 weather
304 | 오늘 마포구 바람 많이 부니 weather
305 | 내일 바람 많이 불려나 weather
306 | 오늘 완산구 바람 많이 부니 weather
307 | 오늘 동두천 바람 많이 부니 weather
308 | 오늘 인천 바람 많이 부니 weather
309 | 오늘 전주 우산 써야 하니 weather
310 | 내일 우산 써야 하니 weather
311 | 다음 주 광주 우산 써야 하니 weather
312 | 우비 입을까 고민 돼요 weather
313 | 오늘 날씨 좋니 weather
314 | 날씨 어떤지 말해줄수 있을까 weather
315 | 오늘 날씨 어때요 weather
316 | 4월 12일 날씨 어때요 weather
317 | 이번주 토요일 날씨 어때요 weather
318 | 내일 날씨 어때요 weather
319 | 다음 주 날씨 어때요 weather
320 | 날씨가 어떻게 돼요 weather
321 | 오늘 날씨좀 알려줄수 있니 weather
322 | 내일 날씨 알려줄수 있어 weather
323 | 이번 주 날씨 알려줄래 weather
324 | 다음 주 날씨 알려줘 weather
325 | 이번주 날씨 줘 weather
326 | 다음주 날씨 알려줄래 weather
327 | 오늘 역삼동 날씨 알려줘 weather
328 | 오늘 마포구 우비 입을까 weather
329 | 춘천 우산 챙겨야 하니 weather
330 | 서울 우산 챙길까 weather
331 | 모레 순천 우비 입어야 하니 weather
332 | 이번 주 날씨는 weather
333 | 이번 주 광명 날씨 알려줘 weather
334 | 이번 주 울산 날씨 알려줘 weather
335 | 이번 주 평택 날씨 알려줘 weather
336 | 우비 입을까 고민 돼 weather
337 | 우산 챙길지 고민되네 weather
338 | 날씨 좋아요 weather
339 | 날씨가 어떻게 돼 weather
340 | 이번 주 광명 날씨 맑나요 weather
341 | 이번 주 울산 날씨 비 오니 weather
342 | 내일 비 오니 weather
343 | 오늘 비 와 weather
344 | 이번 달 비 오니 weather
345 | 이번 달 눈 오니 weather
346 | 내일 비 오는지 알려줘 weather
347 | 오늘 날씨 맑은가요 weather
348 | 이번 주 광명 맑은가요 weather
349 | 이번 주 울산 날씨 맑은가요 weather
350 | 이번 주 서산 날씨 비 오니 weather
351 | 오늘 눈 오니 weather
352 | 오늘 눈 오는지 알려줘 weather
353 | 오늘 바람 부냐 weather
354 | 오늘 바람 많이 부니 weather
355 | 내일 모레 눈 오는지 알려주라 weather
356 | 내일 전주 바람 많이 부니 weather
357 | 내일 서울 날씨 바람 많이 부는지 알려줘 weather
358 | 눈 오니 weather
359 | 4월 12일 날씨 맑은가요 weather
360 | 이번주 토요일 맑은가요 weather
361 | 내일 맑은가요 weather
362 | 이번 주 맑아요 weather
363 | 다음 주 구름 꼈니 weather
364 | 모레 비 올까요 weather
365 | 모레 맑은가요 weather
366 | 이번 주 광명 날씨 맑은가요 weather
367 | 대전 눈 와 weather
368 | 대구 달 비 오니 weather
369 | 울산 달 눈 오니 weather
370 | 인천 비 오는지 알려줘 weather
371 | 이번 주 광명 날씨 맑니 weather
372 | 오늘 눈 오나요 weather
373 | 오늘 날씨 맑니 weather
374 | 이번 주 광명 맑니 weather
375 | 이번 주 울산 날씨 맑니 weather
376 | 대전 눈 오나요 weather
377 | 내일 서산 바람 많이 부니 weather
378 | 바람 많이 불어 weather
379 | 바람 어때 weather
380 | 바람 많이 부는지 알려줄래 weather
381 | 송도 내일 바람 많이 부니 weather
382 | 오늘 대구 동구 바람 많이 부냐 weather
383 | 오늘 구로구 바람 많이 부니 weather
384 | 날씨 비 오나요 weather
385 | 오늘 눈 오나 weather
386 | 4월 12일 날씨 맑니 weather
387 | 이번주 토요일 맑니 weather
388 | 내일 맑니 weather
389 | 모레 맑니 weather
390 | 오늘 비 오나 weather
391 | 송도 내일 바람 많이 부나요 weather
392 | 오늘 구로구 바람 많이 부나요 weather
393 | 오늘 바람 부나요 weather
394 | 이번 주 바람 부나요 weather
395 | 내일 전주 바람 많이 부나요 weather
396 | 오늘 이천 우산 써야 하니 weather
397 | 다음 주 울산 우산 써야 하니 weather
398 | 다음 주 완주 우산 써야 하니 weather
399 | 오늘 상주 우산 써야 하니 weather
400 | 오늘 오산 우산 써야 하니 weather
401 | 서울 맛집 말해줘 restraunt
402 | 부산 맛집 어디에요 restraunt
403 | 광명 맛집 어디에요 restraunt
404 | 산천 맛집 어디지 restraunt
405 | 대전 맛있는 음식점 알려줘요 restraunt
406 | 마포구 맛집 어디에요 restraunt
407 | 구로구 음식점 추천 좀요 restraunt
408 | 맛있는 음식점 알려줘요 restraunt
409 | 음식점 추천 좀요 restraunt
410 | 음식점 추천 좀 해줘요 restraunt
411 | 전주 맛집 추천해줘 restraunt
412 | 부산 맛집 추천해줘 restraunt
413 | 오늘 뭐 먹을까 restraunt
414 | 먹을 거 추천해줘 restraunt
415 | 뭐 먹을지 알려주세요 restraunt
416 | 먹을 거 추천해줘요 restraunt
417 | 대구 맛집 추천해줘요 restraunt
418 | 먹을 음식 추천해주세요 restraunt
419 | 뭐 먹을지 정해줘요 restraunt
420 | 어떤거 먹을지 정해주세요 restraunt
421 | 먹을 거 좀 알려줘요 restraunt
422 | 부산 고깃집 추천해줘 restraunt
423 | 전주 비빔밥 추천해줄래 restraunt
424 | 서울 라멘집 추천해줘 restraunt
425 | 대전 피자 맛집 어디있니 restraunt
426 | 광주 떡갈비집 어디 맛있어 restraunt
427 | 수원 왕갈비 어디 맛있니 restraunt
428 | 성남에서 어디 제일 맛있니 restraunt
429 | 대구에서 제일 맛있는 음식점 추천해주라 restraunt
430 | 송천동 맛집 알려줘 restraunt
431 | 홍대에서 제일 맛있는 음식점 어디니 restraunt
432 | 송파구 술집 알려주라 restraunt
433 | 학교 주변 떡볶이집 추천해줄래 restraunt
434 | 요즘에 제일 맛있는 음식점 어디야 restraunt
435 | 고기 어디 제일 맛있어 restraunt
436 | 여수에서 제일 고기 맛집 어디야 restraunt
437 | 익산 맛집 추천해주겠니 restraunt
438 | 익산 맛집 추천해 주겠니 restraunt
439 | 제주도 유명한 맛집 알려줘 restraunt
440 | 제주도 맛집 추천 좀 해주겠니 restraunt
441 | 서울 돈까스집 추천해줘 restraunt
442 | 부산 케이크 알려주라 restraunt
443 | 대구 순대 추천해줘 restraunt
444 | 대전 치킨집 추천해줘 restraunt
445 | 울산 치킨 알려주라 restraunt
446 | 경주 덮밥 추천해줘 restraunt
447 | 공주 볶음밥 알려줘 restraunt
448 | 사천 김밥 맛집 추천해줘 restraunt
449 | 광양 카페 추천해줘 restraunt
450 | 노원구 샐러드 알려주라 restraunt
451 | 충주 커피 맛집 알려줘 restraunt
452 | 청주 아이스크림 추천해줘 restraunt
453 | 진천 빵집 추천 좀 해줘 restraunt
454 | 맛집 추천 좀 해줘 restraunt
455 | 진천 맛집 추천 좀 해줘 restraunt
456 | 진천 고깃집 추천 좀 해줘 restraunt
457 | 강릉 빵 맛있는 곳 추천해줘 restraunt
458 | 속초 마카롱 맛집 알려주라 restraunt
459 | 양양 소시지 알려줘 restraunt
460 | 마산 샤브샤브 추천해줘 restraunt
461 | 세종 삼겹살 맛집 추천해줘 restraunt
462 | 정읍 월남쌈 알려줘 restraunt
463 | 남원 목살 추천해줘 restraunt
464 | 순창 곱창 알려줘 restraunt
465 | 여수 족발 맛집 알려주라 restraunt
466 | 인천 파스타 알려줘 restraunt
467 | 구리 폭립 추천해줘 restraunt
468 | 부천 스테이크 알려줘 restraunt
469 | 파주 규동 맛집 추천해줘 restraunt
470 | 양주 가츠동 추천해줘 restraunt
471 | 의정부 규카즈 알려줘 restraunt
472 | 시흥 나베 맛집 알려주라 restraunt
473 | 천안 꼬치 추천해줘 restraunt
474 | 남양주 닭꼬치집 알려줘 restraunt
475 | 동두천 양고치집 맛집 추천해줘 restraunt
476 | 평택 닭꼬치 알려줘 restraunt
477 | 포항 양고치 추천해줘 restraunt
478 | 울진 치킨 알려주라 restraunt
479 | 의왕 누룽지 맛집 알려줘 restraunt
480 | 보령 피자집 추천해줘 restraunt
481 | 고성 피자 추천해줘 restraunt
482 | 진안 연어 알려줘 restraunt
483 | 맛집 광어 맛집 추천해줘 restraunt
484 | 서울 제육볶음 알려주라 restraunt
485 | 양주 초밥집 추천해줘 restraunt
486 | 진도 초밥 추천해줘 restraunt
487 | 진해 육회 맛집 알려주라 restraunt
488 | 안산 라면집 추천해줘 restraunt
489 | 안양 국밥집 추천해줘 restraunt
490 | 화성 냉면집 맛집 추천해줘 restraunt
491 | 경주 우동집 알려주라 restraunt
492 | 이천 닭갈비 추천해줘 restraunt
493 | 여주 갈비 추천해줘 restraunt
494 | 일산 돼지고기 맛집 알려주라 restraunt
495 | 안성 돼지 갈비 추천해줘 restraunt
496 | 울산 찜닭 추천해줘 restraunt
497 | 아산 분식집 추천해줘 restraunt
498 | 아산 김밥집 맛집 알려주라 restraunt
499 | 아산 분식 추천해줘 restraunt
500 | 경주 자장면 추천해줘 restraunt
501 | 아산 짬뽕 알려주라 restraunt
502 | 아산 탕수육 맛집 추천해줘 restraunt
503 | 아산 팔보채 추천해줘 restraunt
504 | 아산 깐풍기 추천해줘 restraunt
505 | 아산 중국집 맛집 알려주라 restraunt
506 | 아산 중국 음식 추천해줘 restraunt
507 | 아산 만두 추천해줘 restraunt
508 | 아산 국수 맛집 알려주라 restraunt
509 | 경주 잔치국수 추천해줘 restraunt
510 | 아산 비빔국수 추천해줘 restraunt
511 | 아산 냉면 맛집 추천해줘 restraunt
512 | 동두천 쫄면 추천해줘 restraunt
513 | 아산 비빔냉면 알려주라 restraunt
514 | 동두천 물냉면 맛집 추천해줘 restraunt
515 | 아산 감자탕 추천해줘 restraunt
516 | 송천동 수제버거 맛집 추천해줘 restraunt
517 | 포항 수제 버거 추천해줘 restraunt
518 | 아산 튀김 알려주라 restraunt
519 | 포항 쌀국수 맛집 추천해줘 restraunt
520 | 천안 죽집 추천해줘 restraunt
521 | 아산 쌀국수 알려주세요 restraunt
522 | 천안 아이스크림 추천해줘요 restraunt
523 | 경주 음료수 맛집 추천해줘요 restraunt
524 | 포항 음료수 추천해줘요 restraunt
525 | 천안 음료수 알려주세요 restraunt
526 | 당진 횟집 추천해줘요 restraunt
527 | 상주 호두과자 추천해줘요 restraunt
528 | 성주 맛집 알려주세요 restraunt
529 | 대전 피자 맛집 어디있죠 restraunt
530 | 광주 떡갈비집 어디 맛있어요 restraunt
531 | 천안 왕갈비 어디 맛있죠 restraunt
532 | 성남에서 어디 제일 맛있죠 restraunt
533 | 대구에서 제일 맛있는 음식점 추천해주세요 restraunt
534 | 송천동 맛집 알려줘요 restraunt
535 | 홍대에서 제일 맛있는 음식점 어디죠 restraunt
536 | 송파구 술집 알려주세요 restraunt
537 | 학교 주변 떡볶이집 추천해줄래요 restraunt
538 | 요즘에 제일 맛있는 음식점 어디에요 restraunt
539 | 고기 어디 제일 맛있어요 restraunt
540 | 여수에서 제일 고기 맛집 어디에요 restraunt
541 | 익산 맛집 추천해주세요 restraunt
542 | 익산 맛집 추천해 주세요 restraunt
543 | 제주도 유명한 맛집 알려줘요 restraunt
544 | 제주도 맛집 추천 좀 해주세요 restraunt
545 | 주변 맛집 추천해줘 restraunt
546 | 주변 음식점 추천해줘 restraunt
547 | 주변 맛집 추천해주라 restraunt
548 | 주변 음식점 추천해주라 restraunt
549 | 주변 맛집 알려줘 restraunt
550 | 주변 음식점 알려줘 restraunt
551 | 주변 맛난 음식 알려주라 restraunt
552 | 주변 충주 맛집 알려줘 restraunt
553 | 주변 맛있는 음식 알려주라 restraunt
554 | 주변 부산 맛집 알려줘 restraunt
555 | 주변 김치 음식 알려줘 restraunt
556 | 주변 라면 음식 알려줘 restraunt
557 | 주변 고기 음식 말해 restraunt
558 | 주변 이런 음식 알려줘 restraunt
559 | 주변 먹을 음식 알려주라 restraunt
560 | 주변 대전 피자 맛집 어디 있니 restraunt
561 | 주변 맛집 어디 있지 restraunt
562 | 주변 떡갈비집 어디 맛있어 restraunt
563 | 주변 어디 맛있어 restraunt
564 | 주변 어디 맛있니 restraunt
565 | 군산주변 맛집 말해줘 restraunt
566 | 거기주변 맛집 어디야 restraunt
567 | 전주주변 맛집 어디 있어 restraunt
568 | 서울주변 맛집 어디야 restraunt
569 | 부산주변 맛집 어디 있냐 restraunt
570 | 광명주변 맛집 말해줘 restraunt
571 | 산천주변 맛집 말해줘 restraunt
572 | 대전주변 맛있는 음식점 알려줘 restraunt
573 | 마포구주변 맛집 어디야 restraunt
574 | 구로구주변 음식점 추천 좀 restraunt
575 | 주변에 맛있는 음식점 알려줘 restraunt
576 | 마포구주변 맛집 말해줘 restraunt
577 | 주변 음식점 추천 좀 restraunt
578 | 주변 음식점 추천 좀 해줘 restraunt
579 | 주변에 뭐 먹을까요 restraunt
580 | 서울주변 맛집 추천해줘요 restraunt
581 | 주변에 맛난 음식 추천해주세요 restraunt
582 | 충주주변 맛집 추천해줘요 restraunt
583 | 주변에 맛있는 음식 추천해주세요 restraunt
584 | 부산주변 맛집 추천해줘요 restraunt
585 | 주변에 김치 맛집 추천해줘요 restraunt
586 | 주변에 라면 음식 추천해주세요 restraunt
587 | 주변에 고기 음식 추천해줘요 restraunt
588 | 주변에 이런 음식 추천해줘요 restraunt
589 | 주변에 먹을 맛집 추천해주세요 restraunt
590 | 서울주변 맛집 알려줘요 restraunt
591 | 주변에 맛난 음식 알려주세요 restraunt
592 | 주변에 충주 맛집 알려줘요 restraunt
593 | 주변에 맛있는 음식 알려주세요 restraunt
594 | 대전주변 피자 맛집 어디 있죠 restraunt
595 | 주변에맛집 어디 있지요 restraunt
596 | 전주주변 맛집 어디에요 restraunt
597 | 서울주변 맛집 말해줘 restraunt
598 | 부산주변 맛집 어디에요 restraunt
599 | 광명주변 맛집 어디에요 restraunt
600 | 산천주변 맛집 어디지 restraunt
601 | 전주주변 비빔밥 추천해줄래 restraunt
602 | 서울주변 라멘집 추천해줘 restraunt
603 | 대전주변 피자 맛집 어디있니 restraunt
604 | 광주주변 떡갈비집 어디 맛있어 restraunt
605 | 수원주변 왕갈비 어디 맛있니 restraunt
606 | 성남에서 주변어디 제일 맛있니 restraunt
607 | 대구에서 주변에 제일 맛있는 음식점 추천해주라 restraunt
608 | 송천동 주변에 맛집 알려줘 restraunt
609 | 홍대 주변에 제일 맛있는 음식점 어디니 restraunt
610 | 송파구 주변에 술집 알려주라 restraunt
611 | 주변에 고기 어디 제일 맛있어 restraunt
--------------------------------------------------------------------------------
/practice-note/week_09/data/football_news_data.txt:
--------------------------------------------------------------------------------
1 | 알리송, 부상으로 본머스전 결장+ATM전도 불투명...리버풀 '비상'
2 | 스티븐 장 인터 밀란 회장 "세계 최고의 선수 영입할 것"
3 | 매과이어 발목부상 감지… '맨더비' 결장가능성에 솔샤르는 울상
4 | 토트넘 선수 영입한 앙리 감독 "그 팀 이름이...?"
5 | 잘츠부르크 황희찬, 허벅지 부상으로 4주간 결장
6 | 상승세 황희찬, 부상에 발목…허벅지 근육 파열로 4주 결장
7 | [A.분데스 리뷰] '오쿠가와 결승골' 잘츠부르크, 슈투름에 2-0 승…황희찬 부상 결장
8 | [오피셜] '레알 초비상' 쿠르투아-마르셀루, 동시 부상...맨시티전 결장 예상
9 | 손흥민 부상 토트넘·이강인 결장 발렌시아, UCL 8강 동반 탈락 (종합)
10 | 램파드 감독, 1300억원 주고 영입하고픈 선수 있다
11 | [442.list] ‘이 선수가 바르사였어?’ 당신이 기억 못할 영입 10인
12 | "맨유, 산초-그릴리쉬-쿨리발리 영입하면 우승 가능"...前 EPL 선수 예상
13 | 英언론, '손흥민, 포체티노 체제 영입 선수 중 10점 만점 활약'
14 | "손흥민은 펩 요구에 적응 필요없는 선수"...맨시티가 영입할 만한 19인 선정
15 | “손흥민 복귀는 새 영입 효과” 전 토트넘 선수 화색
16 | 첼시 레전드 "좋은 선수 많은데 쿠티뉴 영입은 왜…"
17 | "어린 선수 선호하는 맨유, 산초 영입전 선두" 英언론
18 | '다음 시즌 준비' 맨유, 물밑 작업 시작...영입 희망 선수 에이전트와 접촉
19 | 캐러거가 본 리버풀 암흑기의 이유…선수 영입 실패
20 | '그런선수 필요없다!' 자비처 영입설에 뿔난 토트넘 팬들, SNS에 반대 물결
21 | "은돔벨레 진짜 좋은 선수야!" 바르사 영입 기대감↑
22 | 7번 가치 떨어뜨린 맨유… 선수 영입 흥정 조건으로 전락
23 | PSG, 은돔벨레 영입 위해 선수 측과 접촉...'몇 주 내로 또 만난다'
24 | 바르토메우 회장의 약속, "자금은 줄었겠지만...좋은 선수 영입할 것"
25 | 네빌이 공개한 ‘명장’ 퍼거슨 감독이 지킨 선수 영입 3원칙
26 | 반 페르시 "맨유 실패 이유? 선수 이름만 보고 영입해서"
27 | 바르사, 코로나 타격 불구 자신감..."원하는 선수 영입 가능"
28 | '재결합 희망' 안첼로티 감독, 하메스 영입 재추진...선수 역시 '희망'
29 | 프랑스 언론 '황의조, 보르도가 영입한 가장 훌륭한 선수'
30 | 산체스 복귀 임박...맨유는 '너 팔고 다른 선수 영입할 거야'
31 | 레알 선수 영입 전략…'맨시티 UCL 못 나가'
32 | 포그바 영입할 돈 없어서… 유벤투스, 선수 3명 내놓는다
33 | 프랑스 기자, "황의조, 역대 보르도 최고의 영입 선수 중 한 명"
34 | 리버풀 팬덤 “손흥민, 가장 영입하고 싶은 선수”
35 | 前인테르 선수, "메시 영입 가능...中구단주, 재력+야망 있어"
36 | 前 첼시 선수, "쿠티뉴 좋은 선수지만 훌륭한 선수는 아냐" 영입 만류
37 | 베예린 영입에 3개구단 관심… 선수 본인은 "아스날 주장될거야"
38 | "린가드, 에버턴에 좋은 영입될 것" 前 EPL 선수 추천
39 | 前 첼시맨, 친정팀에 조언..."쿠티뉴가 최상위 선수인가? 영입은 안 돼"
40 | '베예린 이런 선수였어?' 인기 폭발! ATM-세비야 영입 준비
41 | "英 최고선수 영입은 맨유의 전통"..네빌, 케인 이적 가능성 높게 점친다
42 | '쿠티뉴 이적설' 리버풀은 무관심, 구단 출신 선수들은 "영입하자"
43 | 네빌의 소신 발언 "돈 없어 직원 해고? 선수 영입도 금지해야"
44 | 네빌의 타당한 분노 "영입 금지시켜! 선수단 월급 깎은 팀들"
45 | "직원 해고한 구단, 선수 영입 금지당해야" 네빌
46 | "리버풀, 창의적인 쿠티뉴 재영입 어때?"...前리버풀 선수의 제안
47 | 노리치 '직원해고→선수영입'이 의아한 前선수.."이 타이밍에?"
48 | 테크니컬 디렉터가 없는 맨유 '선수영입 프로세스가 경쟁력이다'
49 | 브루노, "EPL-챔스 우승하려고 맨유 왔다...새 선수 영입 기대"
50 | 이탈리아 축구팀, 재정적 위기로 시즌 도중 선임한 감독 5경기만에 경질
51 | 퍼거슨 전 감독, 맨유 선수 영입을 위해 뛴다
52 | 백승호의 다름슈타트, 새 감독에 마르쿠스 앙팡 선임
53 | [오피셜] 백승호의 다름슈타트, 마르쿠스 앙팡 감독 선임...2년 계약
54 | 맨유 사려던 사우디 왕자, 뉴캐슬 인수-알레그리 감독 선임 계획
55 | 사하 영입 비화 공개한 네빌 "퍼거슨, 선수단에게 '데려올까' 묻더라"
56 | 솔샤르, 영입하고 싶은 선수 14명 맨유에 제출
57 | 벤트의 전망, "맨유, 너무 많은 선수들과 연결...토트넘이 그릴리쉬 영입"
58 | ‘존버’ 베일 결국 잔류 해냈다… 레알, 재정 압박에 대체 선수 영입 포기
59 | 바르사, 라우타로에 베르너까지 영입?... 선수 측과 이미 접촉
60 | '선수 영입할 돈 없잖아' 베일, 레알 마드리드 잔류 전망
61 | 반 할의 불만 "맨유 시절, 원하는 선수 영입 못했어"
62 | 토트넘, 아르투르 영입 위해 '선수+현금' 제시한다
63 | 레전드 캐러거 "리버풀, 선수 영입에 더 투자해야 한다"
64 | 인테르가 또 맨유 선수를? 포그바 영입 노린다
65 | '램파드 영입 1호' 지예흐, "7월 1일에 첼시 선수가 된다"
66 | 'D.실바 대체자'...맨시티가 영입할만한 선수는?
67 | 바르셀로나도 달롯 영입전 합류...'선수 평가서 합격점'
68 | ‘첼시 선수 좋아요’ 아스날, 윌리안 FA 영입전 우위
69 | 맨유 4명 선수 이적, 제이든 산초 영입. 맨유 이적 플랜의 대대적 변화
70 | 하파엘, 맨유에 조언 "팀을 위해 뛰고 싶은 선수 영입해"
71 | 2005년 이후 퍼거슨이 영입한 선수 평점, 박지성 7점-카가와 5점 (英언론)
72 | 바르사, 라우타로 영입에 근접...'803억+선수 2명' (西 매체)
73 | 바르사, 라우타로 영입 위해 승부수...'865억+선수 2명' 제시
74 | 음바페에게 반한 클롭, “거대한 미래를 가진 선수”… 영입 암시?
75 | 바르셀로나, 마침내 마르티네스 영입 근접 '5690만파운드+선수 2명'
76 | 알칸타라, 바이에른에 쿠티뉴 완전영입 추천 "큰 도움이 될 선수"
77 | SON 영입한 '前 스카우트' "5년 전 성공 확신...기존과 다른 선수"
78 | '재정 악화' 레알 마드리드, 선수 영입 계획 바꾼다
79 | 첼시, 레스터 벤 칠웰 영입 협상 시작...선수도 원한다
80 | 콘테의 찬사, "캉테는 내가 영입한 선수 중 최고, 2인분 역할해"
81 | 함마르뷔, 구단주 즐라탄 선수로 영입? "가능하다"
82 | '선수단 강화 주력' 뉴캐슬, 베일 영입서 우위 선점...이적료 800억 베팅
83 | 토트넘, 공격수 오시멘 영입 성공할까...첼시-레알 등 관심 선수
84 | 바이에른, 사네 영입 임박... 선수와 5년 계약 합의
85 | 바르셀로나 선수 영입에 메시가 영향력을 행사한다?
86 | 바르사, 세메두 통해 선수 보강+이적 자금 확보→라우타로 영입 (西언론)
87 | PSG 회장, 영입 실패했던 호날두 극찬..."결단력+욕심, 운동선수의 표본"
88 | 슈마이켈 "손흥민, 맨유가 영입할 수 있는 최고 선수"
89 | '맨유 레전드 GK' 슈마이켈 "손흥민, 맨유가 영입 가능한 최고의 선수"
90 | 슈마이켈의 여전한 SON 사랑..."손흥민, 맨유 영입 가능한 선수 중 최고"
91 | "맨유가 영입할 선수? 당연히 SON!" 전설 슈마이켈 강력 추천
92 | 베르너 영입, 돈 부족한 리버풀…선수 팔아 채운다
93 | 수준급 선수 원하는 에버튼, 황희찬 영입 관심 (英언론)
94 | 前 첼시 선수 "쿠티뉴보다 하베르츠 영입해야"
95 | 에버턴, 황희찬 영입에 관심..."반 다이크 괴롭혔던 선수"(英매체)
96 | 주앙 펠릭스 발목 부상, 라리가 재개시 결장 불가피
97 | '친정팀에 추천' 로빈슨, "쿠티뉴, EPL에 적합한 선수...토트넘에 훌륭한 영입"
98 | 슈틸리케 감독 "레알, 포그바 말고 '겸손한' 선수 영입해!"
99 | 홀란드 부상 어느 정도? 감독, “오래 결장하지 않을 것”
100 | 뉴캐슬 새 구단주, 선수영입에 3038억 원 쏜다…그리즈만 눈독
101 | '무릎 부상으로 교체' 홀란드...도르트문트 감독, "장기 결장 아닌 것 같아"
102 | '득점기계' 홀란드, 뮌헨전 무릎부상…분데스리가 잔여 6경기 결장 가능성
103 | 슈틸리케의 조언 "레알, 포그바말고 겸손한 선수 영입해"
104 | 토트넘-아스널 선수 영입할 돈 없다...맨유-첼시는 여유로워(英매체)
105 | 홀란드 무릎 부상으로 주말 경기 결장, 심각하진 않아(獨키커)
106 | 반 할 "맨유, 영입 7~8순위 선수들만 사줬어...근데 부진은 감독탓"
107 | 판 할 "원하는 선수 영입 못 해"…英 매체 "2억 파운드 썼는데?"
108 | 맨유 저격한 판할 "내가 원했던 선수 영입은 없었다!"
109 | 아스널·토트넘 챔스 못 나가…갈라타사라이 선수 영입 자신
110 | '라우타로 영입 착수' 바르셀로나, "절대 포기 안 해"...선수 이적 의지 이용
111 | '2100억 원↓' 레알 마드리드, 이번 여름 선수 영입 없다
112 | 유벤투스, 조르지뉴 영입 위해 주전급 선수 3명 제시
113 | 더선 "이사회 탓, 반할 어이없네", 2년 동안 4400억 써놓고 선수영입 탓
114 | 라이프치히 영입 예고, 뮐러처럼 ‘말 많은’ 선수 원한다
115 | 선수 영입·부상자 복귀…케인 "우리가 가장 강한 순간"
116 | '좋은 선수인데 영입은 NO'...지단, 윌리안 제의 거절
117 | [공식발표] '훈련 도중 근육 부상' 미나, 몇 주간 결장...재활 초기 단계
118 | '쿠티뉴 영입 추천' 벤트, "최고의 선수...토트넘에 필요한 슈퍼스타"
119 | '우리도 양심은 있어' 맨유, 선수 영입에 산체스 활용 계획 NO
120 | 맨유·리버풀, '제2의 바디' 영입경쟁… 선수는 "래시포드가 좋다"
121 | 무리뉴의 토트넘, 쿠티뉴 영입 포기 '기존 선수들 반발 우려'
122 | 토트넘, 쿠티뉴 영입전 포기…무리뉴 “다른 선수 연봉에 영향 우려”
123 | 홀란드 부상 심각? 파더보른→헤르타 2연속 결장 가능성(英 언론)
124 | 토트넘, ‘코로나 재정난’에 1억7500만 파운드 대출…선수 영입에는 안 쓴다
125 | 씁쓸한 클롭, "베르너-하베르츠 굉장한 선수"라 말해도 영입은 불투명
126 | '히메네스 영입 눈독' 맨유, 선수가 희망하는 연봉 인상으로 유인
127 | 올 여름 아스널 선수 영입은 ‘온라인 어플’에서?
128 | '호날두-산체스-알베스'...리버풀이 영입 근접했던 선수들
129 | 바르사 차기 대권 후보, "네이마르 영입할 일 없다...클럽이 선수보다 중요"
130 | 시어러 "첼시, 선수 영입은 좋은데...TOP4 실패하면 어떡해?"
131 | 토리노, 밀란서 실패한 지암파올로 감독 선임 열망
132 | ‘하베르츠 영입전’ 레알도 참전, 선수는 ‘EPL’ 원해
133 | ‘이재성 부상 결장’ 홀슈타인 킬, 비스바덴에 1-2 역전패
134 | '이재성 부상 결장' 킬, 안방서 비스바덴에 역전패
135 | 에토오, 인터 밀란에 ‘먹튀’ 산체스 영입 촉구… “변화 줄 선수다”
136 | '이재성 부상 결장' 홀슈타인 킬, 비스바덴에 1-2 역전패...서영재도 출전 불발
137 | '이재성 부상 결장' 킬, 안방서 비스바덴에 1-2 역전패
138 | ‘발목 부상’ 기성용 결장…메시와 대결 무산
139 | '이재성 부상 결장' 홀슈타인 킬, 비스바덴에 역전패
140 | 램파드, '하베르츠-칠웰' 영입 위해 선수 대거 정리 계획
141 | [S코어북] '기성용 부상 결장' 마요르카, '바카 득점' 비야레알에 0-1 패
142 | 15세 선수 영입…MLS, 얼어붙은 이적시장 대처법
143 | [공식발표] '발렌시아전 명단 제외' 이스코, 햄스트링 부상...3주 결장 예상
144 | 불쌍한 무리뉴 감독 "우리는 선수 영입 투자 안하나"
145 | '설상가상' 아스널, 마리 시즌 아웃+자카 당분간 부상 결장 전망
146 | 첼시 지루, 베르너 합류 영입 불만 없다 "좋은 선수"
147 | 첼시, 선수단 정리 예고 '캉테 포함'…'폭풍 영입'의 그림자
148 | 아스널 초비상, 레노 십자인대 부상으로 1년 결장 예상
149 | 리버풀, 쿠치뉴 영입 안 한다…"같은 포지션 선수 있다"
150 | 경기결장-훈련불참, 커져가는 레알 아자르 부상 의혹
151 | 무릎 부상 아구에로, 시즌 아웃 가능성 제기…펩 "당분간 결장 불가피"
152 | 전 리버풀 선수 "클롭, 공격수 영입해야 할 텐데"
153 | 수원 삼성 "권창훈 영입? 논의된 바 없다"…선수도 독일에서 도전 원해
154 | 맨유 사령탑 솔샤르, 선수 영입 예고 "돈 쓸 수 있다"
155 | 아다마 이적설에...前리버풀 선수 "맨유처럼 英지배하려면 영입 필요"
156 | '전력 보강 희망' 무리뉴, 선수 영입 요청...레비 회장은 'FA 위주로 알아봐'
157 | 리버풀, 영입 선수들 '우승 조항 발동'...EPL 팀에 148억 지불 예정
158 | 이재성, 부상으로 시즌 최종전 결장
159 | '이적설' 이재성, 부상으로 시즌 최종전 결장
160 | 이재성, 시즌 최종 뉘른베르크전 부상으로 결장
161 | 이재성, 시즌 최종 뉘른베르크전 부상 결장
162 | '킬 에이스' 이재성, 부상으로 최종전 결장… 공격포인트 17개로 마무리
163 | 킬 '에이스' 이재성, 시즌 최종 뉘른베르크전도 부상 결장
164 | 외질, 셰필드전도 결장...아스널 "부상으로 훈련도 불참"
165 | “지금 선수에 만족” 솔샤르, 산초 영입 포기인가 연막인가
166 | 디마테오도 흥분시킨 베르너 영입… "득점 보장된 선수"
167 | 바르사, 불화설→감독 교체설...세티엔 경질하고 사비 선임?
168 | 레알 베티스, 세티엔 감독 바르셀로나 떠나면 재선임 추진
169 | 바르사 선수들, 차비 감독 선임 원한다...西 언론 "당장은 아냐"
170 | 게리 네빌 "맨유, 브루노 같은 선수 더 영입해야 해"
171 | '호이베르그 영입 자신' 토트넘, 이적료 마련 위해 선수단 처분이 '우선'
172 | '우승 자신감' 클롭 "선수 영입? 필요 없어"
173 | 토트넘, UCL 출전 여부 따라 선수 영입 달라진다... 김민재도 영향
174 | 맨유, 산초 영입 "선수와 개인 합의 마쳤다" (英 매체)
175 | 페르난데스-포그바 훈련 중 부상...본머스전 결장 의심
176 | '언제쯤 뛸까' 아자르, 부상으로 결장…지단 "다시 볼 수 있길"
177 | 과르디올라 감독, "한 번 졌다고 선수 영입? 그건 아니지"
178 | 차비 감독 선임 실패...메시, 바르사와 이별 더 가까워졌다
179 | 티아고 영입설에...클롭, "엄청난 선수, 많이 좋아한다" 응답
180 | 맨유가 산초 영입 성공할 경우, 타격 입을 맨유 선수는?
181 | '감독 공석' 발렌시아, 포체티노 감독 선임에 관심
182 | 3000억 손실 토트넘 레비 회장 '눈치' 보는 무리뉴 "(선수영입) 말 조심해야 한다"
183 | [EPL현장]델리 알리, 햄스트링 부상으로 에버턴전 결장
184 | '레전드' 슈마이켈의 조언, "맨유, 영입보다 선수단 정리가 더 중요해"
185 | 아자르 또 부상…발목 통증 2연속 결장
186 | "리버풀, 히메네스 영입해...피르미누의 진정한 경쟁자" 前리버풀 선수의 주장
187 | 살아나던 그리즈만, 부상으로 라리가 잔여 일정 결장
188 | 키언의 조언 "아스널 스리백·포백, 결론 내고 선수 영입하자"
189 | 기존 선수들 분발 촉구한 램파드 "영입은 당연한 일"
190 | 발렌시아, ‘영건 활용’ 감독 선임으로 이강인 마음 돌리나
191 | 발렌시아, 신임 감독 선임 후 이강인 설득 나선다
192 | "아스널, 판 다이크 같은 선수 영입 필요해"…아르테타의 바람
193 | 발렌시아, 새 감독 선임에 박차...'이강인 등 어린 선수 활용'이 조건
194 | 선수 영입 간절한 아르테타 "리버풀 보라, 마법은 없다"
195 | [오피셜] 포체티노 원했던 벤피카, 호르헤 헤수스 감독 선임
196 | 발렌시아, 그라시아 감독 선임 유력…이강인 세비야전 출격
197 | 레알이? 페레즈 회장 "대형 영입? 선수들 스스로 연봉도 깎았는데..."
198 | 이강인 잡겠다던 발렌시아, 또 '4-4-2 수비축구' 그라시아 감독 선임 임박
199 | 포체티노, AS모나코 감독직 거절...모나코는 코바치 선임
200 | 격변의 바르사, 새 감독으로 클루이베르트-블랑 선임설
201 | 7kg 찌고-부상 결장 24G... 아자르 "레알 첫 시즌, 커리어 최악" 인정
202 | [오피셜] '9G 무패' AC밀란, 랑닉 선임 대신 피올리 감독과 2년 재계약
203 | 콘테라 믿고는 있는데…EPL서 부진했던 선수들 영입→3위도 위태
204 | 토트넘 선수 영입, 김민재-호이비에르-램스데일 중 선택 (英언론)
205 | 맨시티, 페란 토레스 영입 곧 끝낸다…현금+선수 제안
206 | 에메리 감독의 새 직장은? 스페인 비야레알 사령탑에 선임
207 | 비야레알, 우나이 에메리 감독 선임…계약기간 3년
208 | 지단-페레스, 레알 감독직 유지 합의… 포체티노 선임 무산
209 | 아스널서 경질된 에메리 감독, 스페인 비야레알 사령탑에 선임
210 | '전설' 제라드의 찬사, "리버풀 우승은 두 명의 핵심선수 영입 덕분"
211 | 발렌시아, ‘4-4-2 선호’ 그라시아 감독 선임 임박
212 | EPL과 다르다…비야레알 선임된 에메리 감독 기대되는 이유
213 | 토트넘, 올여름 선수 영입보다는 전력 유지에 집중
214 | EPL 3팀, 움티티 두고 치열한 영입 경쟁...'선수는 바르사 잔류 원해'
215 | 中 기자, 바이에른에 '중국선수 영입' 질문... 루메니게의 대답은?
216 | 발렌시아, 그라시아 감독 선임 확정…피터 림도 사무실 도착
217 | '하메스 영입 관심' 맨유, 에이전트와 협상 계획...선수도 EPL 무대 선호
218 | "맨유 베르통언 영입 추천" 전 토트넘 선수 제안
219 | 발렌시아 새 감독 선임…이강인에게 기회가 될까?
220 | 네빌의 조언 "매과이어 파트너·골키퍼, 맨유가 영입할 선수"
221 | 발렌시아, 그라시아 감독 선임…이강인 거취에 어떤 영향 줄까?
222 | "어린 선수에 기회 주겠다" 발렌시아, 하비 그라시아 신임 감독 선임
223 | 발렌시아, 하비 그라시아 감독 선임…"젊은 선수 기회 주겠다"
224 | 이강인 소속팀 발렌시아, ‘승격 전도사’ 그라시아 감독 선임
225 | 이강인의 발렌시아, 하비 가르시아 감독 선임
226 | 이강인 소속팀 발렌시아, 그라시아 감독 선임
227 | [오피셜] 발렌시아, 하비 그라시아 감독 선임...2년 계약
228 | 발렌시아, 하비 가르시아 감독 선임…이강인 거취는?
229 | 발렌시아, 젊은 선수 기회 약속한 새 사령탑 그라시아 감독 선임
230 | 발렌시아, 하비 그라시아 감독 선임…이강인 거취 영향 줄까
231 | '젊고 강한' 맨유, 솔샤르가 선수 영입 원하는 이유
232 | [공식발표] PSG, "음바페, 발목 부상으로 3주 결장"...UCL 8강전 결장
233 | 무리뉴 감독 "기존 선수 잔류가 우선, 영입은 그다음"
234 | '윌리안-쿠티뉴' 에이전트, "두 선수 모두 영입 제안 많이 온다"
235 | 아구에로 챔스 16강 결장…무릎 부상 여파
236 | 칠웰, 타글리아피코, 쿠쿠렐라까지, 첼시 전방위적 선수영입, 어디까지 갈까
237 | '이탈리아 레전드' 피를로, 유벤투스 돌아온다...U-23팀 감독에 선임
238 | 伊 월드컵 우승주역 피를로, 유벤투스 U-23 감독에 선임
239 | 이탈리아 전 국가대표 피를로, 유벤투스 U-23팀 감독에 선임
240 | 이탈리아 전 국가대표 피를로, 유벤투스 U-23팀 감독에 선임
241 | 이탈리아 전 국가대표 피를로, 유벤투스 U-23팀 감독에 선임
242 | '주급 4억' 제의받은 오바메양, 선수 추가영입도 원한다
243 | "토트넘, 다음 시즌도 4위 불가능...선수 영입 필수야" 前토트넘 선수의 평가
244 | 선수 영입에 돈을 무리하게 쏟아부은 울버햄프턴, 벌금 부과와 선수등록 제한 징계
245 | 유벤투스 UCL 8강행 좌절… 사리 감독 경질, 새 사령탑에 피를로 파격 선임
246 | 유벤투스, 새 사령탑에 피를로 선임…사리 감독 경질
247 | 사리 감독 경질한 유벤투스, 피를로 감독 선임
248 | 유벤투스, 사리 감독 경질…새 사령탑에 피를로 선임
249 | '세리에A 우승' 유벤투스, 피를로 신임 감독 선임…사리 전격 경질
250 | 유벤투스, 사리 감독 경질…새 사령탑에 피를로 선임
251 | 유벤투스, 사리 감독 경질…피를로 감독 선임
252 | 유벤투스, 새 감독으로 피를로 선임…계약 기간 2년
253 | 유벤투스, 사리 대신해 피를로 감독으로 선임
254 | ‘파격 선임’ 감독된 피를로, 호날두에 대한 평가는?
255 | 자신보다 1살 어린 피를로 감독 선임에 부폰 "이제 감독님이라 불러야 하지?"
256 | 유벤투스, 사리 감독 경질…새 사령탑에 피를로 선임
257 | 피를로 감독 선임에 애매해진 부폰..."이제 감독님이라 불러야 하나?"
258 | 유벤투스, 지도자 경험 '전무' 피를로 새 감독 선임
259 | [공식발표] 사리 경질한 유벤투스, 피를로 감독 '깜짝' 선임
260 | [오피셜] 유벤투스, 1군 새 감독에 피를로 선임 ‘2년 계약’
261 | [오피셜] 유벤투스, 새 감독으로 피를로 파격 선임...'2년 계약'
262 | [오피셜] '사리 경질' 유벤투스, '전설' 피를로 감독 선임...2년 계약
263 | [오피셜] '전설' 피를로, 유벤투스의 새 감독으로 선임…파격적 결정
264 | 유벤투스, 새 감독으로 피를로 선임 [오피셜]
265 | ‘황의조 뛰는’ 보르도, 감독 교체... 장-루이스 가세트 선임 [공식발표]
266 | 발렌시아 그라시아 감독, 직접 이강인 잔류 설득...'선수 영입보다 우선'
267 | '황의조 활약' 보르도, 가세 신임 사령탑 선임…소사 감독 퇴진
268 | ‘산초 영입 무산’ 솔샤르, “다른 팀 선수에 대해 할 말 없다”
269 | 황의조 소속팀 보르도, 장 루이 가세 감독으로 선임
270 | 황의조 소속팀 보르도, 새 감독에 장 루이 가세 선임
271 | 황의조 뛰는 보르도, 장 루이 가세 감독 선임
272 | 유벤투스, 원래는 지단 감독 선임 원했다… 연봉 209억도 제안
273 | 맨유, 산초 영입 난항…도르트문트 "내년에도 우리 선수"
274 | 호날두, 피를로 감독 선임 반응을 SNS에? “승선”
275 | 산투 감독 "울버햄튼은 더 많은 선수 필요해" 영입 촉구
276 | '380억 장전' 아스널, 아약스 돌격대장 퀸시 프로메스 영입 착수...선수도 긍정적
277 | 강등된 왓포드, 블라디미르 이비치 감독 선임 예정
278 | [st&포커스온] '선수 보강 없다' 레알, 임대 복귀로 영입 효과 누릴까?
279 | "윌리안, 정말 좋은 영입...페페보다 나은 선수야" 前아스널 선수의 평가
280 | 기행에 가까웠던 감독 교체 왓포드, 신임 이비치 선임
281 | 맨시티, 포체티노 감독 선임해 챔스 결승 밟고 싶다
282 | '3시즌 무관' 맨유 '0입' 위기?...선수 매각 못하면 영입 불가
283 | ‘2-8 참패’ 바르셀로나, 쿠만 감독 선임 임박...2년 계약 유력
284 | 쿠만, 바르사 차기 감독 1순위 후보…포체티노 선임은 무산
285 | "영혼까지 끌어모은 산초 영입?" 맨유, 기존선수 6명 판다[英매체]
286 | ‘굴욕적 패배’ 바르셀로나, 쿠만 감독 선임… “영웅이 돌아온다”
287 | [오피셜]위기의 바르사, 소방수로 쿠만 감독 선임
288 | FC바르셀로나, 쿠만 감독 선임하고 재편 선언…새 감독은 2022년까지 계약
289 | FC바르셀로나, ‘팀 레전드’ 쿠만 감독 선임…2022년 6월까지
290 | 바르셀로나, 쿠만 감독 선임 공식발표..."레전드가 돌아왔다"
291 | FC바르셀로나, 쿠만 감독 선임 발표…2022년까지 계약
292 | 바르셀로나, 새 감독직에 쿠만 선임…2년 계약 [오피셜]
293 | [오피셜] '2-8 참패' 바르셀로나, 쿠만 감독 선임...2022년까지
294 | [오피셜] '2-8 참패' 바르셀로나, 쿠만 감독 선임...2022년까지
295 | 카타르 9년간 '오일머니' 1조8000억 선수 영입 투자, PSG 첫 UCL 결승행 역사 썼다
296 | 인테르 밀란, 메시 영입 위해 현금+선수 준비
297 | 모리뉴가 밝힌 호이비에르 영입 이유, “우리가 찾던 선수”
298 | 선수 팔아서라도…아스널 티아고 영입전 참가
299 | "맨시티-라우타로 영입? 제수스보다 골 많이 넣어줄 것"...前첼시 선수의 주장
300 | 맨시티 회장, 폭풍영입 예고...“더 많은 선수 영입할 준비 됐다”
301 | 헨더슨, 부상으로 커뮤니티실드 결장… EPL 개막전 맞춰 복귀
302 | 부상과 빅이어 바꾼 보아텡, 리그 개막전 결장 예상
303 | '현금+선수 3명' 메시 향한 맨시티 러브콜, 강력한 변수는 펩 감독의 영입 우선순위
304 | 맨시티 ‘메시 영입’ 플랜B 준비…1억 유로에 선수 3명 제안
305 | 맨시티, 메시 영입 위해 1억 유로+선수 3명 트레이드 추진
306 | 클롭 리버풀 감독 "모두가 원하는 선수지만 메시 영입 못 해"
307 | 맨유, 드디어 선수 영입 성공하나...판 더 빅 입찰 눈앞
308 | '커뮤니티실드 패배' 리버풀, 결국 선수 영입? 사르에 4000만파운드 쏜다
309 | 챔스 나가는 마르세유 나가토모 영입 “경험 많은 선수 찾았다”
310 | 무리뉴, “SON-케인-모우라-알리보다 나은 선수 영입 힘들어”
311 | 산초 미련 못 버린 맨유, '선수가 거절 할 때까지 영입 시도'
312 | 맨유 유스 출신 "반 더 비크, 좋은 영입이지만....반드시 필요한 선수 맞아?"
313 | "메시 영입에 1조? 차라리 월드클래스 3명 영입"...前맨시티 선수의 의문
314 | '발가락 부상' 호날두 결장...포르투갈 감독 "회복 얼마나 걸릴지 몰라"
315 | 하베르츠 영입한 첼시는 잔칫집, 선수도 마냥 행복
316 | 토트넘 회장의 아쉬움 "선수 영입이 얼마나 어려운데…"
317 | "토트넘, 필요 없는 선수 정리 후 김민재 영입 추진" 풋볼 런던
318 | 음바페 “PSG 챔피언스리그 우승 낙관, 단 좋은 선수 영입해야”
319 | '에이스의 작심발언' 음바페의 촉구 "PSG 좋은 선수 영입 필요"
320 | 3명 사온 토트넘 무리뉴, "영입 희망 선수 2명 더 있다"(풋볼런던)
321 | 다비드 루이스, ‘목 부상’ 6주 결장... 아스널 수비 어쩌나
322 | '훈련 중 발목 부상' 이스코, 출전 부적합...소시에다드전 결장 가능성
323 | ‘파산’으로 4부리그 강등 시에나, 질라르디노 감독 선임
324 | 발렌시아 감독의 한숨, "핵심 선수 대거 이적했는데 영입은..."
325 | 제노아, 로즈 영입 두고 토트넘과 협상 중...선수는 "그래도 안 떠나"
326 | 램파드 "지예흐 등 영입선수들 개막전 못 뛴다" 예고
327 | 선수 영입 1명 클롭 "우린 첼시처럼 돈 못 쓰거든"
328 | 클롭 "영입? 적합한 선수 있다면 데려오겠지.."
329 | [EPL ISSUE] '폭풍영입' 첼시, 선수단 가치 3위...1위는 '1조 4645억' 맨시티
330 | 티아고 영입 원하는 리버풀, 선수 3~4명 매각 계획
331 | 바르사, 선수 팔아 살라 영입한다… 메시 대체자로 선택
332 | '보강 의지 절실' 투헬 감독, "선수 영입? 절실하게 원한다"
333 | 前 네덜란드 선수의 귀띔, "쿠만, 살라 영입 원해...선수도 가고 싶어해"
334 | 아자르 과체중에 부상까지…개막전 결장 유력
335 | 쿠만, “데파이 영입 전에 기존 선수부터 팔아야”
336 | 무릎 부상 지동원 결장 유력… 독일 분데스리가 ‘코리안 더비’ 무산 전망
337 | 돈 없는 바르셀로나, 쿠만 감독도 새 선수 영입 포기
338 | 英 전문가, "리버풀, 우승 지키려면 선수 영입해야 해!"
339 | '토트넘 레전드' 셰링엄, "베일 영입, 가장 기뻐할 선수는 케인"
340 | 클롭, "티아고 영입, 다른 선수 방출 의미하지 않는다"
341 | 우울한 아자르의 나날, 뱃살 논란에 부상까지..."발목 문제로 무기한 결장"
342 | '토레이라 영입 주력' 아틀레티코, 전제 조건은 기존 선수 '정리'
343 | 바르사, 라우타로 영입 포기 안 해… 인터 밀란에 이적료+선수 제안
344 | '비상' 레스터 은디디, 부상으로 수술 가능성↑...'최대 12주 결장'
345 | '부상도 없는데' 뤼디거, 3연속 결장에 이적 결심...바르사-로마가 관심
346 | 바르토메우 바르샤 회장 "선수단 정리 없이 라우타로 영입도 없다"
347 | 쿠만 떠난 네덜란드 대표팀, 데부어 감독 선임 [공식발표]
348 | '수아레스 영입' 아틀레티코 회장, "훌륭한 선수가 올 것 같아 매우 기뻐"
349 | 아스날, 조르지뉴 영입 관심...첼시 선수 수집 어디까지?
350 | 제주스, 부상으로 브라질 축구대표팀 낙마…3주 결장 예상
351 | '베일-레길론 떠난' 지단, "선수 영입 없다" '선언'
352 | [라리가 리액션] '진땀승' 지단 감독, "영입 없다, 지금 선수단에 만족"
353 | 손흥민, 햄스트링 부상 최소 3~4주 결장 불가피
354 | 최소 한달 결장…절정의 손흥민 발목잡은 ‘햄스트링 부상’
355 | '부상' 손흥민, 장기결장 가능성... 토트넘 악몽 재현하나
356 | 강행군 속 결국 탈 난 손흥민…햄스트링 부상에 장기간 결장 불가피
357 | [여기는 런던] 손흥민 부상에 불편한 심기 드러낸 무리뉴 감독… 당분간 결장 불가피
358 | '토트넘 날벼락' 손흥민, 커리어 첫 햄스트링 부상…장기 결장 가능성
359 | 손흥민, 피로누적 따른 햄스트링 부상...장기결장 우려
360 | "햄스트링 부상 손흥민, 최소 2~3주 결장…모리뉴 끔찍할 것"
361 | 손흥민 햄스트링 부상…모리뉴 감독 "장기 결장 가능성도"
362 | 손흥민, 뉴캐슬전서 ‘햄스트링 부상’…장기 결장 가능성
363 | 손흥민 부상 날벼락.. 햄스트링 다쳐 장기결장 예고
364 | 손흥민 햄스트링 부상 '심각' 최소 10월까지 결장...영국 메트로 보도
365 | 손흥민, 교체 이유는 햄스트링 부상...무리뉴 "장기 결장 할수도"
366 | 손흥민, 햄스트링 부상…무리뉴 감독 “당분간 결장” [토트넘 뉴캐슬]
367 | '청천벽력' SON, 교체 이유는 햄스트링 부상...'장기 결장 가능성↑'
368 | [속보] 손흥민, 햄스트링 부상…장기 결장 가능성에 "그렇다"
369 | 손흥민 '햄스트링 부상' 당분간 결장, 후반 교체 이유
370 | '935억 디아스 맨시티행'…폰테 "최고의 선수를 영입했다"
371 | 크로스, 엉덩이 부상으로 최소 2주 결장… A매치도 제외 전망
372 | 라이스 영입 자금 필요한 첼시, PSG에 선수 매각하나(英 언론)
373 | [SW이슈]개막 9일 만에 결단 내린 샬케, 바움 신임 감독 선임
374 | 엉덩이 부상 황희찬 결장…라이프치히, 샬케에 4-0 완승
375 | '경미한 엉덩이 부상' 황희찬 결장 라이프치히, 샬케 4-0 완파
376 | 4년간 7억3600만 파운드…솔샤르 감독 "구단에 적합한 선수 영입 필요"
377 | 아쉬운 결장...황희찬 부상 여파로 샬케전 벤치
378 | 맨유, 뎀벨레 영입 사실상 불가능...'선수는 완전 이적 고집' (BBC)
379 | '첼시의 슈퍼맨' 아자르, 레알에선 '슬퍼맨'…부상으로 경기 53% 결장
380 | 파티 영입해 기쁜 아르테타 “똑똑한 선수, 활약 기대한다”
381 | 돈 없다며 마스코트 해고한 아스널의 이중성, 선수 영입에 676억 지출
382 | [오피셜] 맨유, PSG 공격수 에딘손 카바니 영입 “경험 많은 특별한 선수”
383 | 첼시, 선수 영입에 무려 3382억 썼다… 번리는 EPL 유일 0원
384 | 맨유 솔샤르 감독 “새 영입 선수들 환영, 팀 경쟁력 높여줄 것”
385 | '맨유의 반 더 비크-카바니-텔레스 영입'..."솔샤르가 원하는 선수 아냐"
386 | "맨시티, 당장 칼버트 르윈 영입해"...前선수의 강력추천
387 | 멘디, 허벅지 부상으로 최대 2주간 결장...'케파가 온다'
388 | 맨유 센터백 바이, 또 쓰러졌다...햄스트링 부상-최소 3주 결장
389 | "리그에서 가장 저평가된 SON, 살라보다 더 영입하고 싶은 선수"...英전문가의 주장
390 | 토트넘, ‘리버풀전 해트트릭’ 왓킨스 영입 시도했다... 선수도 원했다
391 | "모든 선수들의 꿈" 포그바의 고백...정작 레알은 영입 가능성 배제
392 | '이거 실화냐?'...프랑스 2부 팀 회장 "선수 영입에 FM을 이용하겠다"
393 | '대표팀 소집' 케인, 부상으로 벨기에전 결장 예상…토트넘도 한숨
394 | '불행 중 다행' 멘디, 허벅지 부상 경미...'사우스햄튼전만 결장할 듯'
395 | 라리가 승격 3팀 컨퍼런스... "선수 영입, 선수 자체가 가장 중요"
396 | '바이날둠 영입 추진' 쿠만 감독, "데 용 이외에 네덜란드 선수 원했어"
397 | 살포드 시티 '구단주' 스콜스, 임시 감독으로 선임
398 | 바르사, 선수 영입에 총 1670억 썼다… 라리가 전체 1위
399 | 벵거 감독의 돌직구 "직접 키워낸 선수를 1억파운드 들여 영입? 비논리적이야"
400 | '뚱보 논란→부상' 아자르, 엘클라시코 결장 가능성↑...부상 장기화 우려
401 | '7번째 채운다' 토트넘 무리뉴 CB 로돈 영입 총력전 "현금에 선수도 줄게"
402 | "센세이셔널!" 손흥민, 10년간 토트넘 영입 선수 평점 압도적 '1위'
403 | 판 다이크, 목발 짚은 상태 '장기부상' 우려…티아고도 결장 가능성
404 | ‘리버풀 초비상’ 반 다이크. 십자인대 부상...7~8개월 결장 예상
405 | '영입 못한 아쉬움?' 지단, "홀란드 뛰어나지만, 내 선수가 아냐"
406 | '판다이크 십자인대 부상으로 7개월 결장' 현지 전망
407 | 캐러거 "반 다이크 잃은 리버풀, 1월에 선수 영입해야"
408 | 브라이튼 감독, 대니 웰벡 영입 반색 “확실한 경력 있는 선수”
409 | 쿠만 감독 “데파이는 바르사에 필요한 선수… 1월 영입할 것”
410 | 라모스 엘 클라시코 결장? 무릎 부상에 촉각 세우는 레알
411 | '발렌시아 잡자마자 부상' 파레호, 1개월 결장
412 | '대표팀에서 종아리 부상' 외데가르드, 검사 결과 '1달 결장 불가피'
413 | 외데가르드, 레알서 안 풀리네… 종아리 부상으로 1개월 결장
414 | 레알 주장 라모스, 경미한 부상으로 UCL 첫 경기 결장
415 | [공식 발표] 뮌헨 그나브리, 코로나19 양성... 사네도 부상 결장
416 | 산체스, 허벅지 근육 부상… 최소 2경기 결장
417 | 교체 투입 후 부상… 맨시티 페르난지뉴, 최소 4주 결장할 듯
418 | 맨시티 주장 페르난지뉴, 부상으로 4-6주 결장...과르디올라 한숨
419 | '1위 에버튼 비상' 안첼로티 “하메스, 부상으로 사우스햄튼전 결장”
420 | 음바페와 네이마르의 불만 "PSG, 스타 선수 영입 좀 해"
421 | 쿠티뉴, 햄스트링 부상으로 당분간 결장 [공식발표]
422 | 발목 부상 A. 데이비스, 데어 클라시커 등 최소 6주 결장
423 | 쿠티뉴, 햄스트팅 부상으로 전력 아웃… 유벤투스전 결장
424 | [오피셜] 쿠티뉴, 엘클라시코서 햄스트링 부상...유벤투스전 결장 예정
425 | '햄스트링 부상' 아구에로, 최대 한 달 결장 예상...펩도 인정
426 | 맨시티 어쩌나, 아구에로 햄스트링 부상 최대 1개월 결장 전망
427 | 과르디올라, “햄스트링 부상 아구에로, 최대 한 달 결장”
428 | ‘햄스트링 부상’ 쿠티뉴, 한 달 결장... 브라질 대표팀도 제외
429 | 다름슈타트, 오스나브뤼크와 1-1 무승부…백승호 근육 부상으로 결장
430 | 백승호, 근육 부상으로 결장…다름슈타트는 오스나브뤼크와 비겨
431 | 맨유, 18세 아약스 MF 영입 추진...英 매체 "가장 재능 있는 10대 선수"
432 | 수비 고민 바르사, 아라우호마저 부상으로 1개월 결장
433 | "또 부상이야" 네이마르 넓적다리 부상, 약 보름 3경기 결장 불가피하다
434 | '재정 위기' 레알 마드리드, 내년 1월도 선수 영입 없다
435 | [공식발표] 라이프치히 상대하는 PSG, 네이마르-음바페 부상 결장...주전 초토화
436 | 첼시, 1월에 라이스 영입 위해 선수 2명 처분한다
437 | 호나우지뉴-크로스-노이어, 맨유가 영입할 뻔했던 선수로 꾸린 베스트11
438 | 레전드 골키퍼의 촉구, "맨유, 실수하면 안 돼...선수 영입 필요해"
439 | 호아킨, 쿠만 맹비난 "나라면 절대 감독으로 선임 안 해"
440 | 유벤투스 디렉터, "포그바가 영입 목표? 지금은 맨유 선수인데..."
441 | '1월까지 결장'…'철강왕'이었던 킴미히, 커리어 최악의 부상
442 | '부상단골손님' 맨유 루크 쇼 또 다쳤다. 햄스트링 부상으로 1개월 결장 전망
443 | 루크쇼 '또' 부상으로 한달 결장… 텔레스 다시 도약 준비
444 | ‘발목부상’ 베일, 웨일스대표팀 하차…미국과 A매치 결장할 듯
445 | [오피셜] 루크 쇼, '햄스트링 부상'으로 약 1달 결장
446 | '맷 버스비가 맨유서 처음 영입한 선수' 앨버트 퀵살 타계…향년 87세
447 | '부상 결장' 베일, 태블릿 들고 경기 관전...팬들은 "또 골프 영상 보나"
448 | '경미한 부상' 스털링, 벨기에-아이슬란드 전 결장... 토트넘 전은?
449 | 레알, 잘츠부르크 소보슬라이 영입 관심…선수도 이적 열망
450 | '수비진 붕괴' 리버풀, 내년 1월에도 선수 영입 없다
451 | 리버풀처럼 레알도 초비상...'부상' 라모스+바란, 비야레알전 결장 유력
452 | 여전히 산초 원하는 맨유, 영입 자금 위해 4명의 선수 방출한다
453 | 데파이-가르시아 영입하려고… 바르사, 1월에 선수 6명 아웃
454 | 전 아스널 선수 "에릭센 영입해야…토트넘 상관 안 해"
455 | 바르사 회장 후보 폰트 "사비 감독 선임해 전권 주겠다"
456 | [공식발표] ‘부상 병동에 운’ 바르사, 로베르토 허벅지 부상… 2달 결장
457 | 충돌 후 교체된 피케, 최대 6개월 부상 결장 ‘위기’
458 | 피케 부상, 예상보다 심각하다...'수술 시 최대 8개월 결장' (西 매체)
459 | 이번엔 뎀벨레, 피케-세르지 이어 어깨 부상... ‘최소 한 달 결장’
460 | 맨유, 에버턴 기술 이사 영입해 선수단 개편…'우드워드 부회장 OUT?'
461 | '산초가 안된면 이 선수' 맨유, '비야레알 에이스' 추쿠에제 영입에 '속도'
462 | 잘 나가다 쓰러진 이브라히모비치, 햄스트링 부상으로 2주 결장
463 | '햄스트링 부상' 벤제마, 인터 밀란전도 결장 가능성...레알 '공격 초토화'
464 | 맨시티 재건 프로젝트 최우선 영입 선수. 잭 그릴리시 노린다.
465 | 즐라탄 이브라히모비치, 햄스트링 부상 3주 결장
466 | [기자회견]무리뉴 "알더베이럴트 부상 2~4주 결장"
467 | 무리뉴 "토비 부상, 심각하진 않지만 최대 4주 결장"
468 | 포그바 최근 결장, 원인은 발목 부상 재발?
469 | 쿠만 감독은 파리목숨?…바르셀로나 ‘레전드’ 사비 감독선임 추진
470 | 아스날 팬들도 '급추락' 에릭센 영입 반대... "더 젊은 선수 사야 해"
471 | 'CB 영입 급하다' 리버풀, 아약스 21세 선수에 400억 제시
472 | 호날두 결장이유…피를로 감독 “부상방지 차원에서 휴식 부여”
473 | '복귀한지 얼마됐다고' 또 부상 아자르, 장기결장 우려
474 | "선수 영입 안 합니다" 솔샤르, 1월 이적시장 '0입' 선언
475 | '허벅지 부상 의심' 아자르, MRI 검사 실시...샤흐타르전 결장 가능성
476 | '유리몸이야, 불운이야' 아자르 허벅지 MRI, 레알 이적 후 7번째 부상-37경기 결장
477 | ‘루이스와 충돌’ 히메네스, 두개골 골절 부상… 장기간 결장 불가피
478 | '부상 의심' 마시알, 훈련 11분 만에 귀가 조치...PSG전 결장 가능성
479 | "손흥민 부상 결장에 대비하라!"...모리뉴 감독, 레드불 잘츠부르크 스타 소보슬라이 영입헤 '우승 퍼즐' 완성하나
480 | 또 깨진 '유리몸' 아자르, 허벅지 부상 최소 3주 결장
481 | [기자회견]케인 부상으로 LASK전 결장, 손흥민 원톱 가능성 대두
482 | 리버풀 또 부상, 알리송 햄스트링으로 2주 결장…주전 9명 이탈
483 | 해리 케인, 부상으로 유로파리그 결장…손흥민 역할 ↑
484 | 케인, 부상으로 유로파리그 결장…비니시우스‧레길론도 출전 불가
485 | '햄스트링 부상' 홀란드, 2020년 잔여 기간 못 뛴다...'1월 초까지 결장'
486 | 손흥민 유로파리그 풀타임 전망…케인·비니시우스 부상 결장
487 | [벨기에통신] STVV, 흘러바흐 감독 선임 불발... 이승우에게 호재?
488 | '손흥민 제친 亞 최고 선수' 혼다, 포르투갈서 영입 제의
489 | '북런던 더비 GK는 하트?'…요리스, 부상 때문에 결장 가능성 높다
490 | 레알 담당 기자, “레알은 손흥민 영입 고려 안 해, 더 높은 선수 목표”
491 | '메시 영입설' PSG 단장, "이적 시장 기간 아니야...다른 팀 선수 언급 NO"
492 | 은돔벨레 결장, 경미한 부상 때문 "회복하기에는 촉박"
493 | '왜 결장한 거지' 토트넘팬 은돔벨레 결장에 의문 폭발 "제발 부상이라고 말하지마"
494 | [오피셜] 이승우의 STVV, ‘횡령 논란’ 마에스 감독 선임
495 | [벨기에통신] 혼란의 STVV, 신임 감독에 ‘횡령 기소’ 마에스 선임 예정
496 | 라이프치히와 '격전' 앞둔 맨유, 부상 악령...카바니+마르시알 결장
497 | 퍼디난드 "손흥민, 맨유로 영입하고 싶은 선수"
498 | 리오 퍼디난드 "손흥민, 맨유로 영입하고 싶은 선수"
499 | ‘챔스 탈락’ 맨유팬 뿔났다 “당장 포체티노 감독 선임해”
500 | 퍼디난드 "박지성은 피를로의 침대귀신 같았다… 선수 영입한다면 손흥민"
501 | '등 떠밀렸던' 파티, 결국 부상 재발로 수 주간 결장 (英 매체)
502 | 퍼디난드 "맨유에서 가장 영입하고 싶은 선수는 손흥민"
503 | '아약스 CEO' 반 데 사르, "레알-바르셀로나-맨유가 우리 팀 선수 영입했으면"
504 | "무리뉴, 다이어-알더베이럴트 있어도 슈크리니아르 영입해야 우승해"...前 토트넘 선수 주장
505 | 판 페르시 "키엘리니 영입하라고 벵거에게 추천했었다, 아주 대단한 선수"
506 | '부상 병동' 리버풀, 조타도 아웃…무릎 부상으로 풀럼전 결장
507 | 리버풀, BIG6 중 '1군 부상 이탈 시간 1위'...그 중 체임벌린은 100% 결장
508 | PSG 네이마르, 상대 깊은 태클에 큰 부상 ‘장기 결장 가능성도’
509 | 前아스널 선수, "퇴장 당한 자카 팔고 공짜로 날 영입 어때?"
510 |
--------------------------------------------------------------------------------
/practice-note/week_10/W10-1_text-mining-for-practice_python_text-summerization.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "collapsed": true
7 | },
8 | "source": [
9 | "# TEXT MINING for PRACTICE\n",
10 | "- 본 자료는 텍스트 마이닝을 활용한 연구 및 강의를 위한 목적으로 제작되었습니다.\n",
11 | "- 본 자료를 강의 목적으로 활용하고자 하시는 경우 꼭 아래 메일주소로 연락주세요.\n",
12 | "- 본 자료에 대한 허가되지 않은 배포를 금지합니다.\n",
13 | "- 강의, 저작권, 출판, 특허, 공동저자에 관련해서는 문의 바랍니다.\n",
14 | "- **Contact : ADMIN(admin@teanaps.com)**\n",
15 | "\n",
16 | "---"
17 | ]
18 | },
19 | {
20 | "cell_type": "code",
21 | "execution_count": 1,
22 | "metadata": {},
23 | "outputs": [],
24 | "source": [
25 | "# 텍스트 분석을 위한 TEANAPS 라이브러리를 설치합니다.\n",
26 | "# TEANAPS는 Google Colaboratory/Linux 환경에 최적화되어 있습니다.\n",
27 | "# Windows 환경에서 일부 기능에 제한이 있을 수 있습니다."
28 | ]
29 | },
30 | {
31 | "cell_type": "code",
32 | "execution_count": 2,
33 | "metadata": {},
34 | "outputs": [],
35 | "source": [
36 | "# TEANAPS (https://github.com/fingeredman/teanaps)\n",
37 | "#!git clone https://github.com/fingeredman/teanaps.git"
38 | ]
39 | },
40 | {
41 | "cell_type": "code",
42 | "execution_count": 3,
43 | "metadata": {},
44 | "outputs": [],
45 | "source": [
46 | "#!ls"
47 | ]
48 | },
49 | {
50 | "cell_type": "code",
51 | "execution_count": 4,
52 | "metadata": {},
53 | "outputs": [],
54 | "source": [
55 | "#!python \"teanaps/teanaps_setup.py\""
56 | ]
57 | },
58 | {
59 | "cell_type": "markdown",
60 | "metadata": {},
61 | "source": [
62 | "## WEEK 10-1. 뉴스기사 요약과 키워드 추출하기: 추출요약\n",
63 | "- Python으로 문서를 요약하고 키워드를 추출하는 방법에 대해 다룹니다.\n",
64 | "\n",
65 | "---"
66 | ]
67 | },
68 | {
69 | "cell_type": "markdown",
70 | "metadata": {},
71 | "source": [
72 | "### 1. 뉴스기사 불러오기\n",
73 | "\n",
74 | "---"
75 | ]
76 | },
77 | {
78 | "cell_type": "code",
79 | "execution_count": 5,
80 | "metadata": {},
81 | "outputs": [],
82 | "source": [
83 | "from teanaps.handler import FileHandler\n",
84 | "\n",
85 | "fh = FileHandler()\n",
86 | "\n",
87 | "PATH = \"data/article_sample.txt\"\n",
88 | "line_list = fh.load_txt(PATH)"
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": 6,
94 | "metadata": {},
95 | "outputs": [
96 | {
97 | "data": {
98 | "text/plain": [
99 | "[['비트코인',\n",
100 | " 'ZDNet Korea',\n",
101 | " '2019-04-14 09:58:00',\n",
102 | " '\"비트코인 가능성 알려면, 결함 전제로 규제 정비必\"',\n",
103 | " '금융硏 비트코인 쇠락과 내재적 결함 보고서(지디넷코리아=손예술 기자)대표적인 암호화폐 비트코인의 가격이 급변동했음에도 불구, 일부 암호화폐 옹호론자들은 비트코인이 갖고 있는 몇 가지 결함이 해소되면 새로운 국면이 나타날 것으로 예측했다.그들은 이런 결함을 전제로 국내외 정부와 감독당국은 선제적으로 시각 및 규제 환경을 정비해야 한다는 주장하고 있다.14일 한국금융연구원은 비트코인 쇠락과 내재적 결함이란 보고서에서 암호화폐 옹호론자의 입장과 함께 그들이 제시한 세 가지 결함을 발표했다.여기서 암호화폐 옹호론자들은 암호화폐로 새로운 부가가치를 낼 수 있는 사업모델 등장 가능성에 집중하고 있는 인물들로 통칭된다.그러나 그들은 이를 위해서 비트코인이 세 가지 결함이 우선적으로 해소돼야 한다고 보고 있다.하나는 비트코인이 재화와 용역을 구입하는데 사용되는 시장이 아직은 너무 좁다는 것이다. 미국 비트코인 시장조사기관인 사토시 캐피탈 리서치에 따르면 지난 2017년 기준으로 비트코인을 사용한 거래 결제액은 약 24억달러로 중국의 알리페이와 위챗페이의 거래 결제액이 약 15조달러였음을 감안하면 지나치게 적은 시장이라는 것이다.두 번째는 비트코인은 거래 건수 급증과 블록 용량 제한 등으로 채굴을 통핸 결제 처리가 지연돼, 이용자들이 거래 완료를 위해 부담해야 하는 수수료가 높아지는 문제가 있다는 것이다. 비트코인 기반 기술인 블록체인을 구성하는 각 블록 용량은 1메가바이트로 이뤄져 있고 초당 평균 거래 처리 건수는 7건이며 약 10분마다 1개 블록이 형성된다. 반면 비자의 경우 초당 거래 처리 건수는 수 만건에 달한다.세 번째로 거래소 해킹 등과 같은 사기성 거래에 아직도 노출돼 있다는 점이다. 지난 2월 캐나다 암호화폐 거래소 쿼드리가CX대표이사이자 설립자는 사망과 거액의 고객 암호화폐 분시로 파산 보호를 신청했으며 3월 파산관재인 은 비밀키를 관리했던 설립자 사망 이전 8개월 간 핫월렛에 고객의 암호화폐가 없었다고 발표했다. 핫월렛은 인터넷과 연결돼 있는 암호화폐 전자지갑이다.세 가지 결함에도 불구 비트코인을 이용한 오프라인 결제가 이뤄지거나 다양한 나라서 디지털 화폐에 대한 실험적인 시도가 이뤄지는 상태다.이 때문에 암호화폐나 비트코인이 정말 법정통화를 보완하거나 새로운 지급결제나 가치저장 수단으로 역할을 할 수 있을지 가늠하기 위해선 내재적 결함 대처와 국내외 정부나 감독당국은 암호화폐에 대한 시각 및 규제 환경 정비가 필요하다는 게 이 보고서의 의견이다.특히 옹호론자가 지적한 세 가지 결함 중 일부는 금융소비자나 투자자들의 보호 문제와 직결돼 있는 상황이다.한국금융연구원은 \"암호화폐 수용을 검토하고 있는 정부나 감독당국들은 소비자 보호 강화 및 금융시장의 안정성 확보 관점에서 시장 참가자들의 정보 공시 의무 강화, 결제 계좌 및 전자지갑 제공 거래소나 금융사의 자본금 또는 유동성 규제를 부과하고 있다\"며 \"이밖에도 자금 세탁 차단 등에 대한 집중적인 검토가 필요하다\"고 서술했다.한편, 비트코인은 2017년 12월 중순 2만달러까지 육박했지만 올해 3월까지 4천달러까지 떨어지는 등 이 기간동안 비트코인의 시가총액은 9천억달러에서 800억달러까지 감소했다.손예술 기자(kunst@zdnet.co.kr)'],\n",
104 | " ['비트코인',\n",
105 | " '한국경제',\n",
106 | " '2019-03-09 07:02:00',\n",
107 | " '워렌 버핏 \"비트코인은 망상\" vs 하버드대 교수 \"망상 아니다\"',\n",
108 | " '비트코인 놓고 상반된 평가 내놔[ 김산하 기자 ] 니얼 퍼거슨 하버드대 교수(왼쪽), 워렌 버핏 버크셔해서웨이 회장(오른쪽)(사진=트위터)워렌 버핏 버크셔해서웨이 회장과 세계적 경제사학자 니얼 퍼거슨 하버드대 교수가 비트코인을 두고 상반된 평가를 내놓았다. 과거 비트코인을 비판하던 퍼거슨 교수는 자신의 발언을 후회한다고 언급한 반면 버핏 회장은 한층 더 부정적 시각을 견지해 눈길을 끌었다.버핏 회장은 지난달 25일(이하 현지시간) 미국 CNBC와의 인터뷰에서 “비트코인은 고유 가치가 없으며 아무것도 생산해내지 못한다. 기본적으로 망상”이라고 주장했다. 이어 “비트코인은 사기꾼들을 끌어들인다”면서 인생이 바뀔 것이라 기대하며 가상화폐(암호화폐)에 투자하는 투자자들이 안타깝다고 말했다.그는 지난해 5월 버크셔해서웨이 주주총회에서도 “비트코인은 쥐약과 같다”며 비판적 발언을 한 바 있다. 그 이전에도 비트코인을 ‘튤립 버블’이나 ‘신기루’에 비유해왔다.하지만 퍼거슨 교수는 생각이 달라졌다. 7일(현지시간) 외신에 따르면 퍼거슨 교수는 호주 경제일간지 AFR이 개최한 비즈니스 서밋의 비공개 행사에서 “암호화폐는 망상이 아니다”라고 말했다. 버핏의 주장과 정반대 입장을 밝힌 셈이다.퍼거슨 교수는 블록체인 기반의 암호화폐가 쓰일 만한 곳이 존재하지 않는다고 봤으나 생각이 바뀌었다고 했다. 그는 비트코인 가격이 절정에 달한 지난 2017년 말 미국 폭스비즈니스네트워크 방송에 출연해 “비트코인은 금융 역사상 가장 큰 버블(거품)”이라고 평가한 바 있다.그러다가 지난달에는 “비트코인은 ‘디지털 금’이 될 수 있는 후보 중 하나”라며 비트코인에 대해 긍정적으로 바뀐 시각을 내비쳤다. 또 “지난 10년간 금융의 변화보다 앞으로 10년의 금융의 변화가 훨씬 더 혁신적일 것”이라고 전망했다. 그는 최근 한 블록체인 회사 자문위원으로도 참여한 것으로 알려졌다.김산하 한경닷컴 기자 sanha@hankyung.com기사제보 및 보도자료 open@hankyung.com[한경닷컴 바로가기] [모바일한경 구독신청] 네이버에서 한국경제 채널 구독하기 <자세히 보기> ⓒ 한국경제 & hankyung.com, 무단전재 및 재배포 금지'],\n",
109 | " ['비트코인',\n",
110 | " '한국경제',\n",
111 | " '2019-04-07 09:02:00',\n",
112 | " '\"가상화폐, 94년 인터넷 수준…비트코인캐시가 선두주자 될 것\"',\n",
113 | " '[코인터뷰] 스테판 러스트 비트코인닷컴 비즈니스총괄[ 김산하 기자 ] 한경닷컴과 인터뷰중인 스테판 러스트(Stefan Rust) 비트코인닷컴 비즈니스 총괄\"현재 가상화폐(암호화폐) 생태계에는 약 5000만명 정도 사용자가 들어와 있는 것으로 추정됩니다. 1994~1995년경 인터넷 사용자 수와 비슷하죠. 우리가 얼마나 암호화폐 산업의 초기 단계에 있는지 알 수 있습니다.\"지난 4일 서울 장충체육관에서 개최된 열린 \\'분산경제포럼(디코노미) 2019\\'에서 한경닷컴과 인터뷰한 스테판 러스트(Stefan Rust) 비트코인닷컴 비즈니스 총괄(사진)은 현재 암호화폐 상황을 이같이 짚었다. 스테판 총괄은 \"당시엔 구글도 존재하지 않았다. 전세계 인터넷의 표준이 된 TCP/IP 프로토콜 역시 그 당시 표준 프로토콜도 아니었다\"면서 \"비트코인캐시가 초기 단계인 암호화폐 생태계에서 빠르게 표준으로 자리잡을 수 있도록 노력하겠다\"고 강조했다.비트코인닷컴은 전세계 5위 암호화폐 비트코인캐시를 이끄는 암호화폐 기업이다. 글로벌 암호화폐 전문 미디어 \\'비트코인뉴스\\'를 비롯해 암호화폐 관련 지갑 서비스, 채굴 사업, 플랫폼 사업, 게임 사업 등을 펼치고 있다. 그의 설명에 따르면 비트코인닷컴 암호화폐지갑에는 약 400만개의 활성화된 주소가 존재한다. 매일 1만5000건 상당의 활동이 발생하며 지갑 앱(응용프로그램)도 일평균 8000건 다운로드된다.비트코인닷컴은 금융 서비스의 \\'질\\'을 높이는 데 집중하고 있다. 암호화폐 지갑 앱을 통해 이용자들이 암호화폐 수탁 서비스 등 보다 좋은 금융 관리 서비스를 받을 수 있도록 하겠다는 계획이다.한경닷컴과 인터뷰중인 스테판 러스트(Stefan Rust) 비트코인닷컴 비즈니스 총괄개발자 육성에도 많은 공을 들이고 있다고 귀띔했다. 비트코인캐시의 블록체인 위에서 작동되는 앱들을 육성하기 위해서다. 비트코인닷컴은 이를 위해 개발자들이 쓸 수 있는 도구모음(Tool Set)을 만들었다. 스테판 총괄은 \"우리는 개발자들이 프로토콜 위에서 앱을 만들려 할 때 무엇을 원하는지 알고 있다\"며 \"이제 개발자들이 비트코인캐시 플랫폼을 활용해 스마트 계약이나 토큰을 쉽게 만들 수 있게 됐다\"고 의미 부여했다.비트코인닷컴은 연내 블록체인 개발자들을 위한 해커톤을 국내에서 개최할 계획. 스테판 총괄은 \"개발자들에게 비트코인캐시 플랫폼을 더 많이 알리자는 취지\"라며 \"한국은 세계 톱5 안에 드는 암호화폐 시장이고 뛰어난 개발자들이 많다. 우리는 한국과 함께 하고 싶다\"고 말했다.비트코인캐시 시세는 한경닷컴과 인터뷰한 당일까지 3일간 무려 80% 넘게 급등했다. 그는 \"같은 기간 비트코인이 약 20% 오른 것에 비하면 상승폭이 크지만 우리는 여전히 비트코인캐시가 상당히 평가절하돼 있다고 생각한다. 사람들이 비트코인캐시를 진정한 \\'결제수단\\'으로 사용하길 원한다\"고 역설했다.비트코인캐시의 다음 목표는 개인간(P2P) 가치전송 체계의 \\'표준\\'이 되는 것이라고 했다. 카카오톡의 보이스톡, 스카이프 등에 사용되는 음성 인터넷프로토콜(VoIP)을 사례로 들었다. 예컨대 과거엔 국제통화를 하려면 비싼 돈을 내고 통신사 제공 유선망을 통해 전화해야 했지만, 이젠 대부분 인터넷 전화인 VoIP를 활용해 아주 저렴한 비용으로 빠르게 통화할 수 있게 됐다는 것이다.스테판 총괄은 \"전화가 VoIP로 발전한 것처럼 암호화폐도 금융이 일종의 \\'통화 인터넷프로토콜(Money over IP)\\'로 발전한 형태\"라며 \"금전적인 가치 자체를 인터넷에 실어보낼 수 있게 됐다. 다가올 미래에는 암호화폐가 \\'미래 금융\\' 그 자체가 될 것\"이라고 내다봤다.김산하 한경닷컴 기자 sanha@hankyung.com기사제보 및 보도자료 open@hankyung.com[한경닷컴 바로가기] [모바일한경 구독신청] 네이버에서 한국경제 채널 구독하기 <자세히 보기> ⓒ 한국경제 & hankyung.com, 무단전재 및 재배포 금지']]"
114 | ]
115 | },
116 | "execution_count": 6,
117 | "metadata": {},
118 | "output_type": "execute_result"
119 | }
120 | ],
121 | "source": [
122 | "line_list[:3]"
123 | ]
124 | },
125 | {
126 | "cell_type": "markdown",
127 | "metadata": {},
128 | "source": [
129 | "### 2. 뉴스기사 요약하기\n",
130 | "\n",
131 | "---"
132 | ]
133 | },
134 | {
135 | "cell_type": "code",
136 | "execution_count": 7,
137 | "metadata": {},
138 | "outputs": [
139 | {
140 | "data": {
141 | "text/html": [
142 | ""
143 | ],
144 | "text/vnd.plotly.v1+html": [
145 | ""
146 | ]
147 | },
148 | "metadata": {},
149 | "output_type": "display_data"
150 | },
151 | {
152 | "data": {
153 | "text/html": [
154 | ""
155 | ],
156 | "text/vnd.plotly.v1+html": [
157 | ""
158 | ]
159 | },
160 | "metadata": {},
161 | "output_type": "display_data"
162 | },
163 | {
164 | "data": {
165 | "text/html": [
166 | ""
167 | ],
168 | "text/vnd.plotly.v1+html": [
169 | ""
170 | ]
171 | },
172 | "metadata": {},
173 | "output_type": "display_data"
174 | },
175 | {
176 | "data": {
177 | "text/html": [
178 | ""
179 | ],
180 | "text/vnd.plotly.v1+html": [
181 | ""
182 | ]
183 | },
184 | "metadata": {},
185 | "output_type": "display_data"
186 | },
187 | {
188 | "data": {
189 | "text/html": [
190 | ""
191 | ],
192 | "text/vnd.plotly.v1+html": [
193 | ""
194 | ]
195 | },
196 | "metadata": {},
197 | "output_type": "display_data"
198 | },
199 | {
200 | "data": {
201 | "text/html": [
202 | ""
203 | ],
204 | "text/vnd.plotly.v1+html": [
205 | ""
206 | ]
207 | },
208 | "metadata": {},
209 | "output_type": "display_data"
210 | }
211 | ],
212 | "source": [
213 | "from teanaps.text_analysis import DocumentSummarizer\n",
214 | "\n",
215 | "ds = DocumentSummarizer()"
216 | ]
217 | },
218 | {
219 | "cell_type": "code",
220 | "execution_count": 8,
221 | "metadata": {},
222 | "outputs": [
223 | {
224 | "data": {
225 | "text/plain": [
226 | "['금리',\n",
227 | " '한국경제',\n",
228 | " '2019-01-24 17:39:00',\n",
229 | " '은행 \"새 코픽스 도입해도 대출금리 크게 떨어지진 않아\"',\n",
230 | " '정부 대출체계 개선안 비판…\"금융당국 의도 수상하다\"은행 \"정부가 잘못된 정보 전달\"코픽스 낮아지는 만큼 가산금리 자동으로 올라非시장성 자금 비중 높아지면 리스크 커지기 때문정부 압박으로 대출금리 어느 정도는 내려야할 듯금융위 \"은행들 실적 좋아…대출금리 인하 여력 커\"[ 안상미 기자 ] ‘은행권 대출금리 산정 개선방안’이 일제히 보도된 지난 23일 아침. 다수의 은행 여신담당자가 한국경제신문에 전화를 걸어왔다. 이들은 “정부가 22일 발표한 내용은 상당히 잘못됐다”고 입을 모았다. 이들은 한결같이 “금융당국은 새 코픽스(COFIX·자본조달비용지수)가 도입되면 대출금리가 0.27%포인트 낮아질 것이라고 얘기하지만 실제로는 변동이 없다”며 “정부가 대출자들에게 잘못된 정보를 전달하고 있다”고 지적했다. 은행 관계자들이 이처럼 정부를 정면 비판하고 나선 이유는 뭘까.정부 일제히 비판 나선 은행들금융위원회는 22일 정부서울청사에서 대출금리 개편방안을 발표하고 언론 브리핑을 했다. 개편방안의 핵심은 오는 7월부터 새로운 코픽스(잔액 기준)를 도입하겠다는 것이다. 새 코픽스는 현재 코픽스보다 금리가 0.27%포인트 낮기 때문에 대출금리가 낮아질 것이라고 금융위는 설명했다.은행의 대출금리는 기준금리에 가산금리와 가감조정금리를 더해서 결정된다. 여기서 기준금리가 코픽스다. 코픽스는 8개 은행이 조달한 정기 예·적금, 상호부금, 금융채, 양도성예금증서(CD) 등 8개 수신상품의 평균 비용을 가중평균한 것. 전국은행연합회가 매달 신규취급 기준 코픽스와 잔액 기준 코픽스를 발표한다.금융당국은 보통예금 등 요구불예금, 수시입출식 저축성예금 등을 넣은 새 코픽스가 산정될 것이라고 했다. 요구불예금은 금리가 연 0.1% 정도로 낮다. 이 같은 요구불예금 등이 코픽스 계산 때 들어가면 금리가 0.27%포인트 낮아진다는 게 금융위 설명이다.하지만 은행 관계자들은 금융위가 사실을 정확히 전달하지 않았다고 비판했다. 코픽스(기준금리)가 낮아지더라도 가산금리가 높아지기 때문에 최종 대출금리는 내려가지 않는다고 했다. 가산금리는 업무원가, 리스크 프리미엄, 유동성 프리미엄, 목표이익률 등을 합쳐 산정하는데, 새 코픽스를 기준으로 삼는 대출상품은 리스크 프리미엄이 자동으로 상승한다는 것이 은행 관계자들의 진단이다.익명을 요구한 한 은행 여신담당자는 “리스크 프리미엄을 산정할 때 핵심이 시장성 자금조달이냐 아니냐는 문제”라며 “새 코픽스엔 요구불예금, 한국은행 차입금 등 비(非)시장성 자금이 감안되기 때문에 당연히 리스크 프리미엄이 높아진다”고 분석했다.코픽스 무용론도 제기은행 관계자들은 금융당국이 이 같은 현황을 잘 알고 있을 것이라고 했다. 브리핑 때 금융위 당국자도 비슷한 언급을 했다. 금융위 관계자는 “코픽스 금리가 낮아지는 만큼 은행들이 가산금리를 올리면 실제 대출금리가 낮아지지 않을 수도 있다”고 했다.하지만 이 관계자는 “은행들이 가산금리를 올리면 비난 여론이 일 수밖에 없고 이것이 은행에 대한 압박 수단으로 작용할 것”이라고 했다. 은행 관계자들은 이 발언을 두고 “가산금리가 자동으로 올라가야 하는데도 금융당국은 이를 인위적으로 올리는 것으로 보고 압박을 가하겠다는 것과 다름없다”고 지적했다.은행 관계자들은 ‘코픽스 무용론’도 제기했다. A은행 관계자는 “대출금리는 시장금리로 정해지는 것인데 마치 과거 자금조달 금리 평균을 산출한 코픽스에 따라 결정되는 것처럼 오해하는 것 같다”며 “은행들에 가산금리에 손대지 말라고 하면 향후 시장금리가 급격하게 변동하는 경우 그만큼 손실을 떠안는 것”이라고 하소연했다.특히 최근 2년간 코픽스가 6개월 금융채와 비슷하게 움직여 코픽스 변동분만 반영해 대출금리가 적용됐을 뿐 금리인상 국면에서 손실폭이 더 커질 수 있다고 우려했다.B은행 관계자는 “미국 은행들은 자체적으로 대출 기준금리를 정하고 자율로 가산금리를 붙여 대출금리를 정한다”며 “은행연합회를 내세워 공통된 기준을 정하고 금융당국이 압박을 가해 대출금리를 내리라고 하는 것은 세계적으로 유례를 찾기 힘들다”고 말했다.금융위 관계자는 “새 코픽스 도입으로 리스크 프리미엄이 올라가는 측면은 있을 것”이라면서도 “은행들의 이익 규모가 큰 만큼 대출금리를 내릴 여지는 충분하다고 본다”고 말했다. 은행 관계자들은 “이론적으론 대출금리가 안 떨어지지만 현실적으론 정부의 대출금리 인하 요구가 강해 어느 정도 내리긴 해야 한다는 분위기”라고 전했다.안상미 기자 saramin@hankyung.com[한경닷컴 바로가기] [모바일한경 구독신청] 네이버에서 한국경제 채널 구독하기 <자세히 보기> ⓒ 한국경제 & hankyung.com, 무단전재 및 재배포 금지']"
231 | ]
232 | },
233 | "execution_count": 8,
234 | "metadata": {},
235 | "output_type": "execute_result"
236 | }
237 | ],
238 | "source": [
239 | "article = line_list[50]\n",
240 | "article"
241 | ]
242 | },
243 | {
244 | "cell_type": "code",
245 | "execution_count": 9,
246 | "metadata": {},
247 | "outputs": [
248 | {
249 | "data": {
250 | "text/plain": [
251 | "'정부 대출체계 개선안 비판…\"금융당국 의도 수상하다\"은행 \"정부가 잘못된 정보 전달\"코픽스 낮아지는 만큼 가산금리 자동으로 올라非시장성 자금 비중 높아지면 리스크 커지기 때문정부 압박으로 대출금리 어느 정도는 내려야할 듯금융위 \"은행들 실적 좋아…대출금리 인하 여력 커\"[ 안상미 기자 ] ‘은행권 대출금리 산정 개선방안’이 일제히 보도된 지난 23일 아침. 다수의 은행 여신담당자가 한국경제신문에 전화를 걸어왔다. 이들은 “정부가 22일 발표한 내용은 상당히 잘못됐다”고 입을 모았다. 이들은 한결같이 “금융당국은 새 코픽스(COFIX·자본조달비용지수)가 도입되면 대출금리가 0.27%포인트 낮아질 것이라고 얘기하지만 실제로는 변동이 없다”며 “정부가 대출자들에게 잘못된 정보를 전달하고 있다”고 지적했다. 은행 관계자들이 이처럼 정부를 정면 비판하고 나선 이유는 뭘까.정부 일제히 비판 나선 은행들금융위원회는 22일 정부서울청사에서 대출금리 개편방안을 발표하고 언론 브리핑을 했다. 개편방안의 핵심은 오는 7월부터 새로운 코픽스(잔액 기준)를 도입하겠다는 것이다. 새 코픽스는 현재 코픽스보다 금리가 0.27%포인트 낮기 때문에 대출금리가 낮아질 것이라고 금융위는 설명했다.은행의 대출금리는 기준금리에 가산금리와 가감조정금리를 더해서 결정된다. 여기서 기준금리가 코픽스다. 코픽스는 8개 은행이 조달한 정기 예·적금, 상호부금, 금융채, 양도성예금증서(CD) 등 8개 수신상품의 평균 비용을 가중평균한 것. 전국은행연합회가 매달 신규취급 기준 코픽스와 잔액 기준 코픽스를 발표한다.금융당국은 보통예금 등 요구불예금, 수시입출식 저축성예금 등을 넣은 새 코픽스가 산정될 것이라고 했다. 요구불예금은 금리가 연 0.1% 정도로 낮다. 이 같은 요구불예금 등이 코픽스 계산 때 들어가면 금리가 0.27%포인트 낮아진다는 게 금융위 설명이다.하지만 은행 관계자들은 금융위가 사실을 정확히 전달하지 않았다고 비판했다. 코픽스(기준금리)가 낮아지더라도 가산금리가 높아지기 때문에 최종 대출금리는 내려가지 않는다고 했다. 가산금리는 업무원가, 리스크 프리미엄, 유동성 프리미엄, 목표이익률 등을 합쳐 산정하는데, 새 코픽스를 기준으로 삼는 대출상품은 리스크 프리미엄이 자동으로 상승한다는 것이 은행 관계자들의 진단이다.익명을 요구한 한 은행 여신담당자는 “리스크 프리미엄을 산정할 때 핵심이 시장성 자금조달이냐 아니냐는 문제”라며 “새 코픽스엔 요구불예금, 한국은행 차입금 등 비(非)시장성 자금이 감안되기 때문에 당연히 리스크 프리미엄이 높아진다”고 분석했다.코픽스 무용론도 제기은행 관계자들은 금융당국이 이 같은 현황을 잘 알고 있을 것이라고 했다. 브리핑 때 금융위 당국자도 비슷한 언급을 했다. 금융위 관계자는 “코픽스 금리가 낮아지는 만큼 은행들이 가산금리를 올리면 실제 대출금리가 낮아지지 않을 수도 있다”고 했다.하지만 이 관계자는 “은행들이 가산금리를 올리면 비난 여론이 일 수밖에 없고 이것이 은행에 대한 압박 수단으로 작용할 것”이라고 했다. 은행 관계자들은 이 발언을 두고 “가산금리가 자동으로 올라가야 하는데도 금융당국은 이를 인위적으로 올리는 것으로 보고 압박을 가하겠다는 것과 다름없다”고 지적했다.은행 관계자들은 ‘코픽스 무용론’도 제기했다. A은행 관계자는 “대출금리는 시장금리로 정해지는 것인데 마치 과거 자금조달 금리 평균을 산출한 코픽스에 따라 결정되는 것처럼 오해하는 것 같다”며 “은행들에 가산금리에 손대지 말라고 하면 향후 시장금리가 급격하게 변동하는 경우 그만큼 손실을 떠안는 것”이라고 하소연했다.특히 최근 2년간 코픽스가 6개월 금융채와 비슷하게 움직여 코픽스 변동분만 반영해 대출금리가 적용됐을 뿐 금리인상 국면에서 손실폭이 더 커질 수 있다고 우려했다.B은행 관계자는 “미국 은행들은 자체적으로 대출 기준금리를 정하고 자율로 가산금리를 붙여 대출금리를 정한다”며 “은행연합회를 내세워 공통된 기준을 정하고 금융당국이 압박을 가해 대출금리를 내리라고 하는 것은 세계적으로 유례를 찾기 힘들다”고 말했다.금융위 관계자는 “새 코픽스 도입으로 리스크 프리미엄이 올라가는 측면은 있을 것”이라면서도 “은행들의 이익 규모가 큰 만큼 대출금리를 내릴 여지는 충분하다고 본다”고 말했다. 은행 관계자들은 “이론적으론 대출금리가 안 떨어지지만 현실적으론 정부의 대출금리 인하 요구가 강해 어느 정도 내리긴 해야 한다는 분위기”라고 전했다.안상미 기자 saramin@hankyung.com[한경닷컴 바로가기] [모바일한경 구독신청] 네이버에서 한국경제 채널 구독하기 <자세히 보기> ⓒ 한국경제 & hankyung.com, 무단전재 및 재배포 금지'"
252 | ]
253 | },
254 | "execution_count": 9,
255 | "metadata": {},
256 | "output_type": "execute_result"
257 | }
258 | ],
259 | "source": [
260 | "content = article[4]\n",
261 | "content"
262 | ]
263 | },
264 | {
265 | "cell_type": "markdown",
266 | "metadata": {},
267 | "source": [
268 | "#### 2.1. 요약하기: TextRank\n",
269 | "\n",
270 | "---"
271 | ]
272 | },
273 | {
274 | "cell_type": "code",
275 | "execution_count": 10,
276 | "metadata": {},
277 | "outputs": [
278 | {
279 | "data": {
280 | "text/plain": [
281 | "['정부 대출체계 개선안 비판…\"금융당국 의도 수상하다\"은행 \"정부가 잘못된 정보 전달\"코픽스 낮아지는 만큼 가산금리 자동으로 올라非시장성 자금 비중 높아지면 리스크 커지기 때문정부 압박으로 대출금리 어느 정도는 내려야할 듯금융위 \"은행들 실적 좋아…대출금리 인하 여력 커\"[ 안상미 기자 ] ‘은행권 대출금리 산정 개선방안’이 일제히 보도된 지난 23일 아침.',\n",
282 | " '이들은 한결같이 “금융당국은 새 코픽스(COFIX·자본조달비용지수)가 도입되면 대출금리가 0.27%포인트 낮아질 것이라고 얘기하지만 실제로는 변동이 없다”며 “정부가 대출자들에게 잘못된 정보를 전달하고 있다”고 지적했다.',\n",
283 | " '새 코픽스는 현재 코픽스보다 금리가 0.27%포인트 낮기 때문에 대출금리가 낮아질 것이라고 금융위는 설명했다.']"
284 | ]
285 | },
286 | "execution_count": 10,
287 | "metadata": {},
288 | "output_type": "execute_result"
289 | }
290 | ],
291 | "source": [
292 | "SUMMARIZER_TYPE = \"textrank\"\n",
293 | "MAX_SENTENCES = 3\n",
294 | "\n",
295 | "result = ds.summarize(SUMMARIZER_TYPE, MAX_SENTENCES, document=content)\n",
296 | "result"
297 | ]
298 | },
299 | {
300 | "cell_type": "markdown",
301 | "metadata": {},
302 | "source": [
303 | "#### 2.2. 요약하기: LSA\n",
304 | "\n",
305 | "---"
306 | ]
307 | },
308 | {
309 | "cell_type": "code",
310 | "execution_count": 11,
311 | "metadata": {},
312 | "outputs": [
313 | {
314 | "data": {
315 | "text/plain": [
316 | "['이들은 한결같이 “금융당국은 새 코픽스(COFIX·자본조달비용지수)가 도입되면 대출금리가 0.27%포인트 낮아질 것이라고 얘기하지만 실제로는 변동이 없다”며 “정부가 대출자들에게 잘못된 정보를 전달하고 있다”고 지적했다.',\n",
317 | " '은행 관계자들은 이 발언을 두고 “가산금리가 자동으로 올라가야 하는데도 금융당국은 이를 인위적으로 올리는 것으로 보고 압박을 가하겠다는 것과 다름없다”고 지적했다.',\n",
318 | " '금융위 관계자는 “새 코픽스 도입으로 리스크 프리미엄이 올라가는 측면은 있을 것”이라면서도 “은행들의 이익 규모가 큰 만큼 대출금리를 내릴 여지는 충분하다고 본다”고 말했다.']"
319 | ]
320 | },
321 | "execution_count": 11,
322 | "metadata": {},
323 | "output_type": "execute_result"
324 | }
325 | ],
326 | "source": [
327 | "SUMMARIZER_TYPE = \"lsa\"\n",
328 | "MAX_SENTENCES = 3\n",
329 | "\n",
330 | "result = ds.summarize(SUMMARIZER_TYPE, MAX_SENTENCES, document=content)\n",
331 | "result"
332 | ]
333 | },
334 | {
335 | "cell_type": "markdown",
336 | "metadata": {},
337 | "source": [
338 | "### 2. 키워드 추출하기\n",
339 | "\n",
340 | "---"
341 | ]
342 | },
343 | {
344 | "cell_type": "code",
345 | "execution_count": 12,
346 | "metadata": {},
347 | "outputs": [],
348 | "source": [
349 | "from teanaps.text_analysis import KeywordExtractor\n",
350 | "\n",
351 | "#kea = KeywordExtractor(model_path=\"/model\")\n",
352 | "kea = KeywordExtractor()"
353 | ]
354 | },
355 | {
356 | "cell_type": "code",
357 | "execution_count": 13,
358 | "metadata": {},
359 | "outputs": [
360 | {
361 | "data": {
362 | "text/plain": [
363 | "[('LGU+', 1.33617, (16, 20)),\n",
364 | " ('SKT', 0.81265, (11, 14)),\n",
365 | " ('KT', 0.79936, (22, 24)),\n",
366 | " ('5G', 0.74944, (29, 31)),\n",
367 | " ('유플러스', 0.37639, (0, 4))]"
368 | ]
369 | },
370 | "execution_count": 13,
371 | "metadata": {},
372 | "output_type": "execute_result"
373 | }
374 | ],
375 | "source": [
376 | "input_text = \"유플러스는 통신3사(SKT, LGU+, KT) 중에 5G 요금제를 최초로 선보였습니다.\"\n",
377 | "#input_text = \"푸른 하늘에 F-15가 북한을 향해 날아갑니다.\"\n",
378 | "#input_text = \"오늘 출시된 V60 ThinkQ는 LG전자의 핵심 제품입니다.\"\n",
379 | "#input_text = \"BERT 발표 후 NLP 기술동향에 큰 변화가 생겼습니다.\"\n",
380 | "#input_text = \"그의 말년에 특히 헤파이스티온의 죽음 이후 알렉산더는 과대망상과 편집증 증세를 보이기 시작했다.\"\n",
381 | "#input_text = \"영국 매체 스카이 스포츠는 25일(한국시간) 맨유 미드필더 포그바가 여름 이적시장 실패 후, 1월에 레알 마드리드로 이적할 수 있다고 전했다.\"\n",
382 | "#input_text = \"옛날부터 흩어진 유대인들이 살았으며, 에베소 공의회와 칼케돈 공의회에서 이단으로 몰린 경교같은 기독교 소수 교파의 교회들이 로마교회의 탄압을 피해 거주하였다.\"\n",
383 | "#input_text = \"자동차가 차선 밖으로 나가거나 언덕 밑으로 떨어지는 사고를 막기 위하여 도로변이나 보도·차도의 경계, 고속도로 중앙에 설치하는 방호책(防護柵)의 일종\"\n",
384 | "#input_text = \"산행을 하는 사람들은 음식이 가벼울수록 편하기 때문에 냉동 건조 식품을 선호한다.\"\n",
385 | "\n",
386 | "result = kea.parse(input_text, max_keyword=5)\n",
387 | "result"
388 | ]
389 | },
390 | {
391 | "cell_type": "code",
392 | "execution_count": 14,
393 | "metadata": {},
394 | "outputs": [],
395 | "source": [
396 | "news_list = [\n",
397 | " \"현대·기아차가 올해 7월까지 전 세계 자동차 브랜드 중 네 번째로 전기차를 많이 판매한 것으로 나타났다.\",\n",
398 | " \"4일 자동차연구원이 SNE리서치 통계를 분석한 내용에 따르면 현대·기아차는 올해 7월 말 기준으로 6만707대의 전기차를 판매해 세계 4위를 차지했다.\",\n",
399 | " \"세계 최대 전기차 기업 테슬라가 19만1971대로 1위를 차지했으며, 르노-닛산과 폴크스바겐이 각기 8만6189대로 7만5228대로 뒤를 이었다.\",\n",
400 | " \"5위는 중국 BYD(4만2340대)였다.\",\n",
401 | " \"현대·기아차는 작년 같은 기간(4만8570대)에 비해 판매량이 25% 늘어난 점이 눈에 띈다.\",\n",
402 | " \"모델3를 앞세운 테슬라는 판매량이 4% 증가하는 데 그쳤고, 주력 모델인 리프의 판매가 급감한 르노닛산은 5% 감소했다.\",\n",
403 | " \"폴크스바겐은 지난해에 비해 110% 늘어나며 현대·기아차를 앞질렀다. BYD는 지난해(11만3409대)에 비해 63% 감소하며 순위가 하락했다.\",\n",
404 | "]"
405 | ]
406 | },
407 | {
408 | "cell_type": "code",
409 | "execution_count": 15,
410 | "metadata": {},
411 | "outputs": [
412 | {
413 | "name": "stdout",
414 | "output_type": "stream",
415 | "text": [
416 | "현대·기아차가 올해 7월까지 전 세계 자동차 브랜드 중 네 번째로 전기차를 많이 판매한 것으로 나타났다.\n",
417 | "> ('7월까지', 0.15444, (11, 15))\n",
418 | "> ('전기차', 0.11016, (37, 40))\n",
419 | "> ('세계', 0.04146, (18, 20))\n",
420 | "> ('판매', 0.0385, (45, 47))\n",
421 | "> ('현대', 0.03444, (0, 2))\n",
422 | "> ('기아차', 0.03396, (3, 6))\n",
423 | "> ('자동차', 0.02318, (21, 24))\n",
424 | "> ('브랜드', 0.01534, (25, 28))\n",
425 | "> ('올해', 0.00318, (8, 10))\n",
426 | "4일 자동차연구원이 SNE리서치 통계를 분석한 내용에 따르면 현대·기아차는 올해 7월 말 기준으로 6만707대의 전기차를 판매해 세계 4위를 차지했다.\n",
427 | "> ('6만707대의', 3.19011, (55, 62))\n",
428 | "> ('4위', 0.50873, (75, 77))\n",
429 | "> ('리서치', 0.29282, (14, 17))\n",
430 | "> ('4일', 0.18276, (0, 2))\n",
431 | "> ('세계', 0.1106, (72, 74))\n",
432 | "> ('자동차', 0.08944, (3, 6))\n",
433 | "> ('7월', 0.08403, (45, 47))\n",
434 | "> ('통계', 0.08104, (18, 20))\n",
435 | "> ('판매', 0.07005, (68, 70))\n",
436 | "> ('분석', 0.0547, (22, 24))\n",
437 | "세계 최대 전기차 기업 테슬라가 19만1971대로 1위를 차지했으며, 르노-닛산과 폴크스바겐이 각기 8만6189대로 7만5228대로 뒤를 이었다.\n",
438 | "> ('8만6189대', 3.09938, (56, 63))\n",
439 | "> ('19만1971대', 2.89579, (18, 26))\n",
440 | "> ('7만5228대', 2.86514, (65, 72))\n",
441 | "> ('르노-닛산', 2.5906, (39, 44))\n",
442 | "> ('폴크스바겐', 2.03367, (46, 51))\n",
443 | "> ('테슬라', 0.8087, (13, 16))\n",
444 | "> ('르노', 0.78047, (39, 41))\n",
445 | "> ('폴크스', 0.66238, (46, 49))\n",
446 | "> ('바겐', 0.5823, (49, 51))\n",
447 | "> ('닛산', 0.50528, (42, 44))\n",
448 | "5위는 중국 BYD(4만2340대)였다.\n",
449 | "> ('만2340대', 2.24309, (12, 18))\n",
450 | "> ('중국 BYD', 1.16622, (4, 10))\n",
451 | "> ('5위', 0.48653, (0, 2))\n",
452 | "> ('중국', 0.28101, (4, 6))\n",
453 | "현대·기아차는 작년 같은 기간(4만8570대)에 비해 판매량이 25% 늘어난 점이 눈에 띈다.\n",
454 | "> ('만8570대', 2.13131, (18, 24))\n",
455 | "> ('25%', 0.42047, (35, 38))\n",
456 | "> ('현대', 0.07883, (0, 2))\n",
457 | "> ('작년', 0.0291, (8, 10))\n",
458 | "> ('기아차', 0.01523, (3, 6))\n",
459 | "> ('기간', 0.00617, (14, 16))\n",
460 | "모델3를 앞세운 테슬라는 판매량이 4% 증가하는 데 그쳤고, 주력 모델인 리프의 판매가 급감한 르노닛산은 5% 감소했다.\n",
461 | "> ('르노닛산', 1.66383, (53, 57))\n",
462 | "> ('5%', 0.64153, (59, 61))\n",
463 | "> ('르노', 0.64039, (53, 55))\n",
464 | "> ('테슬라', 0.58507, (9, 12))\n",
465 | "> ('4%', 0.46547, (19, 21))\n",
466 | "> ('닛산', 0.40772, (55, 57))\n",
467 | "> ('모델3', 0.36206, (0, 3))\n",
468 | "> ('리프', 0.1714, (41, 43))\n",
469 | "> ('모델', 0.04001, (37, 39))\n",
470 | "> ('증가', 0.03477, (22, 24))\n",
471 | "폴크스바겐은 지난해에 비해 110% 늘어나며 현대·기아차를 앞질렀다. BYD는 지난해(11만3409대)에 비해 63% 감소하며 순위가 하락했다.\n",
472 | "> ('11만3409대', 3.07777, (48, 56))\n",
473 | "> ('폴크스바겐', 2.50526, (0, 5))\n",
474 | "> ('폴크스', 0.74794, (0, 3))\n",
475 | "> ('바겐', 0.71244, (3, 5))\n",
476 | "> ('63%', 0.61561, (62, 65))\n",
477 | "> ('BYD', 0.54137, (39, 42))\n",
478 | "> ('110%', 0.50547, (15, 19))\n",
479 | "> ('감소', 0.0825, (66, 68))\n",
480 | "> ('순위', 0.06079, (71, 73))\n",
481 | "> ('지난해', 0.05403, (44, 47))\n"
482 | ]
483 | }
484 | ],
485 | "source": [
486 | "for news in news_list:\n",
487 | " keyword_list = kea.parse(news, max_keyword=10)\n",
488 | " print(news)\n",
489 | " for keyword in keyword_list:\n",
490 | " print(\">\", keyword)"
491 | ]
492 | },
493 | {
494 | "cell_type": "code",
495 | "execution_count": null,
496 | "metadata": {},
497 | "outputs": [],
498 | "source": []
499 | }
500 | ],
501 | "metadata": {
502 | "kernelspec": {
503 | "display_name": "Python 3 (ipykernel)",
504 | "language": "python",
505 | "name": "python3"
506 | },
507 | "language_info": {
508 | "codemirror_mode": {
509 | "name": "ipython",
510 | "version": 3
511 | },
512 | "file_extension": ".py",
513 | "mimetype": "text/x-python",
514 | "name": "python",
515 | "nbconvert_exporter": "python",
516 | "pygments_lexer": "ipython3",
517 | "version": "3.8.12"
518 | }
519 | },
520 | "nbformat": 4,
521 | "nbformat_minor": 2
522 | }
523 |
--------------------------------------------------------------------------------
/practice-note/week_10/data/article_temp.txt:
--------------------------------------------------------------------------------
1 | 10년 역사 10대 뉴스로 정리(지디넷코리아=임유경 기자)2008년 9월 리먼 브라더스 파산으로 촉발된 금융위기가 전 세계를 뒤흔들었다. 세계 금융시스템이 붕괴 위기에 놓여 있던 이때, 인터넷 세상 한 켠에선 새로운 금융 시스템이 조용하게 작동을 시작했다. 10년 전 1월 3일 오후 6시 15분. 은행이나 정부의 개입이 필요 없는 개인 간 전자화폐 시스템 비트코인 네트워크의 첫 번째 블록이 탄생한 순간이다.이날 사토시 나카모토라는 가명의 인물은 앞서 공개한 논문을 통해 제시한 아이디어를 약 한달만에 구현하는 데 성공했다. 기념비적인 첫 번째 블록에는 "재무장관, 은행에 두 번째 구제금융 제공 임박”이라는 문구를 새겼다. 이날 영국 일간지 <타임스>의 1면 헤드라인으로, 비트코인 네트워크가 기존 금융 시스템에 대안적인 성격을 띤다는 정체성을 분명하게 드러냈다.이후 비트코인은 굴곡진 10년의 세월을 보냈다. 2011년 초까지 1달러의 가치도 인정 받지 못했다. 비트코인에 대한 관심도 암호학 커뮤니티 내 개발자들이 재미로 채굴(트랜잭션을 블록단위로 묶어 처리하는 작업)하고 비트코인을 받는 수준에 그쳤다. 이후 관심을 늘었지만 투기기 불법적인 요소 결합돼 버블이니 검은 돈이니 하는 오명을 얻기도 했다.2009년 1월 3일 비트코인 첫 번째 블록인 제네시스 블록이 생성됐다.여전비 비트코인은 실험대 위에 있다. 가격이 출렁일 때마다 "비트코인은 죽었다"는 제목의 기사가 쏟아져 나온다. 지난해 언론에서 내린 사망선고는 거의 100번에 이른다. (☞관련링크)분명한 것은 비트코인의 잠재력을 믿는 사람들이 늘어나고 있다는 점이다. 이제 전 세계 모든 주요 기업들이 비트코인 기반 기술인 블록체인의 혁신성에 주목하고 기존 비즈니스에 적용하기 위해 연구에 나섰다.비트코인 맥시멀리스트로 알려진 지미 송은 최근 자신의 블로그에 비트코인이 가진 특성 중 탈중앙성(정부나 은행의 개입이 없는 상태)에 주목해야 한다고 강조하며 "기업가들은 비트코인 내에서 자신의 돈과 노력을 가지고 어떤 혁신을 일으킬지 결정할 수 있다"고 말했다.아래는 제네시스 블록 생성부터 최고정점을 지나 크립토윈터를 맞은 지금까지 영욕의 발차취를 정리해봤다.▲ 2008년 10월 31일 비트코인 논문 공개사토시 나카모토라는 가명의 인물은 암호학 커뮤니티 메일링 리스트에 있는 모든 사람들에게 비트코인 P2P 전자화폐 시스템이라는 9쪽의 논문을 전송했다. 이 논문은 "제 3의 중개자 없이 완전한 P2P 방식의 전자 화폐"를 가능하게 하는 방법을 담았다. 이후 제2의 인터넷으로 불리는 블록체인의 시작이 됐다.▲ 2009년 1월 3일 비트코인 제네시스 블록 생성10년 전 2009년 1월 3일. 비트코인 블록체인에서 제네시스 블록(☞관련링크)이라 불리는 최초의 블록 #0이 채굴됐다. 최초 블록 생성자는 사토시 나카모토로 추정되며, 채굴 보상으로는 50비트코인을 받았다.이후 6일 뒤 오픈소스 비트코인 클라이언트가 만들어졌다. 클라이언트를 설치한 다른 컴퓨터가 네트워크에 참여할 수 있게 된 것이다. 나카모토는 다시 메일을 보냈고, 작업증명 기반에 화폐 설계작업 경험이 있는프로그래머 할 피니가 응답했다. 나카모토가 할 피니에게 10 비트코인을 전송해 최초의 비트코인 거래가 성사됐다. 할 피니는 이후 컴퓨터가 너무 뜨거워진다는 이유로 비트코인 채굴을 중단했다고 한다.▲ 2010년 5월 22일 비트코인 첫 현물거래 비트코인 피자데이플로리다 잭슨빌에 살던 프로그래머 라스즐로 하니예츠는 1만 비트코인으로 25달러짜리 파파존스 피자 두판을 시켜먹는다. 물로 파파존스에 비트코인을 낸 것은 아니고, 비트코인을 받고 피자를 보내줄 사람을 찾았다.이 거래는 비트코인으로 현물을 구매한 최초의 거래로 기록됐다. 블록체인 업계에선 지금 시세로 430억원 짜리 피자를 사먹은 이날을 피자 데이라고 부르며 매년 기념하고 있다.▲ 2010년 8월 15일 중대 취약점 첫 발견비트코인 블록체인에 중대한 보안 취약점이 최초로 발견됐다. 이 취약점을 이용해 두 개 지갑주소가 각각 922억개 비트코인을 받는 가치 오버 플로우 사건이 발생한다. 이 사건을 해결하기 위해 비트코인 개발팀은 해당 트랜잭션을 지우고 비트 코인 프로토콜을 업데이트했다.▲ 2011년 4월 비트코인 가격 폭등...사토시 나카모토 활동 중단그 전까지 1달러 수준이던 비트코인이 십달러를 돌파하더니 수십 달러로 폭등했다. 라이트코인 등 알트코인이 등장하면서 비트코인이 재평가 받기 시작한 시점이다.비트코인 가격이 오르고 관심이 커지자 사토시 나카모토는 활동을 중단하며 종적을 감췄다.▲ 2013년 4월 한국 최초 거래소 설립한국 최초 거래소인 한국비트코인거래소(코빗)가 설립됐다. 이후 2014년 빗썸과 코인원이 차례로 생겼다.▲2013년 10월 실크로드 사건비트코인이 검은 거래에 쓰인다는 오명을 얻게 된 시기다. 미연방수사국이 마약, 무기 불법 거래 사이트 실크로드 운영자를 검거하면서 비트코인 2만6000개를 압수했다. 이 사건으로 비트코인이 불법적인 거래에 쓰는 검은 돈이라는 인식이 퍼졌다.▲2014년 3월9일 마운트곡스 사태당시 세계 최대 비트코인 거래소 마운트곡스가 74만4000개의 비트코인을 해킹으로 분실하고 파산했다. 당시 금액으로 4800억원 규모다. 이 사건으로 블록체인은 보안성이 높지만, 암호화폐 거래소는 해킹에 취약할 수 있다는 사실이 알려지게 됐다.▲2017년 6월 6일 상승장의 시작1 비트코인 처음으로 금 가격을 뛰어 넘었다. 당시 일본, 러시아, 노르웨이 등에서 암호화폐를 제도권 안에 포함시키는 내용의 입법화를 추진한 것이 가격 상승을 이끌었다는 평가다.▲2017년 12월과 2018년 12월 롤러코스터 시기비트코인 가격이 롤러코스터를 탄 시기다. 2017년 하반기 비트코인이 연신 사상 최고가를 경신하더니, 12월 중순엔 2만달러 넘어섰다. 고공행진하던 가격은 박상기 법무부장관의 거래소 폐쇄 발언에 직격탄을 맞고 하락세로 돌아섰다. 이후 글로벌 규제 강화 추세로 6월 반토막 수준이 나더니, 11월엔 비트코인캐시 하드포크 사건을 시발점으로 폭락장이 이어졌다. 현재는 3천~4천달러 수준을 유지하고 있다. 열풍이 시작되기 직전인 2017년 9월달 수준으로 돌아간 것이다.2018년 초와 비교하면, 현재 비트코인 가치는 80% 가까이 줄어 들었다. 대장주인 비트코인을 따라 모든 알트 코인들도 폭락해, 블록체인·암호화폐 기업들이 힘들 시기를 보내고 있다. 업계가 혹한기를 맞았다는 의미로 크립토 윈터라는 말도 나온다.임유경 기자(lyk@zdnet.co.kr)
2 |
--------------------------------------------------------------------------------
129 |
130 |
131 |
132 |
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_lecture-guide_220108.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_lecture-guide_220108.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week01_220108.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week01_220108.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week03_220122.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week03_220122.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week05_220212.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week05_220212.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week06_220219.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week06_220219.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week07_220226.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week07_220226.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week08_220305.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week08_220305.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week09_220312.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week09_220312.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week10_220319.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week10_220319.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week11_220326.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week11_220326.pdf
--------------------------------------------------------------------------------
/lecture-note/text-mining-for-practice_week12_220401.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fingeredman/text-mining-for-practice/e79d812b7b2a15987acf762fdd4ec94b38194cf6/lecture-note/text-mining-for-practice_week12_220401.pdf
--------------------------------------------------------------------------------
/practice-note/week_01/W01-1_text-mining-for-practice_colaboratory.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "id": "4c9gPfDlDxXW"
7 | },
8 | "source": [
9 | "# TEXT MINING for PRACTICE\n",
10 | "- 본 자료는 텍스트 마이닝을 활용한 연구 및 강의를 위한 목적으로 제작되었습니다.\n",
11 | "- 본 자료를 강의 목적으로 활용하고자 하시는 경우 꼭 아래 메일주소로 연락주세요.\n",
12 | "- 본 자료에 대한 허가되지 않은 배포를 금지합니다.\n",
13 | "- 강의, 저작권, 출판, 특허, 공동저자에 관련해서는 문의 바랍니다.\n",
14 | "- **Contact : ADMIN(admin@teanaps.com)**\n",
15 | "\n",
16 | "---"
17 | ]
18 | },
19 | {
20 | "cell_type": "markdown",
21 | "metadata": {
22 | "id": "liJEK0lZDxXZ"
23 | },
24 | "source": [
25 | "## WEEK 01-1. 실습환경: Python 3.7 & Jupyter Notebook & Google Colaboratory\n",
26 | "- Google Colaboratory를 활용한 Python 프로그래밍 환경에 대해 다룹니다.\n",
27 | "\n",
28 | "---"
29 | ]
30 | },
31 | {
32 | "cell_type": "markdown",
33 | "metadata": {
34 | "id": "rhdWH1xGFjRL"
35 | },
36 | "source": [
37 | "### 1. 셀을 추가/삭제/이동할 수 있습니다.\n",
38 | "\n",
39 | "---"
40 | ]
41 | },
42 | {
43 | "cell_type": "code",
44 | "execution_count": null,
45 | "metadata": {
46 | "id": "X1gtMJsRF1cP"
47 | },
48 | "outputs": [],
49 | "source": []
50 | },
51 | {
52 | "cell_type": "code",
53 | "execution_count": null,
54 | "metadata": {
55 | "id": "h1xG1EPZF0ox"
56 | },
57 | "outputs": [],
58 | "source": []
59 | },
60 | {
61 | "cell_type": "markdown",
62 | "metadata": {
63 | "id": "9jl6agpvF0dj"
64 | },
65 | "source": []
66 | },
67 | {
68 | "cell_type": "markdown",
69 | "metadata": {
70 | "id": "edfWAbDjF3FH"
71 | },
72 | "source": []
73 | },
74 | {
75 | "cell_type": "markdown",
76 | "metadata": {
77 | "id": "QRZPpNTxEX8T"
78 | },
79 | "source": [
80 | "### 2. 셀에 Markdowon 문법을 활용하여 문서를 작성합니다.\n",
81 | "\n",
82 | "---"
83 | ]
84 | },
85 | {
86 | "cell_type": "code",
87 | "execution_count": 1,
88 | "metadata": {
89 | "executionInfo": {
90 | "elapsed": 6,
91 | "status": "ok",
92 | "timestamp": 1629891330294,
93 | "user": {
94 | "displayName": "Byeongjin Jeon",
95 | "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GgnMwWLhBRx6YKsTCajAvaS-5c-TiJzTUNG1k7Sgw=s64",
96 | "userId": "01151709893250942659"
97 | },
98 | "user_tz": -540
99 | },
100 | "id": "JcQ4K3fqF7D3"
101 | },
102 | "outputs": [],
103 | "source": [
104 | "# 간단한 메모는 주석으로 입력할 수 있습니다."
105 | ]
106 | },
107 | {
108 | "cell_type": "markdown",
109 | "metadata": {
110 | "id": "t8nlQaP6Er9Z"
111 | },
112 | "source": [
113 | "# 제목을 작성합니다.\n",
114 | "## 샵(#)이 여러개일수록 제목이 작게 표현됩니다.\n",
115 | "### 제목2\n",
116 | "#### 제목3\n",
117 | "\n",
118 | "1. 순서가 있는 항목을 작성합니다.\n",
119 | "1. 하나\n",
120 | "1. 둘\n",
121 | "1. 셋\n",
122 | "\n",
123 | "- 순서가 없는 항목을 작성합니다.\n",
124 | "- 첫번째\n",
125 | "- 두번재\n",
126 | "- 세번째\n",
127 | "\n",
128 | "> 블럭 내에 내용을 작성합니다."
129 | ]
130 | },
131 | {
132 | "cell_type": "markdown",
133 | "metadata": {
134 | "id": "8auu2eHRD8dU"
135 | },
136 | "source": [
137 | "### 3. 셀에 Python 코드를 입력하고 실행합니다.\n",
138 | "\n",
139 | "---"
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 2,
145 | "metadata": {
146 | "id": "sWZkKm9TDxXa",
147 | "outputId": "a2e18398-6adb-4eab-a9f5-b6d9bc4066cc"
148 | },
149 | "outputs": [
150 | {
151 | "name": "stdout",
152 | "output_type": "stream",
153 | "text": [
154 | "hello world!\n"
155 | ]
156 | }
157 | ],
158 | "source": [
159 | "print(\"hello world!\")"
160 | ]
161 | },
162 | {
163 | "cell_type": "markdown",
164 | "metadata": {
165 | "id": "0ot9OneHETTC"
166 | },
167 | "source": [
168 | "### 4. 자신의 Google Drive에 새로운 파일을 생성하거나 저장된 파일을 불러옵니다.\n",
169 | "\n",
170 | "---"
171 | ]
172 | },
173 | {
174 | "cell_type": "code",
175 | "execution_count": null,
176 | "metadata": {
177 | "id": "i3WQfMTBGbJX"
178 | },
179 | "outputs": [],
180 | "source": [
181 | "from google.colab import drive\n",
182 | "drive.mount('/content/drive')"
183 | ]
184 | },
185 | {
186 | "cell_type": "code",
187 | "execution_count": 3,
188 | "metadata": {
189 | "id": "KlDltG5wGpxN"
190 | },
191 | "outputs": [],
192 | "source": [
193 | "# 새로운 파일 생성\n",
194 | "f = open(\"sample_txt.txt\", \"w\", encoding=\"utf-8\")\n",
195 | "\n",
196 | "f.write(\"텍스트 마이닝을 위한 Python 프로그래밍\\n\")\n",
197 | "f.write(\"재미있는 텍스트 마이닝\\n\")\n",
198 | "f.write(\"텍스트 마이닝을 위한 Python 프로그래밍\\n\")\n",
199 | "\n",
200 | "f.close()"
201 | ]
202 | },
203 | {
204 | "cell_type": "code",
205 | "execution_count": 4,
206 | "metadata": {
207 | "id": "oKONhiPoGpm_"
208 | },
209 | "outputs": [
210 | {
211 | "name": "stdout",
212 | "output_type": "stream",
213 | "text": [
214 | "텍스트 마이닝을 위한 Python 프로그래밍\n",
215 | "\n",
216 | "재미있는 텍스트 마이닝\n",
217 | "\n",
218 | "텍스트 마이닝을 위한 Python 프로그래밍\n",
219 | "\n"
220 | ]
221 | }
222 | ],
223 | "source": [
224 | "# 저장된 파일 불러오기\n",
225 | "f = open(\"sample_txt.txt\", encoding=\"utf-8\")\n",
226 | "\n",
227 | "for line in f:\n",
228 | " print(line)\n",
229 | "\n",
230 | "f.close()"
231 | ]
232 | },
233 | {
234 | "cell_type": "code",
235 | "execution_count": null,
236 | "metadata": {},
237 | "outputs": [],
238 | "source": []
239 | }
240 | ],
241 | "metadata": {
242 | "colab": {
243 | "collapsed_sections": [],
244 | "name": "W01-1_advanced-text-mining_colaboratory.ipynb",
245 | "provenance": []
246 | },
247 | "kernelspec": {
248 | "display_name": "Python 3",
249 | "language": "python",
250 | "name": "python3"
251 | },
252 | "language_info": {
253 | "codemirror_mode": {
254 | "name": "ipython",
255 | "version": 3
256 | },
257 | "file_extension": ".py",
258 | "mimetype": "text/x-python",
259 | "name": "python",
260 | "nbconvert_exporter": "python",
261 | "pygments_lexer": "ipython3",
262 | "version": "3.8.3"
263 | }
264 | },
265 | "nbformat": 4,
266 | "nbformat_minor": 1
267 | }
268 |
--------------------------------------------------------------------------------
/practice-note/week_02/W02-1_text-mining-for-practice_python-basic.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# TEXT MINING for PRACTICE\n",
8 | "- 본 자료는 텍스트 마이닝을 활용한 연구 및 강의를 위한 목적으로 제작되었습니다.\n",
9 | "- 본 자료를 강의 목적으로 활용하고자 하시는 경우 꼭 아래 메일주소로 연락주세요.\n",
10 | "- 본 자료에 대한 허가되지 않은 배포를 금지합니다.\n",
11 | "- 강의, 저작권, 출판, 특허, 공동저자에 관련해서는 문의 바랍니다.\n",
12 | "- **Contact : ADMIN(admin@teanaps.com)**\n",
13 | "\n",
14 | "---"
15 | ]
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {},
20 | "source": [
21 | "## WEEK 02-1. Python 기초문법 알아보기\n",
22 | "- 텍스트 마이닝을 위한 Python 기초문법에 대해 다룹니다.\n",
23 | "\n",
24 | "---"
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "### 1. PRINT 문: 문자 또는 숫자를 화면에 출력합니다.\n",
32 | "\n",
33 | "---"
34 | ]
35 | },
36 | {
37 | "cell_type": "code",
38 | "execution_count": 1,
39 | "metadata": {},
40 | "outputs": [
41 | {
42 | "name": "stdout",
43 | "output_type": "stream",
44 | "text": [
45 | "12345\n"
46 | ]
47 | }
48 | ],
49 | "source": [
50 | "# 1) 숫자를 출력합니다.\n",
51 | "print(12345)"
52 | ]
53 | },
54 | {
55 | "cell_type": "code",
56 | "execution_count": 2,
57 | "metadata": {},
58 | "outputs": [
59 | {
60 | "name": "stdout",
61 | "output_type": "stream",
62 | "text": [
63 | "큰따옴표 안에 내용을 입력합니다.\n"
64 | ]
65 | }
66 | ],
67 | "source": [
68 | "# 2) 큰따옴표 안에 문자열을 출력합니다.\n",
69 | "print(\"큰따옴표 안에 내용을 입력합니다.\")"
70 | ]
71 | },
72 | {
73 | "cell_type": "code",
74 | "execution_count": 3,
75 | "metadata": {},
76 | "outputs": [
77 | {
78 | "name": "stdout",
79 | "output_type": "stream",
80 | "text": [
81 | "작은따옴표 안에 내용을 입력합니다.\n"
82 | ]
83 | }
84 | ],
85 | "source": [
86 | "# 3) 작은따옴표 안에 문자열을 출력합니다.\n",
87 | "print('작은따옴표 안에 내용을 입력합니다.')"
88 | ]
89 | },
90 | {
91 | "cell_type": "code",
92 | "execution_count": 4,
93 | "metadata": {},
94 | "outputs": [
95 | {
96 | "name": "stdout",
97 | "output_type": "stream",
98 | "text": [
99 | "큰따옴표 안에 '작은따옴표'를 입력해 출력합니다.\n"
100 | ]
101 | }
102 | ],
103 | "source": [
104 | "# 4) \"작은따옴표\"를 \"큰따옴표\" 안에 입력해 출력합니다.\n",
105 | "print(\"큰따옴표 안에 '작은따옴표'를 입력해 출력합니다.\")"
106 | ]
107 | },
108 | {
109 | "cell_type": "code",
110 | "execution_count": 5,
111 | "metadata": {},
112 | "outputs": [
113 | {
114 | "name": "stdout",
115 | "output_type": "stream",
116 | "text": [
117 | "\"큰따옴표\"를 출력합니다.\n"
118 | ]
119 | }
120 | ],
121 | "source": [
122 | "# 5) 백슬러시를 큰따옴표 앞에 붙여 \"큰따옴표\"를 출력합니다.\n",
123 | "print(\"\\\"큰따옴표\\\"를 출력합니다.\")"
124 | ]
125 | },
126 | {
127 | "cell_type": "code",
128 | "execution_count": 6,
129 | "metadata": {},
130 | "outputs": [
131 | {
132 | "name": "stdout",
133 | "output_type": "stream",
134 | "text": [
135 | "더하기(+) 연산자를 활용해문자열을 결합하여 출력합니다.\n"
136 | ]
137 | }
138 | ],
139 | "source": [
140 | "# 6-1) 문자열을 더하기(+) 연산자를 활용해 결합하여 출력합니다.\n",
141 | "print(\"더하기(+) 연산자를 활용해\" + \"문자열을 결합하여 출력합니다.\")"
142 | ]
143 | },
144 | {
145 | "cell_type": "code",
146 | "execution_count": 7,
147 | "metadata": {},
148 | "outputs": [
149 | {
150 | "name": "stdout",
151 | "output_type": "stream",
152 | "text": [
153 | "콤마(,)를 활용해 문자열을 결합하여 출력합니다.\n"
154 | ]
155 | }
156 | ],
157 | "source": [
158 | "# 6-2) 문자열을 콤마(,)를 활용해 결합하여 출력합니다.\n",
159 | "print(\"콤마(,)를 활용해\", \"문자열을 결합하여 출력합니다.\")"
160 | ]
161 | },
162 | {
163 | "cell_type": "code",
164 | "execution_count": 8,
165 | "metadata": {},
166 | "outputs": [
167 | {
168 | "name": "stdout",
169 | "output_type": "stream",
170 | "text": [
171 | "str(NUM) 함수를 활용하면 문자열과 숫자의 '문자+10'결합이 가능합니다.\n"
172 | ]
173 | }
174 | ],
175 | "source": [
176 | "# 7-1) 숫자를 문자와 결합하는 경우에는 반드시 str(NUM) 함수를 활용해 문자열로 변환 후 결합해야합니다.\n",
177 | "print(\"str(NUM) 함수를 활용하면 문자열과 숫자의 '문자+\" + str(10) + \"'결합이 가능합니다.\")"
178 | ]
179 | },
180 | {
181 | "cell_type": "code",
182 | "execution_count": 9,
183 | "metadata": {},
184 | "outputs": [
185 | {
186 | "name": "stdout",
187 | "output_type": "stream",
188 | "text": [
189 | "str(NUM) 함수를 활용하면 문자열과 숫자의 '문자+ 10 '결합이 가능합니다.\n"
190 | ]
191 | }
192 | ],
193 | "source": [
194 | "# 7-2) 숫자를 문자와 결합하는 경우에 콤마(,)를 사용하면 str(NUM) 함수를 사용하지 않아도 됩니다.\n",
195 | "print(\"str(NUM) 함수를 활용하면 문자열과 숫자의 '문자+\", 10, \"'결합이 가능합니다.\")"
196 | ]
197 | },
198 | {
199 | "cell_type": "code",
200 | "execution_count": 10,
201 | "metadata": {},
202 | "outputs": [
203 | {
204 | "name": "stdout",
205 | "output_type": "stream",
206 | "text": [
207 | "hello world!\n"
208 | ]
209 | }
210 | ],
211 | "source": [
212 | "# 샵(#) 뒤에 오는 문자열을 주석이라고 하며, 결과에 아무런 영향을 끼치지 않습니다.\n",
213 | "# print(12345)\n",
214 | "'''\n",
215 | "여러줄로 주석을 입력할 필요가 있을 때에는,\n",
216 | "작음따옴표 3개를 앞뒤에 사용합니다.\n",
217 | "print(\"hello world!\")\n",
218 | "'''\n",
219 | "print(\"hello world!\")"
220 | ]
221 | },
222 | {
223 | "cell_type": "markdown",
224 | "metadata": {},
225 | "source": [
226 | "### 2. PRINT 문: 문자열 안에 탭(tab) 또는 줄바꿈(linefeed)을 삽입합니다.\n",
227 | "\n",
228 | "---"
229 | ]
230 | },
231 | {
232 | "cell_type": "code",
233 | "execution_count": 11,
234 | "metadata": {},
235 | "outputs": [
236 | {
237 | "name": "stdout",
238 | "output_type": "stream",
239 | "text": [
240 | "문자열 맨 뒤에 줄바꿈이 있기 때문에,\n",
241 | "다음줄에 이어서 출렵됩니다.\n"
242 | ]
243 | }
244 | ],
245 | "source": [
246 | "# 1) print(\"문자열\") 함수는 맨 뒤에 줄바꿈(\\n)을 포함합니다.\n",
247 | "print(\"문자열 맨 뒤에 줄바꿈이 있기 때문에,\")\n",
248 | "print(\"다음줄에 이어서 출렵됩니다.\")"
249 | ]
250 | },
251 | {
252 | "cell_type": "code",
253 | "execution_count": 12,
254 | "metadata": {},
255 | "outputs": [
256 | {
257 | "name": "stdout",
258 | "output_type": "stream",
259 | "text": [
260 | "맨 뒤에 줄바꿈 대신 다른 문자열넣었기 때문에, [다른 문자열] 같은줄에 이어서 출력됩니다.\n"
261 | ]
262 | }
263 | ],
264 | "source": [
265 | "# 2) end 옵션을 사용하면 맨 뒤에 줄바꿈(\\n) 대신 다른 문자열로 대체할 수 있습니다.\n",
266 | "print(\"맨 뒤에 줄바꿈 대신 다른 문자열넣었기 때문에, \", end=\"[다른 문자열] \")\n",
267 | "print(\"같은줄에 이어서 출력됩니다.\")"
268 | ]
269 | },
270 | {
271 | "cell_type": "code",
272 | "execution_count": 13,
273 | "metadata": {},
274 | "outputs": [
275 | {
276 | "name": "stdout",
277 | "output_type": "stream",
278 | "text": [
279 | "맨 뒤에 줄바꿈을 직접 입력할 수도 있으며,\n",
280 | "결과는 같습니다.\n"
281 | ]
282 | }
283 | ],
284 | "source": [
285 | "# 3) end 옵션에 줄바꿈(\\n)을 입력하면 기본 print(\"문자열\") 함수와 같은 기능을 수행합니다.\n",
286 | "print(\"맨 뒤에 줄바꿈을 직접 입력할 수도 있으며,\", end=\"\\n\")\n",
287 | "print(\"결과는 같습니다.\")"
288 | ]
289 | },
290 | {
291 | "cell_type": "code",
292 | "execution_count": 14,
293 | "metadata": {},
294 | "outputs": [
295 | {
296 | "name": "stdout",
297 | "output_type": "stream",
298 | "text": [
299 | "맨 뒤에 줄바꿈 대신 탭(\\t)을 넣으면,\t탭 뒤에 이어서 출력됩니다.\n"
300 | ]
301 | }
302 | ],
303 | "source": [
304 | "# 4) 탭(\\t) 또한 맨 뒤 문자열로 가능합니다.\n",
305 | "print(\"맨 뒤에 줄바꿈 대신 탭(\\\\t)을 넣으면,\", end=\"\\t\")\n",
306 | "print(\"탭 뒤에 이어서 출력됩니다.\")"
307 | ]
308 | },
309 | {
310 | "cell_type": "code",
311 | "execution_count": 15,
312 | "metadata": {},
313 | "outputs": [
314 | {
315 | "name": "stdout",
316 | "output_type": "stream",
317 | "text": [
318 | "따옴표 안에서 \t아무곳에나\n",
319 | "입력 가능합니다.\n"
320 | ]
321 | }
322 | ],
323 | "source": [
324 | "# 5) 탭(\\t), 줄바꿈(\\n) 기호는 따옴표 안에서 어디에든 입력 가능합니다.\n",
325 | "print(\"따옴표 안에서 \\t아무곳에나\\n입력 가능합니다.\")"
326 | ]
327 | },
328 | {
329 | "cell_type": "code",
330 | "execution_count": 16,
331 | "metadata": {},
332 | "outputs": [
333 | {
334 | "name": "stdout",
335 | "output_type": "stream",
336 | "text": [
337 | "띄어쓰기를 넣지 않아도 공백을 포함합니다.\n"
338 | ]
339 | }
340 | ],
341 | "source": [
342 | "# 6) 따옴표 밖의 콤마(,)는 문자열 결합과 함께 띄어쓰기를 포함합니다.\n",
343 | "print(\"띄어쓰기를\", \"넣지\", \"않아도\", \"공백을\", \"포함합니다.\")"
344 | ]
345 | },
346 | {
347 | "cell_type": "markdown",
348 | "metadata": {},
349 | "source": [
350 | "### 3. PRINT 문: PRINT문 안에서 숫자끼리의 연산이 가능합니다.\n",
351 | "\n",
352 | "---"
353 | ]
354 | },
355 | {
356 | "cell_type": "code",
357 | "execution_count": 17,
358 | "metadata": {},
359 | "outputs": [
360 | {
361 | "name": "stdout",
362 | "output_type": "stream",
363 | "text": [
364 | "2\n"
365 | ]
366 | }
367 | ],
368 | "source": [
369 | "# 1) 더하기\n",
370 | "print(1 + 1)"
371 | ]
372 | },
373 | {
374 | "cell_type": "code",
375 | "execution_count": 18,
376 | "metadata": {},
377 | "outputs": [
378 | {
379 | "name": "stdout",
380 | "output_type": "stream",
381 | "text": [
382 | "7\n"
383 | ]
384 | }
385 | ],
386 | "source": [
387 | "# 2) 빼기\n",
388 | "print(9 - 2)"
389 | ]
390 | },
391 | {
392 | "cell_type": "code",
393 | "execution_count": 19,
394 | "metadata": {},
395 | "outputs": [
396 | {
397 | "name": "stdout",
398 | "output_type": "stream",
399 | "text": [
400 | "20\n"
401 | ]
402 | }
403 | ],
404 | "source": [
405 | "# 3) 곱하기\n",
406 | "print(5 * 4)"
407 | ]
408 | },
409 | {
410 | "cell_type": "code",
411 | "execution_count": 20,
412 | "metadata": {},
413 | "outputs": [
414 | {
415 | "name": "stdout",
416 | "output_type": "stream",
417 | "text": [
418 | "4.0\n"
419 | ]
420 | }
421 | ],
422 | "source": [
423 | "# 4) 나누기\n",
424 | "print(8 / 2)"
425 | ]
426 | },
427 | {
428 | "cell_type": "code",
429 | "execution_count": 21,
430 | "metadata": {},
431 | "outputs": [
432 | {
433 | "name": "stdout",
434 | "output_type": "stream",
435 | "text": [
436 | "1024\n"
437 | ]
438 | }
439 | ],
440 | "source": [
441 | "# 5) 지수승\n",
442 | "print(2 ** 10)"
443 | ]
444 | },
445 | {
446 | "cell_type": "code",
447 | "execution_count": 22,
448 | "metadata": {},
449 | "outputs": [
450 | {
451 | "name": "stdout",
452 | "output_type": "stream",
453 | "text": [
454 | "6\n"
455 | ]
456 | }
457 | ],
458 | "source": [
459 | "# 6) 몫\n",
460 | "print(25 // 4)"
461 | ]
462 | },
463 | {
464 | "cell_type": "code",
465 | "execution_count": 23,
466 | "metadata": {},
467 | "outputs": [
468 | {
469 | "name": "stdout",
470 | "output_type": "stream",
471 | "text": [
472 | "1\n"
473 | ]
474 | }
475 | ],
476 | "source": [
477 | "# 7) 나머지\n",
478 | "print(25 % 4)"
479 | ]
480 | },
481 | {
482 | "cell_type": "code",
483 | "execution_count": 24,
484 | "metadata": {},
485 | "outputs": [
486 | {
487 | "name": "stdout",
488 | "output_type": "stream",
489 | "text": [
490 | "True\n",
491 | "False\n"
492 | ]
493 | }
494 | ],
495 | "source": [
496 | "# 8) 등호\n",
497 | "print(2 == 2)\n",
498 | "print(2 != 2)"
499 | ]
500 | },
501 | {
502 | "cell_type": "code",
503 | "execution_count": 25,
504 | "metadata": {},
505 | "outputs": [
506 | {
507 | "name": "stdout",
508 | "output_type": "stream",
509 | "text": [
510 | "True\n",
511 | "False\n"
512 | ]
513 | }
514 | ],
515 | "source": [
516 | "# 9) 부등호\n",
517 | "print(3 > 2)\n",
518 | "print(3 < 2)"
519 | ]
520 | },
521 | {
522 | "cell_type": "code",
523 | "execution_count": 26,
524 | "metadata": {},
525 | "outputs": [
526 | {
527 | "name": "stdout",
528 | "output_type": "stream",
529 | "text": [
530 | "True\n",
531 | "False\n",
532 | "False\n",
533 | "False\n"
534 | ]
535 | }
536 | ],
537 | "source": [
538 | "# 10-1) 논리연산자(and)\n",
539 | "print(True and True)\n",
540 | "print(False and True)\n",
541 | "print(True and False)\n",
542 | "print(False and False)"
543 | ]
544 | },
545 | {
546 | "cell_type": "code",
547 | "execution_count": 27,
548 | "metadata": {},
549 | "outputs": [
550 | {
551 | "name": "stdout",
552 | "output_type": "stream",
553 | "text": [
554 | "True\n",
555 | "True\n",
556 | "True\n",
557 | "False\n"
558 | ]
559 | }
560 | ],
561 | "source": [
562 | "# 10-1) 논리연산자(or)\n",
563 | "print(True or True)\n",
564 | "print(False or True)\n",
565 | "print(True or False)\n",
566 | "print(False or False)"
567 | ]
568 | },
569 | {
570 | "cell_type": "code",
571 | "execution_count": 28,
572 | "metadata": {},
573 | "outputs": [
574 | {
575 | "name": "stdout",
576 | "output_type": "stream",
577 | "text": [
578 | "False\n",
579 | "True\n"
580 | ]
581 | }
582 | ],
583 | "source": [
584 | "# 11-1) 다중 논리연산자\n",
585 | "print(2 > 1 and 3 < 3)\n",
586 | "print(2 > 1 or 3 <= 3)"
587 | ]
588 | },
589 | {
590 | "cell_type": "code",
591 | "execution_count": 29,
592 | "metadata": {},
593 | "outputs": [
594 | {
595 | "name": "stdout",
596 | "output_type": "stream",
597 | "text": [
598 | "False\n",
599 | "True\n"
600 | ]
601 | }
602 | ],
603 | "source": [
604 | "# 11-2) 다중 논리연산자(비트연산)\n",
605 | "print((2 > 1) & (3 < 3))\n",
606 | "print((2 > 1) | (3 <= 3))"
607 | ]
608 | },
609 | {
610 | "cell_type": "markdown",
611 | "metadata": {},
612 | "source": [
613 | "### 3. PRINT 문: 문자열과 숫자 대신에 변수(variable)를 활용합니다.\n",
614 | "\n",
615 | "---"
616 | ]
617 | },
618 | {
619 | "cell_type": "code",
620 | "execution_count": 30,
621 | "metadata": {},
622 | "outputs": [],
623 | "source": [
624 | "# 1-1) 변수에 값 또는 자료구조를 저장합니다.\n",
625 | "a = 10\n",
626 | "b = 20\n",
627 | "new_list = [1, 2, 3]\n",
628 | "new_dict = {\"Seoul\": 1, \"Busan\": 2, \"Daegu\": 3}\n",
629 | "new_text = \" 앞에 공백과 뒤에 줄바꿈이 달린 문자열 입니다. \\n\""
630 | ]
631 | },
632 | {
633 | "cell_type": "code",
634 | "execution_count": 31,
635 | "metadata": {},
636 | "outputs": [
637 | {
638 | "name": "stdout",
639 | "output_type": "stream",
640 | "text": [
641 | "a, b : 10 20\n",
642 | "new_list : [1, 2, 3]\n",
643 | "new_dict : {'Seoul': 1, 'Busan': 2, 'Daegu': 3}\n",
644 | "new_text : 앞에 공백과 뒤에 줄바꿈이 달린 문자열 입니다. \n",
645 | "\n"
646 | ]
647 | }
648 | ],
649 | "source": [
650 | "# 1-2) 값 또는 자료구조가 저장된 변수를 출력합니다.\n",
651 | "print(\"a, b :\", a, b)\n",
652 | "print(\"new_list :\", new_list)\n",
653 | "print(\"new_dict :\", new_dict)\n",
654 | "print(\"new_text :\", new_text)"
655 | ]
656 | },
657 | {
658 | "cell_type": "code",
659 | "execution_count": 32,
660 | "metadata": {},
661 | "outputs": [
662 | {
663 | "name": "stdout",
664 | "output_type": "stream",
665 | "text": [
666 | "Type of a, b :
\n",
176 | "
\n",
188 | "\n",
243 | "
\n",
255 | "