심심해서 하는 블로그 :: 심심해서 하는 블로그



이미 에버노트 앱을 통해서 티스토리에 글을 업로드 할 수 있지만,

에버노트는 마크다운을 지원하지 않아 글을 이쁘게 작성하기가 어려움이 있다.

(사실 에버노트나 티스토리에서 마크다운을 지원하기만 했어도 이런 뻘짓은 안했다)

Bear 앱 유료 구독에는 Html Export 기능이 있는데 이 기능을 사용해서 티스토리 글을 작성하는 삽질의 과정을 소개하고자 합니다.


한 달동안 써본 Bear App 좋은 점

이 글도 Bear 앱으로 작성하였습니다.


베어 앱을 한 달 가까히 쓰면서 느낀 장점들을 간단하게 소개하겠습니다.

오늘은 베어 앱을 활용해서 티스토리 블로그를 작성해보는 것이 목적이니까 간단하게 소개하고 넘어 가고, 계속 사용하면서 느낀 점들을 소개하는 시간을 가져 보도록 하겠습니다.


  1. 마크 다운 문법을 지원한다.
  2. 태그를 지원하여 검색하기가 편하다.
  3. 코드 하이라이팅을 지원한다.
  4. 이쁘다. 마크다운이 적용된 서식들이 이뻐서 글을 작성하는 재미가 있었다.
  5. 몇몇의 마크 다운을 몰라도 단축키가 잘 구성되어 있어서 쓰는데 문제는 없었다.
  6. 유료 버전을 사면 추가적인 테마와 다른 애플 기기랑 연동도 가능합니다.

(물론 필자는 아이패드 뿐이라 해당사항은 없습니다.)


테스트 : 코드 텍스트

import pandas as pd
with open("myfile.txt") as f:
	print(f.readlines())


코드 텍스트의 하이라이팅은 나름 만족스럽네요.


문제점 1 : 사진

HTML 로 Export를 했을 때 문제점은 바로 사진을 함께 Export가 안된다는 점.

아이패드에서 티스토리로 사진을 깔끔하게 올리는 방법은 에버노트를 거쳐서 올리는 방법이 현재로써는 최선으로 느껴진다.


현재는 초안을 아이패드로 작성을 하고 PC에서 사진을 넣어주는 방법을 우선적으로 사용하였습니다.

사진을 넣는 방법을 조금 더 고민을 한 후에 추가하겠습니다.


문제점 2 : 전역 Style

HTML 스타일을 변경하는데 이 스타일이 지역적으로 변경되는 것이 아니라 전역으로 변경되는 문제점이 있었다.

<div> 클래스로 본문이 감싸져 있긴 하지만, CSS Selector 들이 클래스 내부의 요소들이 아닌 전역으로 설정되어 있어서, 블로그 페이지의 다른 요소들에도 스타일이 영향을 받는 것을 확안을 하였다.



나름의 프로세스를 만들어 보았다.

  1. 우선 전역으로 설정된 CSS를 <div> 클래스에 상속하는 태그들에 대하여만 스타일이 적용되게끔 Selector를 변경한 CSS 파일을 만들었습니다.

그리고 해당 CSS 파일을 티스토리 스킨에 반영하는 작업을 수행하였습니다.


bear_markdown.css




스킨 편집화면에서 위의 CSS 파일을 넣어 줍니다.

그리고 HTML 편집 화면에서 아래의 코드를 추가로 넣어줍니다.

<link href="./images/bear_markdown.css" rel="stylesheet">


이 작업은 딱 한 번만 수행하면 되는 작업이라 귀찮지만 조금 참고 진행해보았습니다.


  1. 베어에서 HTML로 Export를 합니다.

어떤 곳으로 보낼 것인가 선택을 하게 되는데 이 때 HTML 코드를 복사하는 기능을 사용하는 겁니다.


HTML로 내보내는 과정

작성하던 글에서 i버튼을 누릅니다.


가장 아래 HTML을 선택합니다.


복사하기를 누릅니다. 




  1. 아이패드에서 티스토리에 접속을 하여 새로운 글을 작성합니다.

이 때 에디터에 HTML 체크 부분을 체크한 후 앞서 복사한 HTML 코드들을 붙여 넣기를 합니다.

붙여넣으면 <HTML>, <Head> 와 같이 글과 무관한 태그들이 붙어 있습니다.




불필요한 이 태그들을 지워주는 작업이 필요한데, Tistory 에디터의 HTML 체크를 해제하였다가 다시 체크를 하면 불필요한 태그들이 사라져 있는 것을 볼 수 있어요.

내부적으로 제거를 해주는 스크립트가 포함된 에디터 덕분에 일은 조금 덜었네요.





  1. 제일 마지막 <sytle> 태그 부분을 모두 제거합니다.

앞서 생성한 CSS 파일 덕분에 해당 부분이 없어도 스타일이 적용되어 올라갑니다.




마치며..

베어에서 글을 작성하는 과정들을 소개드렸는데요.

