[ 자연어 처리 ] 데이터 전처리
2023. 9. 12. 00:48ㆍ자연어 처리
728x90
1. 코퍼스(Corpus)
- 사전적인 의미는 "말뭉치", "대량의 텍스트 데이터"를 말함
- 자연어 처리 연구나 애플리케이션 활용을 염두에 두고 수집된 텍스트 데이터셋을 의미
2. 토큰화(Tokenization)
- 전처리 과정에는 토큰화, 정제, 정규화 작업등이 있음
- 토큰화는 원시 데이터를 가져와 유용한 데이터 문자열로 변환하는 간단한 프로세스
- 사이버 보안, NFT 생성에 사용되는 것으로 유명, 자연어 프로세스의 중요한 부분을 차지함
- 토큰의 단위는 자연어 내에서 의미를 가지는 최소단위로 정의
- 단락과 문장을 보다 쉽게 의미를 할당할 수 있는 더 작은 단위로 분할하는데 사용
토큰화 작업은 주어진 코퍼스 내 자연어 문장들을 토큰이라 불리는 최소 단위로 나누는 작업
2-1. 토큰화 과정의 필요성
- 언어 모델의 자연어 이해 능력 향상
- 토큰화 방법은 아주 다양하다.
- "역삼동에 어떤 맛집이 있나요?" -> 문장 자체로 이해하려면 너무 많은 문장이 필요
- "역삼동에" "어떤" "맛집이" "있나요?" -> 조사가 붙음으로써 다양하게 표현될 수 있는데, 조사에 의해 뒤에 나오는 문장이 너무 다양해짐(성능이 안좋음)
- "역삼동" "에" "어떤" "맛집" "이" "있나" "요?"
- 다양한 자연어를 효율적으로 표현 가능
- 중복을 제거한 대규모 자연어 코퍼스 내 토큰의 집합(단어사전) 사용
- 적절한 정보량을 내포하면서 전체 단어 사전의 개수가 많아지지 않도록 토큰의 단위를 잘 정의해야 함
- 상황에 따라 다르지만, 일반적인 자연어 처리 작업에서 단어 사전의 규모는 약 10,000 ~ 50,000개 정도로 구성(현대 한글의 글자 수는 11,172개)
2-2. 토큰화 방법
- 문장 토큰화: 토큰의 기준을 문장으로 하는 토큰화 방법
- 문장의 끝에 오는 문장 부호를 기준으로 코퍼스를 잘라냄(. 또는 ! 또는 ?)
- 예외) 제 이메일 주소는 aaa@naver.com 입니다.
- 단어 토큰화: 토큰의 기준을 단어로 하는 토큰화 방법(여러 뜻이 있는 단어의 경우 애매해짐)
- 영어권 나라들은 단어 토큰화를 많이 씀
- 보편적으로 구분 기호를 가지고 텍스트를 나누게 되며, 기본적으로 공백을 구분자로 사용
- 한국어의 경우 교착어이기 때문에 공백으로 단어 토큰화를 하면 성능이 좋지 않음
- 새로운 단어가 추가될수록 단어 사전의 크기가 계속 증가
- OOV(Out of Vocabulary)문제가 있음: UNK가 발생하는 등..
- 문자 토큰화: 토큰의 기준을 문자로 하는 토큰화 방법(문자는 메모리를 적게 차지하지만 뜻을 다시 부여해줘야함.)
- 단어 토큰화의 한계점들을 해결하기 위한 방법
- 영어는 26개의 알파벳에 따라 분리, 한국어는 자음 19개와 모음 21개의 글자에 따라 분리(안녕 -> ㅇ ㅏ ㄴ ㄴ ㅕ ㅇ)
- 작은 메모리로 가능하지만, 문장 하나를 생성하는데 너무 많은 추론이 필요
- 단어 사전은 작지만 모델의 예측 시간에 문제가 생길 수 있음
- 서브워드 토큰화: 토큰의 기준을 서브워드로 하는 토큰화 방법(구글에서 만든 알고리즘에 있다.) -> 어떤식으로 조합해서 토큰화 시키는지에 대한 팀과제 주실 예정
- 단어 토큰화와 문자 토큰화의 한계점을 해결하기 위한 방법
- 문자 토큰화의 확장된 버전으로 토큰의 단위를 n개의 문자로 정의하고, 해당 기준에 따라 텍스트로 분절하는 방법
- 형태소 분절 기반의 서브워드 토큰화로 확장될 수 있어 한국어에서도 좋은 성능을 가짐
- 서브 워드를 만드는 알고리즘 중에서 가장 유명한 것이 BPE
3. 서브워드 토큰화
3-1. 서브워드(subword)
- 단어보다 더 작은 의미의 단위
- 예) Birthday = birth + day, 아침밥 = 아침 + 밥
- 단어를 여러 서브워드로 분리해서 단어 사전을 구축하겠다는 토큰화 방법
- 신조어에서 주로 발생하는 OOV 문제를 완화
- upperwear
3-2. BPE(Byte Pair Encoding)
- 코퍼스 내 단어의 등장 빈도에 따라 서브워드를 구축하는데 사용
- 2016 Neural Machine Translation of Rare Words with Subword Units 논문에서 처음 제안
- 글자단위에서 점진적으로 서브워드 집합을 만들어내는 Bottom-up 방식의 접근 방식으로 자연어 코퍼스에 있는 모든 단어들을 글자 단위로 분리한 뒤에, 등장 빈도에 따라 글자들을 서브워드로 통합하는 방
3-3. WordPiece Tokenizer
- 구글이 2016년도 Google's Neural Mashine Translation System Bridging the Gap between Human and Machine Translation논문에 처음 공개한 BPE의 변형 알고리즘
- 병합할 두 문자가 있을 떼, 각각의 문자가 따로 있을 때 더 중요시 여기는지, 병합되었을 때를 더 중요시 여기는지에 차이점을 둠
- GPT모델과 같은 생성 모델
- BERT,ELECTRA와 같은 자연어 이해 모델에서는 WordPiece Tokenizer를 주로 사용
4. 정제(Cleaning)
- 토큰화 작업에 방해가 되는 부분들을 필터링하거나 토큰화 작업 이후에도 여전히 남아있는 노이즈들을 제거하기 위해 지속적으로 이뤄지는 전처리 과정
- 어떤 특정이 노이즈인지 판단하거나, 모든 노이즈를 완벽하게 제거하는 것은 어렵기 때문에 일종의 합의점을 찾아야 함
4-1. 정제 작업의 종류
- 불용어(Stopword) 처리
- NLTK 라이브러리에서는 자주 사용되는 단어들을 불용어로 정의
- 불용어의 정의는 가변적이기 때문에 추가하고싶은 불용어가 있다면 직접 정의할 수 있음
- 보편적으로 선택할 수 있는 한국어 불용어 리스트(https://www.ranks.nl/stopwords/korean)
- 불필요한 태그 및 특수 문자 제거(html 태그같은,,)
- 코퍼스 내 등장 빈도가 적은 단어 제거
- 코퍼스 내 단어들의 빈도를 분석하여 분포를 보고 특정 threshold를 설정한 후, 해당 threshold 아래의 단어들을 필터링하는 방식으로 정제
4-2. 정제 과정에서 유의해야할 점
- @ 과 같은 특수 문자는 일반적인 작업에서는 정보량이 적은 토큰일 수 있지만, 이메일과 관련한 내용을 판단해야하는 작업에서는 유용한 토큰으로 사용될 수 있음
자연어 처리 작업에서 데이터를 수집한 이후에는 항상 목적에 맞지 않는 노이즈가 있진 않은지 검사하고 발견한 노이즈를 정제하기 위한 노력이 필요
5. 정규화(Normalization)
- 일반적인 머신러닝 작업에서는 데이터 정규화는 학습 데이터의 값들이 적당한 범위를 유지하도록 데이터의 범위를 변환하거나 스케일링하는 과정
- 정규화 목표는 모든 데이터가 같은 정도의 스케일로 반영되도록 하는 것
- 자연어 처리 정규화의 핵심은 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어주는 과정
5-1. 정규화 작업이 필요한 이유
- 이상적으로 단어 사전 내의 단어 토큰들이 모두 중요하게 고려되길 원함
- 자연어의 특성상 의미가 같은데 표기가 다른 단어들이 있을 수 있고, 의미는 같지만 사용 빈도가 낮은 동의어들은 학습에 유용하게 활용되지 않을 수 있음
- 부추: 400번, 정구지: 30번,, 동일 의미의 단어가 분산되어있으면 핵심 단어 이지만 핵심 단어에서 밀릴 수 있음
- 의미가 같지만, 표기가 다른 단어들을 통합할 수 있다면 통합된 단어의 사용 빈도가 높아질 것이고, 빈도가 낮은 단어들의 중요도가 높아질 수 있음
5-2. 정규화 작업의 종류
- 어간 추출, 표제어 추출
- 어간 추출: 형태학적 분석을 단순화한 버전으로, 정해진 규칙만 보고 단어의 어미를 자르는 어림짐작의 작업(대충 표기하는 방법)
- 표제어 추출: 단어들이 다른 형태를 가지더라도, 그 뿌리 단어를 찾아가서 단어의 개수를 줄일 수 있는지 판단하는 방법(am, are, is -> be)
- 대소문자 통합
- 대문자와 소문자가 구분되어야 하는 경우도 있음. 따라서 무작정 소문자로 통합해서는 안돼는 경우가 있음
- 예) US(미국), us(우리)
5-3. 정규화 시 유의할 점
- 규칙은 너무 엄격한 정규화 방법은 부작용이 심해 학습에 악영향을 줄 수 있음
- 원본 의미를 최대한 유지하는 것이 학습에 도움이 됨
- 대화에서 사용하는 의미가 비슷한 이모티콘들을 통합하는 정규화 작업
- "ㅋㅋㅋㅋㅋㅋㅋㅋㅋ" -> "ㅋㅋ"
6. 한국어 데이터 전처리
6-1. 한국어의 특성
- 영어는 합성어나 줄임말에 대한 예외처리만 한다면, 띄어쓰기를 기준으로 하는 토큰화 작업으로도 어느 정도의 성능을 보장할 수 있음
- 한국어에는 조사나 어미가 발달되어 있기 때문에 띄어쓰기만으로 단어를 분리하면 의미적인 훼손이 일어날 수 있음
- 띄어쓰기 단위가 되는 단위를 "어절"이라고 하는데, 어절 토큰화와 단어 토큰화가 같지 않기 때문(교착어 때문)
6-2. 형태소 분석
- 형태소를 비롯하여, 어근/접두사/접미사/품사 등 다양한 언어적 속성의 구조를 파악하는 것을 의미
- 형태소 분석 과정은 한국어 단어에서 형태소를 추출하여 분리하는 작업이며, 이후에 필요에 따라 사전 정의된 품사를 해당 단어에 태깅하는 작업을 하기도 함
- 태깅: 형태소의 뜻과 문맥을 고려하여 단어에 품사를 매핑하는 것
6-3. 형태소 분석 방법
- 한국어의 다양한 형태소를 분석하고 분류하기 위해 KoNLPy 패키지에서 분석기를 사용
- KoNLPy 패키지의 다양한 함수를 사용하여 한국어 내 다양한 전처리를 진행
- Mecab: 일본어용 형태소 분석기를 한국어를 사용할 수 있도록 수정
- Okt: 오픈 소스 한국어 분석기. 과거 트위터 형태소 분석기
- komoran: Shinware에서 개발
- kkma: 서울대학교 IDS 연구실 개발
- 각 형태소 분석기는 성능과 결과가 다르게 나오기 때문에 사용하고자 하는 필요 용도에 어떤 형태소 분석기가 적절한지를 판단
- 속도를 중시한다면 Mecab을 사용
코드텍스트
7. 데이터 전처리 실습
# 뉴스기사 크롤링 라이브러리 설치
!pip install newspaper3k
-----------------------------------------------------------------------------------------------
# 결과
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: newspaper3k in /usr/local/lib/python3.10/dist-packages (0.2.8)
Requirement already satisfied: beautifulsoup4>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (4.11.2)
Requirement already satisfied: Pillow>=3.3.0 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (8.4.0)
Requirement already satisfied: PyYAML>=3.11 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (6.0)
Requirement already satisfied: cssselect>=0.9.2 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (1.2.0)
Requirement already satisfied: lxml>=3.6.0 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (4.9.2)
Requirement already satisfied: nltk>=3.2.1 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (3.8.1)
Requirement already satisfied: requests>=2.10.0 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (2.27.1)
Requirement already satisfied: feedparser>=5.2.1 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (6.0.10)
Requirement already satisfied: tldextract>=2.0.1 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (3.4.4)
Requirement already satisfied: feedfinder2>=0.0.4 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (0.0.4)
Requirement already satisfied: jieba3k>=0.35.1 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (0.35.1)
Requirement already satisfied: python-dateutil>=2.5.3 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (2.8.2)
Requirement already satisfied: tinysegmenter==0.3 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (0.3)
Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4>=4.4.1->newspaper3k) (2.4.1)
Requirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from feedfinder2>=0.0.4->newspaper3k) (1.16.0)
Requirement already satisfied: sgmllib3k in /usr/local/lib/python3.10/dist-packages (from feedparser>=5.2.1->newspaper3k) (1.0.0)
Requirement already satisfied: click in /usr/local/lib/python3.10/dist-packages (from nltk>=3.2.1->newspaper3k) (8.1.3)
Requirement already satisfied: joblib in /usr/local/lib/python3.10/dist-packages (from nltk>=3.2.1->newspaper3k) (1.2.0)
Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.10/dist-packages (from nltk>=3.2.1->newspaper3k) (2022.10.31)
Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from nltk>=3.2.1->newspaper3k) (4.65.0)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.10.0->newspaper3k) (1.26.16)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.10.0->newspaper3k) (2023.5.7)
Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests>=2.10.0->newspaper3k) (2.0.12)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.10.0->newspaper3k) (3.4)
Requirement already satisfied: requests-file>=1.4 in /usr/local/lib/python3.10/dist-packages (from tldextract>=2.0.1->newspaper3k) (1.5.1)
Requirement already satisfied: filelock>=3.0.8 in /usr/local/lib/python3.10/dist-packages (from tldextract>=2.0.1->newspaper3k) (3.12.2)
----------------------------------------------------------------------------------------------------------------------------------------------------
import newspaper
newspaper.languages()
-----------------------------------------------------
# 결과
Your available languages are:
input code full name
es Spanish
ru Russian
et Estonian
pl Polish
ar Arabic
hi Hindi
no Norwegian
sl Slovenian
mk Macedonian
de German
ja Japanese
pt Portuguese
en English
nl Dutch
tr Turkish
el Greek
da Danish
sw Swahili
fr French
be Belarusian
sr Serbian
vi Vietnamese
hr Croatian
ro Romanian
fi Finnish
bg Bulgarian
ko Korean
he Hebrew
it Italian
fa Persian
id Indonesian
sv Swedish
nb Norwegian (Bokmål)
hu Hungarian
uk Ukrainian
zh Chinese
---------------------------------------------------------------------------------------------
from newspaper import Article
URL = 'https://www.sisain.co.kr/news/articleView.html?idxno=50468'
article = Article(URL, language='ko')
article.download()
article.parse()
print('title:', article.title)
print('---------------------------------------------')
print('content:', article.text)
---------------------------------------------------------------------------------------------
#결과
title: 뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]
---------------------------------------------
content: 유튜브 채널을 만들었다. ‘씨리얼’ 만들고 8년 만이다. 이름은 ‘오뜨밀’이다. 제작진 평균연령이 30세를 조금 넘는다. 직군과 소속 부서도 다양하다. 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다. 대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다. 월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다. 그리고 동시에 라디오로 내보낸다.
뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’. ⓒ오뜨밀 갈무리
생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다. 대답은 간단하다. 변함없이 그 자리에 존재하기 위해서다. 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다. 적지 않은 호응도 받았다. 그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다. 늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다. 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다. 다름 아닌 라디오 PD들이다. 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다. 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다. 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다. “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.” 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다. ‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다. 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
‘내 친구들은 왜 뉴스를 안 볼까?’ 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까. 어리석은 질문인 걸 안다. 답이 정해져 있기 때문이다. 뉴스가 그들을 대상으로 하고 있지 않아서다. 뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다. 국회의원 평균연령은 54.9세. 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준). 라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다. 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
매일같이 꾸준히 존재해보는 것
뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까? 공공재의 아주 일부라도 달리 쓸 수는 없을까? 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다. 소셜 플랫폼만으로는 참 어렵다. 오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다. 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다. 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다. 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다. 아직은 좌충우돌 그 자체다. 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다. 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
저작권자 © 시사IN 무단전재 및 재배포 금지
----------------------------------------------------------------------------------------------
additional_info = [
"※ 기자 김사과(apple@apple.com) 취재 반하나(banana@banana.com)",
"<h2>뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]</h2>",
"이 기사는 임시 데이터임을 알립니다!",
"Copyrights© Pressian.com",
"<br> ☞ 이 기사는 문화 섹션으로 분류 했습니다 … </br>",
"#기사 #문화 #라디오 #PD"
]
context = article.text.split("\n")
context += additional_info
for i, text in enumerate(context):
print(i, text)
----------------------------------------------------------------------------------------------
# 결과
0 유튜브 채널을 만들었다. ‘씨리얼’ 만들고 8년 만이다. 이름은 ‘오뜨밀’이다. 제작진 평균연령이 30세를 조금 넘는다. 직군과 소속 부서도 다양하다. 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다. 대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다. 월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다. 그리고 동시에 라디오로 내보낸다.
1
2 뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’. ⓒ오뜨밀 갈무리
3
4 생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다. 대답은 간단하다. 변함없이 그 자리에 존재하기 위해서다. 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다. 적지 않은 호응도 받았다. 그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다. 늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다. 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
5
6 한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다. 다름 아닌 라디오 PD들이다. 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다. 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다. 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다. “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.” 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다. ‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다. 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
7
8 ‘내 친구들은 왜 뉴스를 안 볼까?’ 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까. 어리석은 질문인 걸 안다. 답이 정해져 있기 때문이다. 뉴스가 그들을 대상으로 하고 있지 않아서다. 뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다. 국회의원 평균연령은 54.9세. 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준). 라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다. 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
9
10 매일같이 꾸준히 존재해보는 것
11
12 뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까? 공공재의 아주 일부라도 달리 쓸 수는 없을까? 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다. 소셜 플랫폼만으로는 참 어렵다. 오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다. 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다. 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다. 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다. 아직은 좌충우돌 그 자체다. 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다. 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
13
14 저작권자 © 시사IN 무단전재 및 재배포 금지
15 ※ 기자 김사과(apple@apple.com) 취재 반하나(banana@banana.com)
16 <h2>뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]</h2>
17 이 기사는 임시 데이터임을 알립니다!
18 Copyrights© Pressian.com
19 <br> ☞ 이 기사는 문화 섹션으로 분류 했습니다 … </br>
20 #기사 #문화 #라디오 #PD
---------------------------------------------------------------------------------------------
7-1. 불용어 제거
from newspaper.text import StopWords
# 불용어 사전 정의하기
stopwords = ['이하','바로','…', '※', '☞']
# 불용어 제거 함수
# def delete_stopwords(context):
# for i in range(len(context)):
# for j in range(len(stopwords)):
# context[i] = context[i].replace(stopwords[j],'')
# 강사님 해설
# 불용어 제거 함수
def delete_stopwords(context):
preprocessed_text = []
for text in context:
text = [w for w in text.split(' ') if w not in stopwords]
preprocessed_text.append(' '.join(text))
return preprocessed_text
processed_context = delete_stopwords(context)
for i, text in enumerate(processed_context):
print(i, text)
----------------------------------------------------------------------------------------------
# 결과
0 유튜브 채널을 만들었다. ‘씨리얼’ 만들고 8년 만이다. 이름은 ‘오뜨밀’이다. 제작진 평균연령이 30세를 조금 넘는다. 직군과 소속 부서도 다양하다. 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다. 대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다. 월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다. 그리고 동시에 라디오로 내보낸다.
1
2 뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’. ⓒ오뜨밀 갈무리
3
4 생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다. 대답은 간단하다. 변함없이 그 자리에 존재하기 위해서다. 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다. 적지 않은 호응도 받았다. 그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다. 늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다. 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
5
6 한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다. 다름 아닌 라디오 PD들이다. 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다. 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다. 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다. “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.” 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다. ‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다. 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
7
8 ‘내 친구들은 왜 뉴스를 안 볼까?’ 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까. 어리석은 질문인 걸 안다. 답이 정해져 있기 때문이다. 뉴스가 그들을 대상으로 하고 있지 않아서다. 뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다. 국회의원 평균연령은 54.9세. 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준). 라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다. 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
9
10 매일같이 꾸준히 존재해보는 것
11
12 뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까? 공공재의 아주 일부라도 달리 쓸 수는 없을까? 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다. 소셜 플랫폼만으로는 참 어렵다. 오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다. 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다. 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다. 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다. 아직은 좌충우돌 그 자체다. 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다. 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
13
14 저작권자 © 시사IN 무단전재 및 재배포 금지
15 기자 김사과(apple@apple.com) 취재 반하나(banana@banana.com)
16 <h2>뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]</h2>
17 이 기사는 임시 데이터임을 알립니다!
18 Copyrights© Pressian.com
19 <br> 이 기사는 문화 섹션으로 분류 했습니다 </br>
20 #기사 #문화 #라디오 #PD
---------------------------------------------------------------------------------------------
7-2. HTML 태그 제거
import re # 정규식을 쓸 수 있는 모듈
stopwords = ['<h2>','</h2>','<br>','</br>']
input = r'/^<+[A-Za-z0-9/]+$+>/'
# html 태그만 제거한 결과를 리턴하는 함수 만들기
def delete_html_tag(context):
preprocessed_text = []
for text in context:
text = re.sub(r'<[^>]+>\s+(?=<)|<[^>]+>', '', text).strip()
if text:
preprocessed_text.append(text)
return preprocessed_text
processed_context = delete_html_tag(context)
for i, text in enumerate(processed_context):
print(i, text)
------------------------------------------------------------------------------------------------
# 결과
0 유튜브 채널을 만들었다. ‘씨리얼’ 만들고 8년 만이다. 이름은 ‘오뜨밀’이다. 제작진 평균연령이 30세를 조금 넘는다. 직군과 소속 부서도 다양하다. 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다. 대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다. 월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다. 그리고 동시에 라디오로 내보낸다.
1 뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’. ⓒ오뜨밀 갈무리
2 생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다. 대답은 간단하다. 변함없이 그 자리에 존재하기 위해서다. 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다. 적지 않은 호응도 받았다. 그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다. 늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다. 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
3 한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다. 다름 아닌 라디오 PD들이다. 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다. 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다. 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다. “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.” 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다. ‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다. 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
4 ‘내 친구들은 왜 뉴스를 안 볼까?’ 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까. 어리석은 질문인 걸 안다. 답이 정해져 있기 때문이다. 뉴스가 그들을 대상으로 하고 있지 않아서다. 뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다. 국회의원 평균연령은 54.9세. 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준). 라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다. 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
5 매일같이 꾸준히 존재해보는 것
6 뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까? 공공재의 아주 일부라도 달리 쓸 수는 없을까? 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다. 소셜 플랫폼만으로는 참 어렵다. 오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다. 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다. 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다. 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다. 아직은 좌충우돌 그 자체다. 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다. 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
7 저작권자 © 시사IN 무단전재 및 재배포 금지
8 ※ 기자 김사과(apple@apple.com) 취재 반하나(banana@banana.com)
9 뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]
10 이 기사는 임시 데이터임을 알립니다!
11 Copyrights© Pressian.com
12 ☞ 이 기사는 문화 섹션으로 분류 했습니다 …
13 #기사 #문화 #라디오 #PD
-----------------------------------------------------------------------------------------------------
7-2. 문장 분리
- 학습 데이터를 구성할 때 입력 데이터의 단위를 설정하기 애매해지므로, 문장 단위로 모델이 학습하도록 유도하기 위해 문장 분리가 필요
- 한국어 문장 분리기 중, 가장 성능이 우수한 것으로 알려진 kss 라이브러리 를 사용
!pip install kss
------------------------------------------------------------------------------------------------
# 결과
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: kss in /usr/local/lib/python3.10/dist-packages (4.5.3)
Requirement already satisfied: emoji==1.2.0 in /usr/local/lib/python3.10/dist-packages (from kss) (1.2.0)
Requirement already satisfied: regex in /usr/local/lib/python3.10/dist-packages (from kss) (2022.10.31)
Requirement already satisfied: pecab in /usr/local/lib/python3.10/dist-packages (from kss) (1.0.8)
Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from kss) (3.1)
Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from pecab->kss) (1.22.4)
Requirement already satisfied: pyarrow in /usr/local/lib/python3.10/dist-packages (from pecab->kss) (9.0.0)
Requirement already satisfied: pytest in /usr/local/lib/python3.10/dist-packages (from pecab->kss) (7.2.2)
Requirement already satisfied: attrs>=19.2.0 in /usr/local/lib/python3.10/dist-packages (from pytest->pecab->kss) (23.1.0)
Requirement already satisfied: iniconfig in /usr/local/lib/python3.10/dist-packages (from pytest->pecab->kss) (2.0.0)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from pytest->pecab->kss) (23.1)
Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from pytest->pecab->kss) (1.2.0)
Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /usr/local/lib/python3.10/dist-packages (from pytest->pecab->kss) (1.1.1)
Requirement already satisfied: tomli>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from pytest->pecab->kss) (2.0.1)
-----------------------------------------------------------------------------------------------------------
import kss
def sentence_seperator(processed_context):
splited_context = []
for text in processed_context:
text = text.strip()
if text:
splited_text = kss.split_sentences(text)
splited_context.extend(splited_text)
return splited_context
splited_context = sentence_seperator(processed_context)
---------------------------------------------------------------------------------------------
# 결과
WARNING:root:Oh! You have konlpy.tag.Mecab in your environment. Kss will take this as a backend! :D
-----------------------------------------------------------------------------------------------------
for i, text in enumerate(splited_context):
print(i, text)
-----------------------------------------------------------------------------------------------------
# 결과
0 유튜브 채널을 만들었다.
1 ‘씨리얼’ 만들고 8년 만이다.
2 이름은 ‘오뜨밀’이다.
3 제작진 평균연령이 30세를 조금 넘는다.
4 직군과 소속 부서도 다양하다.
5 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다.
6 대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다.
7 월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다.
8 그리고 동시에 라디오로 내보낸다.
9 뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’.
10 ⓒ오뜨밀 갈무리
11 생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다.
12 대답은 간단하다.
13 변함없이 그 자리에 존재하기 위해서다.
14 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다.
15 적지 않은 호응도 받았다.
16 그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다.
17 늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다.
18 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
19 한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다.
20 다름
21 아닌 라디오 PD들이다.
22 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다.
23 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다.
24 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다.
25 “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.”
26 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다.
27 ‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다.
28 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
29 ‘내 친구들은 왜 뉴스를 안 볼까?’
30 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까.
31 어리석은 질문인 걸 안다.
32 답이 정해져 있기 때문이다.
33 뉴스가 그들을 대상으로 하고 있지 않아서다.
34 뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다.
35 국회의원 평균연령은 54.9세.
36 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준).
37 라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다.
38 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
39 매일같이 꾸준히 존재해보는 것
40 뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까?
41 공공재의 아주 일부라도 달리 쓸 수는 없을까?
42 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다.
43 소셜 플랫폼만으로는 참 어렵다.
44 오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다.
45 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다.
46 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다.
47 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다.
48 아직은 좌충우돌 그 자체다.
49 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다.
50 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
51 저작권자 © 시사IN 무단전재 및 재배포 금지
52 ※ 기자 김사과(apple@apple.com) 취재 반하나(banana@banana.com)
53 뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]
54 이 기사는 임시 데이터임을 알립니다!
55 Copyrights© Pressian.com
56 ☞ 이 기사는 문화 섹션으로 분류 했습니다 …
57 #기사 #문화 #라디오 #PD
7-4. 이메일 제거
def delete_email(context):
preprocessed_text = []
for text in context:
text = re.sub(r'[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+', '', text).strip()
if text:
preprocessed_text.append(text)
return preprocessed_text
preprocessed_context = delete_email(splited_context)
for i, text in enumerate(preprocessed_context):
print(i, text)
------------------------------------------------------------------------------------------------
# 결과
0 유튜브 채널을 만들었다.
1 ‘씨리얼’ 만들고 8년 만이다.
2 이름은 ‘오뜨밀’이다.
3 제작진 평균연령이 30세를 조금 넘는다.
4 직군과 소속 부서도 다양하다.
5 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다.
6 대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다.
7 월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다.
8 그리고 동시에 라디오로 내보낸다.
9 뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’.
10 ⓒ오뜨밀 갈무리
11 생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다.
12 대답은 간단하다.
13 변함없이 그 자리에 존재하기 위해서다.
14 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다.
15 적지 않은 호응도 받았다.
16 그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다.
17 늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다.
18 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
19 한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다.
20 다름
21 아닌 라디오 PD들이다.
22 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다.
23 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다.
24 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다.
25 “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.”
26 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다.
27 ‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다.
28 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
29 ‘내 친구들은 왜 뉴스를 안 볼까?’
30 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까.
31 어리석은 질문인 걸 안다.
32 답이 정해져 있기 때문이다.
33 뉴스가 그들을 대상으로 하고 있지 않아서다.
34 뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다.
35 국회의원 평균연령은 54.9세.
36 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준).
37 라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다.
38 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
39 매일같이 꾸준히 존재해보는 것
40 뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까?
41 공공재의 아주 일부라도 달리 쓸 수는 없을까?
42 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다.
43 소셜 플랫폼만으로는 참 어렵다.
44 오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다.
45 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다.
46 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다.
47 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다.
48 아직은 좌충우돌 그 자체다.
49 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다.
50 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
51 저작권자 © 시사IN 무단전재 및 재배포 금지
52 ※ 기자 김사과() 취재 반하나()
53 뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]
54 이 기사는 임시 데이터임을 알립니다!
55 Copyrights© Pressian.com
56 ☞ 이 기사는 문화 섹션으로 분류 했습니다 …
57 #기사 #문화 #라디오 #PD
7-5. 해시태그 제거
def delete_html_tag(context):
preprocessed_text = []
for text in context:
text = re.sub(r'<[^>]+>\s+(?=<)|<[^>]+>', '', text).strip()
if text:
preprocessed_text.append(text)
return preprocessed_text
preprocessed_context = delete_html_tag(preprocessed_context)
for i, text in enumerate(preprocessed_context):
print(i, text)
------------------------------------------------------------------------------------------------
# 결과
0 유튜브 채널을 만들었다.
1 ‘씨리얼’ 만들고 8년 만이다.
2 이름은 ‘오뜨밀’이다.
3 제작진 평균연령이 30세를 조금 넘는다.
4 직군과 소속 부서도 다양하다.
5 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다.
6 대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다.
7 월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다.
8 그리고 동시에 라디오로 내보낸다.
9 뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’.
10 ⓒ오뜨밀 갈무리
11 생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다.
12 대답은 간단하다.
13 변함없이 그 자리에 존재하기 위해서다.
14 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다.
15 적지 않은 호응도 받았다.
16 그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다.
17 늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다.
18 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
19 한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다.
20 다름
21 아닌 라디오 PD들이다.
22 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다.
23 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다.
24 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다.
25 “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.”
26 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다.
27 ‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다.
28 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
29 ‘내 친구들은 왜 뉴스를 안 볼까?’
30 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까.
31 어리석은 질문인 걸 안다.
32 답이 정해져 있기 때문이다.
33 뉴스가 그들을 대상으로 하고 있지 않아서다.
34 뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다.
35 국회의원 평균연령은 54.9세.
36 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준).
37 라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다.
38 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
39 매일같이 꾸준히 존재해보는 것
40 뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까?
41 공공재의 아주 일부라도 달리 쓸 수는 없을까?
42 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다.
43 소셜 플랫폼만으로는 참 어렵다.
44 오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다.
45 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다.
46 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다.
47 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다.
48 아직은 좌충우돌 그 자체다.
49 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다.
50 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
51 저작권자 © 시사IN 무단전재 및 재배포 금지
52 ※ 기자 김사과() 취재 반하나()
53 뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]
54 이 기사는 임시 데이터임을 알립니다!
55 Copyrights© Pressian.com
56 ☞ 이 기사는 문화 섹션으로 분류 했습니다 …
57 #기사 #문화 #라디오 #PD
7-6. 저작권 관련 테스트 제거
def delete_copyright(context):
re_patterns = [
r'\<저작권자(\(c\)|©|(C)|(\(C\))).+?\>',
r'(Copyrights)|(\(c\))|(\(C\))|©|(C)|'
]
preprocessed_text = []
for text in context:
for re_pattern in re_patterns:
text = re.sub(re_pattern, "", text).strip()
if text:
preprocessed_text.append(text)
return preprocessed_text
preprocessed_context = delete_copyright(preprocessed_context)
for i, text in enumerate(preprocessed_context):
print(i, text)
------------------------------------------------------------------------------------------------
# 결과
0 유튜브 채널을 만들었다.
1 ‘씨리얼’ 만들고 8년 만이다.
2 이름은 ‘오뜨밀’이다.
3 제작진 평균연령이 30세를 조금 넘는다.
4 직군과 소속 부서도 다양하다.
5 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다.
6 대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다.
7 월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다.
8 그리고 동시에 라디오로 내보낸다.
9 뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’.
10 ⓒ오뜨밀 갈무리
11 생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다.
12 대답은 간단하다.
13 변함없이 그 자리에 존재하기 위해서다.
14 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다.
15 적지 않은 호응도 받았다.
16 그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다.
17 늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다.
18 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
19 한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다.
20 다름
21 아닌 라디오 PD들이다.
22 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다.
23 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다.
24 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다.
25 “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.”
26 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다.
27 ‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다.
28 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
29 ‘내 친구들은 왜 뉴스를 안 볼까?’
30 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까.
31 어리석은 질문인 걸 안다.
32 답이 정해져 있기 때문이다.
33 뉴스가 그들을 대상으로 하고 있지 않아서다.
34 뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다.
35 국회의원 평균연령은 54.9세.
36 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준).
37 라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다.
38 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
39 매일같이 꾸준히 존재해보는 것
40 뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까?
41 공공재의 아주 일부라도 달리 쓸 수는 없을까?
42 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다.
43 소셜 플랫폼만으로는 참 어렵다.
44 오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다.
45 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다.
46 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다.
47 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다.
48 아직은 좌충우돌 그 자체다.
49 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다.
50 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
51 저작권자 시사IN 무단전재 및 재배포 금지
52 ※ 기자 김사과() 취재 반하나()
53 뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]
54 이 기사는 임시 데이터임을 알립니다!
55 Pressian.com
56 ☞ 이 기사는 문화 섹션으로 분류 했습니다 …
57 #기사 #문화 #라디오 #PD
7-7. 반복 횟수가 많은 문자 정규화
!pip install soynlp
------------------------------------------------------------------------------------------------
# 결과
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: soynlp in /usr/local/lib/python3.10/dist-packages (0.0.493)
Requirement already satisfied: numpy>=1.12.1 in /usr/local/lib/python3.10/dist-packages (from soynlp) (1.22.4)
Requirement already satisfied: psutil>=5.0.1 in /usr/local/lib/python3.10/dist-packages (from soynlp) (5.9.5)
Requirement already satisfied: scipy>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from soynlp) (1.10.1)
Requirement already satisfied: scikit-learn>=0.20.0 in /usr/local/lib/python3.10/dist-packages (from soynlp) (1.2.2)
Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.20.0->soynlp) (1.2.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.20.0->soynlp) (3.1.0)
-------------------------------------------------------------------------------------------------
from soynlp.normalizer import *
print(repeat_normalize('ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ', num_repeats=2))
--------------------------------------------------------------
# 결과
ㅋㅋ
--------------------------------------------------------------
print(repeat_normalize('야!!!!!!!!!!!!!!!! 너@@@@ 지금 뭐함 ㅠㅠㅠㅠ', num_repeats=2)) # 자음, 모음만 바뀜
-------------------------------------------------------------------------------------------------------
# 결과
야!!!!!!!!!!!!!!!! 너@@@@ 지금 뭐함 ㅠㅠ
7-8. 띄어쓰기 보정(안됨)
# 깃허브 라이브러리 install
!pip install git+https://github.com/haven-jeon/PyKoSpacing.git
-----------------------------------------------------------------------------------------------
# 결과
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting git+https://github.com/haven-jeon/PyKoSpacing.git
Cloning https://github.com/haven-jeon/PyKoSpacing.git to /tmp/pip-req-build-e_dm_51n
Running command git clone --filter=blob:none --quiet https://github.com/haven-jeon/PyKoSpacing.git /tmp/pip-req-build-e_dm_51n
Resolved https://github.com/haven-jeon/PyKoSpacing.git to commit 5bb0b3e8f62c1936a430745297821a9ecd78beb1
Preparing metadata (setup.py) ... done
Collecting tensorflow==2.9.3 (from pykospacing==0.5)
Using cached tensorflow-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (511.8 MB)
Collecting h5py==3.1.0 (from pykospacing==0.5)
Using cached h5py-3.1.0.tar.gz (371 kB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
error: subprocess-exited-with-error
× pip subprocess to install backend dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
Installing backend dependencies ... error
error: subprocess-exited-with-error
× pip subprocess to install backend dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
from pykospacing import Spacing
------------------------------------------------------------------------------------------------
# 결과
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-36-37998ce95f70> in <cell line: 1>()
----> 1 from pykospacing import Spacing
ModuleNotFoundError: No module named 'pykospacing'
---------------------------------------------------------------------------
NOTE: If your import is failing due to a missing package, you can
manually install dependencies using either !pip or !apt.
To view examples of installing some common dependencies, click the
"Open Examples" button below.
---------------------------------------------------------------------------
spacing = Spacing()
spacing('아버지가방에들어가신다')
spacing('아버 지가방 에들어가 신다')
7-8. 중복 문장 정규화
from collections import OrderedDict
def duplicated_sentence_normalizer(context):
context = list(OrderedDict.fromkeys(context))
return context
normalized_context = duplicated_sentence_normalizer(preprocessed_context)
for i, text in enumerate(normalized_context):
print(i, text)
------------------------------------------------------------------------------------------------
# 결과
0 유튜브 채널을 만들었다.
1 ‘씨리얼’ 만들고 8년 만이다.
2 이름은 ‘오뜨밀’이다.
3 제작진 평균연령이 30세를 조금 넘는다.
4 직군과 소속 부서도 다양하다.
5 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다.
6 대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다.
7 월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다.
8 그리고 동시에 라디오로 내보낸다.
9 뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’.
10 ⓒ오뜨밀 갈무리
11 생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다.
12 대답은 간단하다.
13 변함없이 그 자리에 존재하기 위해서다.
14 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다.
15 적지 않은 호응도 받았다.
16 그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다.
17 늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다.
18 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
19 한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다.
20 다름
21 아닌 라디오 PD들이다.
22 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다.
23 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다.
24 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다.
25 “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.”
26 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다.
27 ‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다.
28 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
29 ‘내 친구들은 왜 뉴스를 안 볼까?’
30 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까.
31 어리석은 질문인 걸 안다.
32 답이 정해져 있기 때문이다.
33 뉴스가 그들을 대상으로 하고 있지 않아서다.
34 뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다.
35 국회의원 평균연령은 54.9세.
36 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준).
37 라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다.
38 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
39 매일같이 꾸준히 존재해보는 것
40 뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까?
41 공공재의 아주 일부라도 달리 쓸 수는 없을까?
42 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다.
43 소셜 플랫폼만으로는 참 어렵다.
44 오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다.
45 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다.
46 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다.
47 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다.
48 아직은 좌충우돌 그 자체다.
49 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다.
50 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
51 저작권자 시사IN 무단전재 및 재배포 금지
52 ※ 기자 김사과() 취재 반하나()
53 뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]
54 이 기사는 임시 데이터임을 알립니다!
55 Pressian.com
56 ☞ 이 기사는 문화 섹션으로 분류 했습니다 …
57 #기사 #문화 #라디오 #PD
7-9. Cleaning
- 형태소 분석 기반 필터링
- 데이터 후처리
!pip install mecab-python
------------------------------------------------------------------------------------------------
# 결과
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: mecab-python in /usr/local/lib/python3.10/dist-packages (1.0.0)
Requirement already satisfied: mecab-python3 in /usr/local/lib/python3.10/dist-packages (from mecab-python) (1.0.6)
--------------------------------------------------------------------------------------------------
!pip install konlpy
--------------------------------------------------------------------------------------------------
# 결과
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: konlpy in /usr/local/lib/python3.10/dist-packages (0.6.0)
Requirement already satisfied: JPype1>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from konlpy) (1.4.1)
Requirement already satisfied: lxml>=4.1.0 in /usr/local/lib/python3.10/dist-packages (from konlpy) (4.9.2)
Requirement already satisfied: numpy>=1.6 in /usr/local/lib/python3.10/dist-packages (from konlpy) (1.22.4)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from JPype1>=0.7.0->konlpy) (23.1)
-----------------------------------------------------------------------------------------------------
!bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)
------------------------------------------------------------------------------------------------------
# 결과
mecab-ko is already installed
mecab-ko-dic is already installed
mecab-python is already installed
Done.
-------------------------------------------------------------------------------------------------------
from konlpy.tag import Mecab
mecab = Mecab()
morphs = mecab.pos('아버지가방에들어가신다', join=False)
print(morphs)
-------------------------------------------------------------------------------------------------------
# 결과
[('아버지', 'NNG'), ('가', 'JKS'), ('방', 'NNG'), ('에', 'JKB'), ('들어가', 'VV'), ('신다', 'EP+EC')]
------------------------------------------------------------------------------------------------------
# 명사(NN), 동사(V), 형용사(J)의 포함 여부에 따라 문장을 필터링
def morph_filter(context):
NN_TAGS = ['NNG', 'NNP', 'NNB','NP']
V_TAGS = ['VV','VA','VX','VCP','VCN','XSN','XSA','XSV']
J_TAGS = ['JKS','J','JO','JK','JKC','JKG','JKB','JKV','JKQ','JX','JC','JKI','JKO','JKM','ETM']
preprocessed_text = []
for text in context:
morphs = mecab.pos(text, join=False)
nn_flag = False
v_flag = False
j_flag = False
for morph in morphs:
pos_tags = morph[1].split("+")
for pos_tag in pos_tags:
if not nn_flag and pos_tag in NN_TAGS:
nn_flag = True
if not v_flag and pos_tag in V_TAGS:
v_flag = True
if not j_flag and pos_tag in J_TAGS:
j_flag = True
if nn_flag and v_flag and j_flag:
preprocessed_text.append(text)
break
return preprocessed_text
post_processed_context = morphs
morph_filter(['아버지 가방']) # 불완전 문장을 리스트에 안들어감. 불완전 문장을 걸러내기위한 필터 역할을 하는 함수다.
-------------------------------------------------------------------------------------------------------------
# 결과
[]
------------------------------------------------------------------------------------------------------------
print(morphs)
------------------------------------------------------------------------------------------------------------
# 결과
[('아버지', 'NNG'), ('가', 'JKS'), ('방', 'NNG'), ('에', 'JKB'), ('들어가', 'VV'), ('신다', 'EP+EC')]
7-10. 문장 길이 기반 필터링
def min_max_filter(min_len, max_len, context):
preprocessed_text = []
for text in context:
if min_len < len(text) and len(text) < max_len:
# 내 코드: min_len <= len(text) <= max_len
preprocessed_text.append(text)
return preprocessed_text
post_processed_context = min_max_filter(20, 60, preprocessed_context)
preprocessed_context
------------------------------------------------------------------------------------------------
# 결과
['유튜브 채널을 만들었다.',
'‘씨리얼’ 만들고 8년 만이다.',
'이름은 ‘오뜨밀’이다.',
'제작진 평균연령이 30세를 조금 넘는다.',
'직군과 소속 부서도 다양하다.',
'뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다.',
'대부분 하던 일을 병행하는 반쪽 신세이긴 하지만. 뭐 어쨌든 그 견고하다는 언론사 내 국 간의 장벽을 뚫고 모이긴 모였다.',
'월~목 저녁 8시, 다들 지친 몸을 이끌고 귀가해 한창 재미난 콘텐츠를 볼 시간에 우리는 1시간 동안 오늘 본 뉴스에 대해서 떠든다.',
'그리고 동시에 라디오로 내보낸다.',
'뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’.',
'ⓒ오뜨밀 갈무리',
'생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다.',
'대답은 간단하다.',
'변함없이 그 자리에 존재하기 위해서다.',
'갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다.',
'적지 않은 호응도 받았다.',
'그러나 구성과 촬영, 편집, 그래픽까지 감당해야 하는 상황에서 시시때때로 터지는 이슈를 소화할 수는 없었다.',
'늦은 만큼 좀 더 중요한 것을 친절하게 담으려 했지만, 사람들이 우리를 필요로 할 때 그 자리에 서 있지는 못했다.',
'소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.',
'한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다.',
'다름',
'아닌 라디오 PD들이다.',
'그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다.',
'그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다.',
'나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다.',
'“나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.”',
'2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다.',
'‘가장 오래된 매체’에서 일하며 시대와 발맞추지 못하고 있다는 초조함은 ‘뉴미디어’ 이름을 달고 일하는 나의 초조함과 본질이 다르지 않았다.',
'결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.',
'‘내 친구들은 왜 뉴스를 안 볼까?’',
'모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까.',
'어리석은 질문인 걸 안다.',
'답이 정해져 있기 때문이다.',
'뉴스가 그들을 대상으로 하고 있지 않아서다.',
'뉴스 생산자가 상정하는 뉴스 소비자는, 뉴스가 종종 비판하는 ‘국민과 닮지 않은 국회의 얼굴’과 정확히 같다.',
'국회의원 평균연령은 54.9세.',
'거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준).',
'라디오·TV 시사 프로그램 그 어느 채널을 돌려도 오랜 세월 축적된 지식을 자랑하는 중년 남성이 나와서, 뚜렷한 정치관을 가지고 있는 자신의 또래 고관여층을 상정해 이야기한다.',
'우리는 뉴스 회피층이기 전에 뉴스 소외층이다.',
'매일같이 꾸준히 존재해보는 것',
'뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까?',
'공공재의 아주 일부라도 달리 쓸 수는 없을까?',
'젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다.',
'소셜 플랫폼만으로는 참 어렵다.',
'오감을 사로잡는 각양각색의 맞춤 콘텐츠로 채워지는 피드에, 균형감 있는 시사 콘텐츠는 갈수록 설 자리가 없음을 느낀다.',
'우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다.',
'장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다.',
'가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다.',
'아직은 좌충우돌 그 자체다.',
'하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다.',
'부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.',
'저작권자 시사IN 무단전재 및 재배포 금지',
'※ 기자 김사과() 취재 반하나()',
'뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]',
'이 기사는 임시 데이터임을 알립니다!',
'Pressian.com',
'☞ 이 기사는 문화 섹션으로 분류 했습니다 …',
'#기사 #문화 #라디오 #PD']
--------------------------------------------------------------------------------------------
for i, text in enumerate(post_processed_context):
print(i, text)
-----------------------------------------------------------------------------------------------
# 결과
0 제작진 평균연령이 30세를 조금 넘는다.
1 뉴미디어 PD, 라디오 PD, 아나운서, 전략 부서에 있는 이까지 모였다.
2 뉴미디어 PD, 라디오 PD, 아나운서 등이 모여 만든 유튜브 채널 ‘오뜨밀’.
3 생각보다 많은 사람이 내게 왜 라디오를 하느냐고 물었다.
4 변함없이 그 자리에 존재하기 위해서다.
5 갖가지 재료와 표현 방식을 통해 사회 현안을 쉽고 재미있게 다루는 콘텐츠로 씨리얼을 기획했다.
6 소셜 플랫폼의 변화에 따라, 내부 사정에 따라 바람 잘 날 없이 휘청이기도 했다.
7 한편 회사에는 나와 조금 다른 환경에서 일하는 동료들이 있다.
8 그들은 자나 깨나, 비가 오나 눈이 오나 같은 시간 같은 주파수에 존재한다.
9 그리고 지금 벌어지고 있는 일을, 사람들이 궁금해할 이야기를 전한다.
10 나는 그런 그들을 존경했지만 정작 그들은 고민이 많았다.
11 “나는 내 주변에서 아무도 안 볼 것 같은 뉴스를 만들어.”
12 2022 방송매체 이용 행태조사에 따르면, 라디오의 주 청취층은 40~60대다.
13 결국 중요한 이야기를 필요한 곳에 전하고 싶다는 마음이기 때문이다.
14 모든 젊은 뉴스 생산자의 가슴을 꽉 누르고 있는 질문이 아닐까.
15 뉴스가 그들을 대상으로 하고 있지 않아서다.
16 거기에 여성 비율은 19%에 불과하다(제21대 총선 당선자 기준).
17 우리는 뉴스 회피층이기 전에 뉴스 소외층이다.
18 뉴스 소비가 중장년층에 쏠려 있다 하여 그 눈높이, 그 취향으로만 만들면 되는 걸까?
19 공공재의 아주 일부라도 달리 쓸 수는 없을까?
20 젊은 층을 대상으로 정치·사회 이슈 콘텐츠를 만들어 소셜 플랫폼에 내보내는 일을 8년간 해봤더니 알겠다.
21 우리가 생각한 방법은 결국 필요할 때마다 찾아올 수 있도록, 매일같이 꾸준히 존재해보는 것이다.
22 장벽을 허물고 서로의 장점을 흡수하며, 전파라는 레거시와 뉴미디어의 노하우를 합쳐보는 것이다.
23 가장 오래된 미디어와 뉴미디어의 만남은 그렇게 이루어졌다.
24 하지만 다들 일할 맛이 난다고 하니, 그 마음 믿고 셀프 격려를 해본다.
25 부디 이 시도로 더 많은 젊고 서툴고 다양한 얼굴이 마이크를 갖게 되면 좋겠다.
26 저작권자 시사IN 무단전재 및 재배포 금지
27 뉴미디어 PD가 라디오를 하는 이유 [미디어 리터러시]
28 ☞ 이 기사는 문화 섹션으로 분류 했습니다 …
-----------------------------------------------------------------------------------------------
7-11. 토큰화
from tensorflow.keras.preprocessing.text import Tokenizer
# 파이토치, 텐서플로두: 머신러닝, 딥러닝 모델을 만들거나 수정하기 편하게 해주는 모듈.
# 파이토치 -> nn 클래스
# 텐서플로우 -> nn같은 클래스가 없어서 직접 다 만들어야 해서 불편함(모델을 만드는 모듈인 keras를 가져다 썼었음)
# 버전 2로 올라가면서 문법을 많이 개량해서 keras가 텐서플로우 안으로 들어옴
tokenizer = Tokenizer()
tokenizer.fit_on_texts(post_processed_context)
tokenizer
------------------------------------------------------------------------------------------------
# 결과
<keras.preprocessing.text.Tokenizer at 0x7f5092de6d10>
------------------------------------------------------------------------------------------------
word2idx = tokenizer.word_index
# word2idx
idx2word = {value : key for key, value in word2idx.items()}
# idx2word
encoded = tokenizer.texts_to_sequences(post_processed_context)
encoded
---------------------------------------------------------------------------------------------
# 결과
[[27, 28, 29, 7, 30],
[4, 1, 8, 1, 9, 31, 32, 5, 33, 34],
[4, 1, 8, 1, 9, 35, 36, 37, 38, 39, 40],
[41, 10, 42, 43, 44, 11, 45, 46],
[47, 2, 48, 49, 50],
[51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63],
[12, 64, 65, 13, 66, 67, 13, 68, 69, 70, 71, 72, 73],
[74, 75, 76, 7, 77, 78, 79, 80, 14],
[15, 81, 82, 83, 16, 84, 16, 6, 85, 6, 86, 87],
[88, 89, 90, 5, 17, 91, 92, 18, 93],
[94, 95, 19, 96, 97, 15, 98, 99],
[100, 101, 102, 103, 104, 105, 106, 6, 107, 20, 108],
[109, 110, 111, 112, 113, 114, 115, 116, 117, 118],
[21, 119, 18, 120, 121, 122, 123, 124, 125],
[126, 22, 3, 127, 128, 129, 130, 5, 131, 132],
[133, 19, 23, 134, 135, 136],
[137, 138, 139, 140, 141, 142, 143, 144, 145, 146],
[147, 3, 148, 149, 3, 150],
[3, 151, 152, 153, 14, 154, 2, 155, 2, 156, 157, 158, 159],
[160, 161, 162, 163, 164, 165, 166],
[22, 167, 23, 168, 169, 170, 20, 12, 171, 172, 17, 173, 174, 175],
[176, 177, 178, 21, 179, 180, 181, 182, 183, 184, 185, 186, 24],
[187, 188, 189, 190, 191, 192, 193, 25, 194, 195, 24],
[196, 197, 198, 25, 199, 200, 201],
[202, 203, 204, 205, 206, 207, 2, 208, 209, 210, 211, 212],
[213, 26, 214, 215, 10, 216, 217, 218, 219, 220, 221, 222, 223],
[224, 225, 226, 227, 228, 229],
[4, 230, 11, 231, 232, 233, 234],
[235, 26, 236, 237, 238, 239, 240, 241]]
--------------------------------------------------------------------------------------------
vocab_size = len(word2idx)+1
print(f'단어 사전의 크기: {vocab_size}')
---------------------------------------------
# 결과
단어 사전의 크기: 242
---------------------------------------------
# 첫번쨰 줄의 단어 인덱스 번호 보기
print(encoded[0])
----------------------------------------------
# 결과
[27, 28, 29, 7, 30]
728x90
반응형
'자연어 처리' 카테고리의 다른 글
[ 자연어 처리 ] Seq2Seq (1) | 2023.09.12 |
---|---|
[ 자연어 처리 ] 임베딩 시각화 (0) | 2023.09.12 |
[ 자연어 처리 ] 워드 임베딩 (0) | 2023.09.12 |
[ 자연어 처리 ] 임베딩 (0) | 2023.09.12 |
[ 자연어 처리 ] 자연어처리 개요 (0) | 2023.09.11 |