HTML로 내보내는 기능이 월 구독료 1500원을 지불해야 사용이 가능한 기능이라 사용할지 말지 고민이 될 수도 있겠습니다.

저 역시 고민을 했지만 자기 계발의 결과를 메모하기 위한 용도로 이 앱을 사용하는 중이며, 그 내용을 기반으로 블로그를 작성할 생각이라 1500원은 투자다 생각하고 사용할 예정입니다.

물론 사진을 직접 올리지 못하는 단점이 있지만 계속 삽질하면서 프로세스를 확장해 나갈 계획이다.

부디 티스토리 에디터에서 마크다운을 부디 지원해주어서 이런 삽질 없이 블로그를 작성할 수 있었으면 좋겠습니다.


공감 버튼은 작성자에게 큰 힘이 됩니다


,

Github > https://github.com/ssooni/data_mining_practice

- 자세한 소스코드는 Github에 올렸습니다.

- 데이터 파일도 올려 드리고 싶지만 실제 카카오톡 대화내용이라 일부분만 올렸습니다.

- 소스코드는 짬짬히 업로드할 예정입니다.




클러스터링

비지도학습의 대표 주자인 클러스터링은 각각의 노드들의 군집들을 산출해줍니다.

그 중에서 가장 간단한 게 K-means 알고리즘이고, 때마침 학교에서 공부한 적이 있으니까 해봐야겠다는 생각을 했습니다. 

하지만 이 알고리즘은 클러스터가 몇 개 나올것이다는 것을 제가 직접 설정해야 하는 점이 마음에 안들었습니다.

지금 Input으로 들어오는 벡터는 300차원이라 어디에 군집에 형성되어 있는지 짐작하기 어렵기 때문에 K-means 알고리즘은 사용하기 어렵다고 판단하였습니다.

저는 군집 갯수를 사전에 설정하지 않아도 군집을 산출해주는 알고리즘이 필요했고, 그 결과 DBSCAN 알고리즘을 선정하였습니다.


DBSCAN 

DBSCAN은 밀도 기반의 클러스터링 기법입니다.

DBSCAN의 클러스터는 아래 두 가지 조건에 의해 생성됩니다.


1. 이웃하는 점들의 간격이 사용자가 정한 거리(eps) 이내에 있는 경우를 산출

2. 군집에 포함하는 점들이 최소 클러스터 원소 수(min_samples)보다 많은 경우를 산출합니다.

min_sample = 3 인 경우


Core Point는 1번 조건과 2번 조건을 모두 충족하는 Point를 의미합니다. (빨간 점) 

Non-Core Point는 1번 조건을 만족하지만 2번 조건을 만족하지 못하는 Point입니다. (파란 점)

Non-Core Point는 Cluster를 이루는 경계 점 역할을 합니다.

Noise는 2개의 조건을 모두 만족하지 않은 경우로 클러스터를 구성하지 않습니다. (녹색 점)


이런 방법으로 클러스터를 찾는 것의 장점은 클러스터의 갯수를 지정할 필요 없다원형이 아닌 클러스터도 추출이 가능하다는 점입니다.

다른 알고리즘은 클러스터의 중심점을 이동하면서 클러스터 중심점 내부에 몇개의 점이 들어 있는 가에 집중되어 있기 때문에 클러스터의 모양이 필연적으로 원형으로 형성됩니다.

하지만 DBSCAN은 각각 개별 포인트 간의 거리를 측정하면서 Non-Core Point에 의해 클러스터의 경계가 형성되기 때문에 원형이 아닌  모양의 클러스터도 형성이 가능하다는 점이 장점입니다.


하지만 데이터에 대한 충분한 이해도를 가지고 있지 않는다면 eps와 min_points 값을 정하는 것이 어려운 것이 단점입니다.

다른 알고리즘은 단순히 10개의 분류를 만들어 달라 하면 10개를 만들어 주기 때문에 데이터 내부의 값들을 이해하지 않아도 충분히 클러스터를 만들어 낼 수 있습니다.

하지만 DBSCAN은 적어도 포인트 간이 이루는 최대 거리가 얼마인지 정도는 파악해야 유효한 클러스터를 만들어 낼 수 있습니다.


Word Vector Clustering

워드 백터를 클러스터링하면 어떤 결과가 나올까? 하는 의문에서 시작하였습니다.

모든 코드는 GitHub를 참조바랍니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from sklearn.cluster import DBSCAN
from gensim.models import Word2Vec
 
def cluster(eps, min_sample):
    # Word Vector를 Load 합니다.
    model = Word2Vec.load("./result/embedding.model")
 
    word_vector = model.wv.vectors
    match_index = model.wv.index2word
    model.init_sims(replace=True)
 
    # 두 글자이상 한글인 경우만 사용
    han = re.compile(r"[가-힣]{2,}")
 
    # DBSCAN 알고리즘 적용
    dbscan = DBSCAN(eps=eps, min_samples=min_sample)
    clusters = dbscan.fit_predict(word_vector)
 
    df = pd.DataFrame(clusters, columns=["cluster"], index=match_index).reset_index()
    df.columns = ["word""cluster"]
    print(df.head())
 
    # 한글만 필터링 처리
    df = df[df["word"].apply(lambda x: len(han.findall(x)) > 0)]
 
    # 노이즈 포인트 제거
    df = df[df["cluster"!= -1]
 
    print(df.groupby(["cluster"]).count())
 
    df.to_excel(pd.ExcelWriter("./result/cluster.xlsx"), index=False)
 
cs


line 15-16

본격적으로 DBSCAN 알고리즘을 적용하는 부분입니다.

eps와 min_samples를 정하여 넣어준 후 line 16에서 word vector를 클러스터링 해주었습니다.

fit_predict 함수를 사용하면 클러스터링된 결과를 리스트로 산출해줍니다.

이 때 -1은 노이즈 포인트를 의미합니다.


line 23-27

클러스터링 후 데이터를 일부 처리하였습니다.

2글자 이상의 한글만 유효한 결과로 선정하였으며, 노이즈 포인트도 제거 하였습니다.


이 프로그램을 실행하면 아주 허접한 그래프를 보여주었습니다.


클러스터링을 했을 때 종결 어미나 일자, 직책 같은 정보를 담고 있는 클러스터를 보고 신기했습니다.

뭔가 클러스터링을 하면 전체적인 주제를 알 수 있지 않을까? 생각 했지만 아쉽게도 그런 정보는 나타나질 않았네요.

찾아 보니까 LDA라는 걸 사용하면, 토픽 모델링이 가능하다고 하는데 다음번엔 그것을 시도해볼까합니다.

 

긴 글 읽어주셔서 감사합니다.

공감 버튼은 작성자에게 큰 동기부여가 됩니다.


,

연극의 줄거리보다 연극이 재밌는지 궁금한 분들을 위한 선 요약

1. 추리와 스릴러 장르다운 긴장감있는 사건 전개

2. 놀래키는 장면이 많지 않아서 좋았습니다.

3. 자리는 맨 앞 TV 있는 쪽 좌석 추천

4. 연인 친구들과 가볍게 즐기기 좋은 연극입니다.




감자님은 스릴러, 추리 장르를 좋아하고 저는 로맨스 코미디를 좋아하는 편입니다.

물론 좋아하는 장르는 그 연극표를 구했을 때 볼 수 있는 것이고, 또 감자님이 당첨이 되어서 스릴러 장르의 크리미널 시즌 4를 관람하게 되었습니다.


작은 규모의 연극 극장이지만 소품들이 제법 잘 구성되어 있습니다.

지정석이 아닌 자유석으로 추천드리는 자리는 앞 TV가 있는 쪽 좌석을 추천드립니다. 

배우들이 누워있거나 TV로 메세지를 전달하는 경우가 있는데, 반대쪽에서는 잘 보이지가 않아서 답답했습니다.

아 그리고 어떤 자리는 쓰레기통 역할을 할 수도 있습니다.


연극이 추리극의 성격을 가지고 있어서 전체적인 줄거리 소개는 간단하게 하고 넘어 가겠습니다.




전체 줄거리

어느 날 산장에 아무 이유 없이 4명이 감금됩니다. 

자신이 갇힌 이유도 누가 자신을 감금시켰는지도 알 수 없습니다.

서로 간의 공통점을 확인하려는 과정에서 4명 모두 하나의 사건에 연루되어 있다는 것을 알게 됩니다.

방 안에 나가기 위한 단서를 찾지만, 범인은 끊임없이 시간으로 압박을 가합니다.

과연 그들은 무사히 산장을 탈출하게 될까요?


감상평

추리하는 것을 좋아하고 어떤 게임에서 숨어있는 것을 찾는 것을 좋아한다면 충분히 재미있을 거라고 생각합니다.

우려했던 것과는 달리 놀래키는 장면이 적었습니다. 


4명의 배우분들이 처음부터 끝까지 흥분 상태로 극을 진행합니다. 

누군가가 감금했고 시간이 줄어드는 것을 보면서 마음을 진정할 용자는 흔치않겠지만 매순간순간 흥분을 해서 정신이 없긴 했습니다.


그리고 연극이 끝나면 배우분들과 포토타임도 준비되어 있습니다.

사진으로 추억을 간직하고자 하는 분들에게는 좋은 장점이라 생각합니다.

연인과 친구들과 가볍게 즐기기 괜찮은 연극이라 생각합니다.


긴 글 읽어 주셔서 감사합니다.

공감 버튼은 작성자에게 큰 동기부여가 됩니다. 

'눈누난냐 > 연극' 카테고리의 다른 글

[대학로 연극] 기묘여행 리뷰  (2) 2018.12.16
[대학로 연극] 러브 스코어 관람 후기  (6) 2018.09.09
,