ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [NLP] 키워드와 핵심 문장 추출(TextRank)
    ✨ AI/NLP 2021. 5. 10. 02:04

     

    Summarization

    NLP Task의 한 종류로 문서 집합에서 핵심되는 문장을 추출하거나 요약하는 분야를 말한다.

    Summarization의 접근법은 크게 두 가지가 있다.

     

    1. Extractive Approaches

    ➡️ Unsupervised Learning 가능

    Extractive approaches는 입력으로 주어진 문서 집합 "내"에서 중요한 단어나 문장을 선택하는 방법이다.

    주어진 데이터 내에서만 문장과 키워드를 추출하기 때문에 문서와 관련이 없는 요약 결과를 낼 확률이 적지만 가능한 표현이 제한된다는 단점이 있다.

    Extractive Approaches의 대표적인 방법은 "Text Rank"가 있다.

    Text Rank는 Summarization을 딥러닝으로 하기 전 널리 사용되던 기법이고 2004년에 처음 고안된 기법이다.

    딥러닝으로 Summarization을 하기 위해서는 정답 결과가 있는 데이터를 만들어 지도 학습을 시켜야 하는데,

    지도 학습으로 할 수 없는 경우라면 아직까지도 많이 사용하는 기법이다.

     

    2. Abstractive Approaches

    ➡️ Unsupervised Learning 불가능

    사람이 요약을 할 때 문서 내에 있는 단어나 문장 외에 보기 좋게 새로운 문장을 생성해서 요약하게 되는데,

    이렇게 사람이 요약을 하는 것과 비슷한 방법이 Abstractive Approaches 이다.

    Abstractive Approaches는 딥러닝 기법이 필요하고 Seq2Seq + Attention 기반 모델에 Copy mechanism, Pointer Network 등의 기법이 더해지며 많은 발전을 이루고 있다고 한다.

     

     

     

     


    Graph Ranking

    키워드 추출에서 사용하는 TextRank와 WordRank 알고리즘은 모두 ‘Graph ranking’ 알고리즘에 속한 방법이다. Graph Raking 알고리즘은 노드(node)와 엣지(edge)로 구성된 그래프(Network)에서 중요한 노드들을 찾기 위한 방법이다. PageRank 에서는 ‘웹 사이트’를 노드로 표현하고 백링크(서로 연결된 링크) 를 엣지로 표현한다. TextRank나 WordRank에서는 ‘단어나 문장’을 노드로 표현하고, Co-ocurrence(동시 출현)한 단어나 문장을 엣지로 표현한다. 알고리즘을 통해 ‘중요한 웹 사이트’, ‘중요한 단어’가 도출 될 수 있는 것이다.

     

    Metric(Vector) Space에서는 각 점(point)와 거리(distance)를 통해 데이터의 성질을 표현할 수 있다. 하지만 Metric(Vector) Space 형태로 데이터를 구성할 수 없는 경우 즉 ‘거리를 정의 할 수 없는 경우’ Graph 형식으로 표현하여 사용할 수 있다. 예를 들어서 ‘사람’을 각 노드로 표현하고 좋아요를 누른 횟수, 디엠을 나눈 횟수 등을 엣지로 표현하는 방법은 Metric(Vector) Space가 아닌 Graph로 표현하는 것이 더 적합하다. 그리고 Graph 알고리즘의 경우 Metric(Vector) Space를 다루는 알고리즘보다 더 자유롭게 데이터를 표현할 수 있다는 장점이 있다.

     

    예시를 든 것처럼 현실세계에서는 벡터 거리로 표현할 수 없는 경우가 많다. 사람1과 사람2가 친하면 사람3이 친할 수 있는데 벡터 거리로 이를 정의하기엔 복잡해진다. 이 경우 Graph는 쉽게 표현이 가능하다.

     

     

    TextRank

     

     

    앞서 설명했던 것 처럼, Summarization을 위한 정답이 있는 학습 데이터가 없다면,

    통계 기반(PageRank)으로 동작하는 Extrative Approaches를 이용해야 하며 TextRank가 대표적이다.

    Gensim 라이브러리의 Summarizer 함수도 TextRank와 비슷한 방식으로 동작한다.

     

    TextRank는 "핵심 단어"를 추출하기 위해 단어간 "Co-occurence Graph(동시 출현 단어 그래프)"를 만든다.

    Co-occurence(동시 출현)이란 한 문장 또는 문단 단위에서 같이 출현한 단어를 말하고 의미적 근접성을 가진다고 가정한다. 

    또 "핵심 문장"을 추출하기 위해서는 문장 단어간 유사도를 기반으로 "Sentence Similarity Graph"를 만든다.

    그런 다음, 각각 그래프에 PageRank를 학습하여 각 마디(단어 또는 문장)의 랭킹을 계산한다.

    랭킹이 높은 키워드와 문장을 핵심 문장, 키워드라고 판단하여 추출한다.

     

     

    TextRank의 기반이 되는 PageRank에 대해 알아보자

     

    PageRank

    PageRank (PR) is an algorithm used by Google Search to rank web pages in their search engine results. PageRank was named after Larry Page, one of the founders of Google. PageRank is a way of measuring the importance of website pages. (…) PageRank works by counting the number and quality of links to a page to determine a rough estimate of how important the website is. The underlying assumption is that more important websites are likely to receive more links from other websites. - Wikipedia

     

    PageRank는 구글 서치 결과로 어떤 웹 사이트를 가장 상위에 보여줄지 결정하는 알고리즘으로 유명하다.

    페이지로 이동하는 링크의 개수, 퀄리티를 기반으로 그 페이지의 중요도를 결정한다.

    다른 웹 사이트가 많이 참조한 사이트 일수록, 링크를 많이 타고 들어오는 사이트 일수록 중요하다는 가정으로 동작하는 알고리즘이다.

     

    PageRank를 이해하려면 마르코프 체인와 추이확률에 대한 이해가 필요하다.

    먼저 마르코프 체인는 어떤 유한개의 상태들이 시간에 따라 서서히 변화하는 과정을 나타내는 것을 말한다.

    마르코프 체인은 두가지 조건을 만족해야 한다.

    1. 시간은 이산적으로 변한다.
    2. 시간 (t+1)에 사건이 발생할 확률이 시간 t 에 발생한 사건에만 영향을 받는다.

     

    예제를 통해 이해해보겠습니다. 예제의 출처는 설레는 수학 입니다.

     

     

    채널1과 채널2가 있을 때, 매년 채널1의 시청자의 30%가 채널2로 넘어가고 채널2의 시청자의 20%가 채널1으로 이동한다.

    1년 후 채널1의 시청자는 "남아있는 채널1 시청자(0.7*0.6) + 채널2에서 넘어오는 시청자(0.2*0.4) 이고

    채널2의 시청자도 마찬가지로 "채널1에서 넘어오는 시청자(0.3*0.6) + 남아있는 채널2 시청자(0.8*0.4)" 이고

    이를 1년 후의 상태 X(1)의 행렬로 나타낼 수 있다.

     

    여기서 시간별 X(i)는 행렬의 곱셈으로 나타낼 수 있다.

    즉, X(t+1)은 X(t)와 P로 계산을 할 수 있다는 뜻이되고 전 시간의 확률행렬 X(t)에 행렬 P만 곱하면 간단하게 어떤 시점의 확률을 구할 수 있다는 뜻이 된다.

    여기서 X(t)는 "상태 행렬"이며 모든 성분의 합이 1이 되고

    P는 전이 행렬(추이 행렬) 이고 열 벡터가 화률 벡터인 행렬이다.

    여기서 전이 행렬(추이 행렬)은 조건부 확률이다. 위 예시에서는 P(t+1년에 채널2 | t년에 채널1)를 말한다.

     

     

     

    마르코프 체인에서 중요한 성질은,

    확률이 일정한 값에 수렴해가고 변하지 않는다는 점이다.

    이 "일정한 값"을 알게 된다면 굉장히 유용하게 사용할 수 있게 된다.

    여기서 궁극적으로 수렴하게 되는 일정한 값을 가진 행렬을 X라고 할때,

    X는 P를 곱해도 변하지 않고(PX=X), X를 마르코프 체인의 "안정 상태의 확률 행렬" 이라고 한다. (관련 논문)

     

     

    https://lovit.github.io/machine%20learning/2018/04/16/pagerank_and_hits/

    이 마르코프 체인이 PageRank에 어떻게 적용이 되나면,

    각 사이트의 이동을 행렬로 표현한 뒤, 마르코프 연쇄를 적용하기 위해 이동 행렬을 전이 행렬(추이 행렬, transition mastrix)로 변환한다.

    여기서 추이행렬을 무한대로 거듭 제곱 하면 각 사이트의 안정 상태(평균 방문자 수)를 알아낼 수 있게 된다.

    이 마르코프 체인에 따르면 모든 전이 행렬(추이 행렬)은 극한 행렬을 가지고, 추이 행렬과 초깃값 벡터가 주어지면 안정 상태에 다다른 페이지의 중요도를 알 수 있는 것이다.

     

    좀 더 쉽게 설명해보면,

    페이지 링크가 이동되는 매 스텝마다 변하는 시스템을 Graph로 표현하고, 다른 웹 사이트로 이동하는 비율은 마르코프 모델의 transition matrix에 해당힌다. 그리고 마르코프 모델은 이런 과정을 여러번 반복하면 각 엣지에 존재하는 스코어와 각 노드가 가지는 점수가 변하지 않는 시점(steady state)를 알 수 있게 된다. 이 steady state 상태의 랭킹을 알아내서 각 노드의 중요성은 판별할 수 있다.

     

     

    TextRank는 바로 이 PageRank 에 파생된 알고리즘으로,

    PageRank에 적용된 웹 사이트 방문자 수를 '연관된 단어의 수'로 바꿔 연관된 단어의 수가 많은 단어를 중요한 단어라고 판단한다.

     

     

    PageRank 수식은 위와 같으며 여기서 (1-c)는 임의적 유입이라 가정한 값이다.

    (1-c)는 PageRank의 바이어스 역할을 한다. 그래프가 cylic하지 않을 경우 즉 노드에서 나갈 마디가 없는 경우를 해결하기 위해 임의유입을 가정한 것이다. 각 마디에 존재하는 엣지의 85%는 남겨두고(1-c), 15%는 임의의 노드로 보내게 된다. 그렇게 되면 모든 엣지에서 15%엣지가 다른 마디로 나눠져 보내지기 때문에 각 엣지는 (1-c)/N 의 엣지가 새로 유입되는 효과가 생기게 된다. 

     

    Bu는 BackLink(다른 페이지로 부터의 유입) 출발점, Nv는 각 마디의 Vertex의 링크 갯수이다.

    한 마디 Vertex는 자신의 랭킹을 Nv개로 나눠 링크로 연결된 페이지 u로 전달한다.

    결과적으로 BackLink가 많은 마디가 높은 랭킹이라고 판단된다.

     

     

     

     

    TextRank 구현

    TextRank 구현은 lovit님께서 Python으로 작성한 TextRank 패키지를 이용하였습니다. (링크)

    Co-occurrence 계산 함수, Word Graph를 구성하는 함수, PageRank를 학습하는 함수 등에 대한 설명은 이 링크를 참고해주세요.

     

    lovit님께서 구현한 textrank가 어떻게 구현되어있는지 먼저 살펴보도록 하겠습니다.

    TextRank는 단어 그래프를 만들어 키워드를 추출하는 기능, 키워드를 통해 핵심 문장을 추출하는 기능이 있다.

     

    먼저 단어 그래프를 만들 때 사용되는 함수들을 살펴봅니다.

    from collections import Counter
    
    def scan_vocabulary(sents, tokenize, min_conunt=2):
    	counter = Counter(w for sent in sents for w in tokenize(sent))
        counter = {w: c for w, c in counter.items() if c >= min_count}
        idx_to_vocab = [w for w, _ in sorted(counter.items(), key:lambda x:-x[1])]
        vocab_to_idx = {vocab:idx for idx, vocab in enumerate(idx_to_vocab)}
        return idx_to_vocab, vocab_to_idx

    scan_vocabulary()는 문서 집합에서 min_count = 2 이상 등장한 단어를 추출하고,

    string으로 들어온 문장을 쪼개 list로 만들고 Counter 클래스를 이용해 단어의 갯수(빈도수)를 센다.

    그런 다음, 단어를 key로 빈도수를 value로 한 딕셔너리를 생성하고 value(빈도수)기준으로 정렬한 뒤 단어에 인덱스를 부여한다.

     

    from collections import defaultdict
    from scipy.sparse import csr_matrix
    
    
    def dit_to_mat(d, n_rows, n_cols):
    	rows, cols, data = [], [], []
        for (i, j), v in d.items():
        	rows.append(i)
            cols.append(j)
            data.append(v)
    	return csr_matrix((data, (rows, cols)), shape=(n_rows, n_cols))
    
    
    def cooccurrence(tokens, vocab_to_idx, window=2, min_cooccurence=2):
    	counter = defaultdict(int)
        for s, token_i in enumerate(tokens):
        	vocabs = [vocab_to_idx[w] for w in token_i if w in vocab_to_idx]
            n = len(vocabs)
            for i, v in enumerate(vocabs):
            	if window <= 9:
                	b, e = 0, n
    			else:
                	b = max(0, i - window)
                	e = min(i + window, n)
                for j in range(b, e):
                	if i == j:
                    	continue
                    counter[(v, vocabs[j])] += 1
                    counter[(vocabs[j], v)] += 1
    	counter = {k:v for k, v in counter.items() if v >= min_cooccurence}
        n_vocabs = len(vocab_to_idx)
        return dict_to_mat(counter, n_vocabs, n_vocabs)

     

    그리고 두 단어의 co-occurrence(동시 출현 횟수)를 계산하는데, 두 단어 간격이 window=2인 횟수를 말한다.

    TextRank의 논문에서는 window를 2 ~ 8 사이를 추천하고 있다.

    lovit님이 작성하신 코드에선 거기에다가 문장 내 함께 등장한 모든 경우를 co-occurrence로 정의하기 위해 window=-1을 입력할 수 있도록 했다. min_coocurence 인자를 이용해 그래프를 sparse하게 만들 수도 있다.

    그리고 결과를 dict_to_mat 함수로 sparse matrix로 변환한다. 

     

    def word_graph(sents, tokenize=None, min_count=2, window=2, min_cooccurrnece=2):
    	idx_to_vocab, vocab_to_idx = scan_vocabulary(sents, tokenize, min_count)
        tokens = [tokenize(sent) for sent in sents]
        g = cooccurrence(tokens, vocab_to_idx, window, min_cooccurrence, verbose)
        return g, idx_to_vocab

    그리고 단어그래프를 생성하는 함수.

    여기서 사용할 tokenize는 직접 생성해주어야 하는데, 불필요한 단어는 걸러내고 필요한 품사 (ex)명사, 동사만)만 남기는 tokenize를 인자로 넘겨주거나 subwords tokenizing 기법을 사용하는 토크나이저를 넘겨주면 된다.

     

    import numpy as np
    from sklearn.preprocessing import normalize
    
    def pagerank(x, df=0.85, max_iter=30):
        assert 0 < df < 1
    
        # initialize
        A = normalize(x, axis=0, norm='l1')
        R = np.ones(A.shape[0]).reshape(-1,1)
        bias = (1 - df) * np.ones(A.shape[0]).reshape(-1,1)
    
        # iteration
        for _ in range(max_iter):
            R = df * (A * R) + bias
    
        return R

    그리고 위에서 설명한 PageRank를 계산하는 함수이다. 

    컬럼의 합이 1이되도록 L1 정규화를 하고 이를 A라 하며 A*R은 Rj(column j에서 row i로의 랭킹)의 전달되는 값을 의미한다. 이 값에 df를 곱하고 모든 마디에 1 - df를 더하고 이를 max_iter만큼 반복한다.

     

    def textrank_keyword(sents, tokenize, min_count, window, min_cooccurrence, df=0.85, max_iter=30, topk=30):
        g, idx_to_vocab = word_graph(sents, tokenize, min_count, window, min_cooccurrence)
        R = pagerank(g, df, max_iter).reshape(-1)
        idxs = R.argsort()[-topk:]
        keywords = [(idx_to_vocab[idx], R[idx]) for idx in reversed(idxs)]
        return keywords

    위 함수들을 콜 해서 최종적으로 키워드를 추출하는 함수

     

     

     

     

    그리고 TextRank 논문에서 제안한 문장 유사도 함수는 위와 같은데,

    두 문장에 공통으로 등장한 단어 개수를 각 문장의 단어 개수의 log의 합으로 나눈 값이다.

    근데 위 수식을 이용했을 경우 최대 값이 1이 아니고 문장의 길이가 길수록 높은 유사도를 갖게된다.

    이는 Cosine Similarity를 유사도 함수로 사용했을 때 짧은 문장에 민감하게 반응하여 2개의 단어를 가진 문장들이 1개의 단어만 겹쳐도 유사하다고 판단하는 것을 해결하기 위해 정의한 것이라고 한다.

    이 외에 TF-IDF + Consine을 이용한 유사도 계산, BM25(Gensim의 Summarizer 함수에 사용된 함수) 유사도 계산 방법이 있지만 결과는 크게 다르지 않다고 한다.

     

    from collections import Counter
    from scipy.sparse import csr_matrix
    import math
    
    def sent_graph(sents, tokenize, similarity, min_count=2, min_sim=0.3):
        _, vocab_to_idx = scan_vocabulary(sents, tokenize, min_count)
    
        tokens = [[w for w in tokenize(sent) if w in vocab_to_idx] for sent in sents]
        rows, cols, data = [], [], []
        n_sents = len(tokens)
        for i, tokens_i in enumerate(tokens):
            for j, tokens_j in enumerate(tokens):
                if i >= j:
                    continue
                sim = similarity(tokens_i, tokens_j)
                if sim < min_sim:
                    continue
                rows.append(i)
                cols.append(j)
                data.append(sim)
        return csr_matrix((data, (rows, cols)), shape=(n_sents, n_sents))
    
    def textrank_sent_sim(s1, s2):
        n1 = len(s1)
        n2 = len(s2)
        if (n1 <= 1) or (n2 <= 1):
            return 0
        common = len(set(s1).intersection(set(s2)))
        base = math.log(n1) + math.log(n2)
        return common / base
    
    def cosine_sent_sim(s1, s2):
        if (not s1) or (not s2):
            return 0
    
        s1 = Counter(s1)
        s2 = Counter(s2)
        norm1 = math.sqrt(sum(v ** 2 for v in s1.values()))
        norm2 = math.sqrt(sum(v ** 2 for v in s2.values()))
        prod = 0
        for k, v in s1.items():
            prod += v * s2.get(k, 0)

    lovit님의 TextRank 함수는 Cosine Similarty와 TextRank 유사도 함수가 모두 구현이 되어있다.

     

    def textrank_keysentence(sents, tokenize, min_count, similarity, df=0.85, max_iter=30, topk=5)
        g = sent_graph(sents, tokenize, min_count, min_sim, similarity)
        R = pagerank(g, df, max_iter).reshape(-1)
        idxs = R.argsort()[-topk:]
        keysents = [(idx, R[idx], sents[idx]) for idx in reversed(idxs)]
        return keysents

    최종 keysentence를 추출하는 함수는 이러하다.

     

     

     

     

     

     

     

    실제 사용기

    SNS에서 '을왕리 해수욕장'으로 검색했을때의 글을 특수문자 제거 한글자 및 한글, 영어가 아닌 단어 제거 등 전처리를 하고 길이가 50 미만인 문장도 제거하여 대략 5만개 정도의 문장을 수집한 데이터로 테스트를 진행하였다.

    df.head() # 을왕리 해수욕장에 관한 게시글들

    총 8만5천개였는데 전처리 후, 5만개

     

     

    cleaned_sents = cleaning(df['sentences'].tolist()) # 전처리 & 길이 50 이상인 문장만
    print(len(cleaned_sents)) # 50263
    cleaned_sents[:5]
    # 결과
    50263
    ['코로나 물러가라 추따추따 왕뚜껑삼겹살 배불뚝 뱃속기름칠 을왕리해수욕장 겨울바다 따끈한 아메리카노 내사랑 존류리 하뚜하뚜해',
     '이것도 뒤늦은 포스팅 지난여름 오빠랑 갔던 을왕리해수욕장 이번 주말은 코로나로 집콕 중 지난사진 뒤적뒤적 코로나 밉다미워 추억스타그램',
     '꼬망스의 네번째 일정 방학 엠티 인천 을왕리 동아리의 꽃 이라고 할 수 있는 엠티 인천하면 을왕리 해수욕장아니겠습니까 바다도 보고 고기도 먹고 저녁에 불꽃놀이까지 같이 끓여 먹는 라면이 이렇게 맛있을 수 있을까용 내년에 신입생으로 들어올 예비 학번 친구들도 저희 꼬망스와 함께 좋은 추억 만들어갔으면 좋겠네요',
     '사진 찍자니까 할말이 많으신 분 갑자기 날 번쩍들더니 패대기 치시는 분 장난끼 빼면 레알 시체이신 분 바로 내 남자친구 주말로 돌아가고프다 현실은 연습 운동 식단 또륵',
     '오빠가 고생해서 준비했던 연초 워크샵 장소도 구경하고 맛있었다던 맛집도 데려간건 좋았는디 엘리자벳 꿍하게 하믄우짜냐 그래도 큰사고없이 보험처리해서 다행이당 아직 낫지않은 얼굴상태와 사고보상으로 아이스크림을 먹어따 해송쌈밥 진짜짱맛있어 우리는 오늘 을왕리와서 선셋보러왔다가 헬을 맛보고간당 아주조아쓰 마지막은 사고낸자의 뒷모습마저도 멋진 영호쓰의 모습 그래도 사랑혀']

     

    각 문장을 list of str 형태로 전처리가 완료된 리스트로 만들었다.

     

     

    # KoNLPy Komoran 토크나이저
    from konlpy.tag import Komoran
    
    komoran = Komoran()
    def komoran_tokenizer(sent):
        words = komoran.pos(sent, join=True)
        words = [w for w in words if ('/NN' in w or '/XR' in w or '/VA' in w or '/VV' in w)]
        return words

    그리고 키워드 추출을 위해 konlpy의 코로만 형태소 분석기를 사용하고, 

    명사와 동사만 추출하는 토크나이저를 선언하였다.

     

     

    # TextRank Keyword Extraction
    from textrank import KeywordSummarizer
    
    keyword_summarizer = KeywordSummarizer(tokenize=komoran_tokenizer, min_count=2, min_cooccurrence=1)
    keyword_summarizer.summarize(cleaned_sents, topk=20)

    그리고 lovit님의 textrank의 KeywordSummarizer 클래스를 이용하고,

    전처리가 완료된 문장들의 리스트와 추출할 키워드의 갯수를 인자로 넣어 주었다.

     

     

     

    # 결과
    [('을/NNG', 1024.9834212715987),
     ('왕/NNG', 1023.3713324076148),
     ('리/NNP', 969.4723535973261),
     ('맛집/NNG', 388.38152993166614),
     ('해수욕장/NNP', 343.7173347750053),
     ('구이/NNP', 320.7070148309993),
     ('조개/NNP', 219.38166772693876),
     ('그램/NNP', 191.2397858145278),
     ('회/NNB', 182.84939421713764),
     ('인천/NNP', 169.7758807751583),
     ('영종도/NNP', 163.0537519530974),
     ('스타/NNP', 162.9289677684602),
     ('조개/NNG', 119.6421270490103),
     ('좋/VA', 117.58980411376295),
     ('여행/NNP', 107.2460789827922),
     ('횟집/NNG', 104.42067065905724),
     ('바다/NNG', 92.47340103014704),
     ('하/VV', 88.4965420638952),
     ('선녀/NNG', 87.40816019817125),
     ('오/VV', 86.28705624142953)]

    총 20개의 키워드가 추출되었는데, 아무래도 형태소 분석기를 사용하면

    단어들이 너무 많이 분리되는 경향이 있다.

    형태소분석기에 단어사전을 등록해서 사용하거나,

    lovit 님의 soynlp라는 패키지가 있는데 자신이 사용할 도메인의 코퍼스에서 비지도 학습하여 tokenizer를 만들어 사용하는 것을 추천드립니다.

     

     

    # TextRank Keysentence Extraction with subwords tokenize
    def subword_tokenizer(sent, n=3):
        def subword(token, n):
            if len(token) <= n:
                return [token]
            return [token[i:i+n] for i in range(len(token) - n + 1)]
        return [sub for token in sent.split() for sub in subword(token, n)]
    
    subword_tokenizer('을왕리와서 선셋보러왔다가 헬을 맛보고간당')

    그리고 keysentence를 추출하기 위해서는 형태소 분석기 말고 subword tokenizing 방식을 사용했다.

    물론 형태소 분석기 tokenizer를 사용해도 되지만, 

    어차피 많이 등장한 단어는 해당 단어를 구성하는 부분어절(subword)가 자주 등장했을 것이고

    이를 이용한 문장 유사도를 측정하여도 결과가 비슷하기 때문이다.

     

     

     

    from textrank import KeysentenceSummarizer
    summarizer = KeysentenceSummarizer(
        tokenize = subword_tokenizer,
        min_sim = 0.5,
        verbose = False
    )
    keysents = summarizer.summarize(list(set(cleaned_sents)), topk=10)
    for _, _, sent in keysents:
        print(sent)
        print()

    min_sim은 similarity가 0.5이상이라는 뜻이고 좀 더 맞추면 조금이라도 비슷한 단어를 고려한다.

    총 10개의 핵심 문장을 추출해봅니다. 중복되는 문장들이 많아서 set()을 통해 걸러주었다.

     

     

    결과

    더보기

    너무나도 힘든 이벤트 참여였지만 의지의 한국인은 무엇이든 해낼 수가 있읍니다 눈물 주륵 형광소년 음이 엄청 엄청 왕왕왕 귀엽다 뚜우우우우 뚜우우우우하는데 아직도 어딘가에서 형광 핑크 후드티를 입은 나의 형광 소년이 기타를 메고 거닐고 있을 것 같다 형광소년의 다섯 곡 모두 그렇지만 정말 형광펜으로 죽 그어놓은 것 같이 반짝반짝 빛나는 가사가 곳곳에 돋보인다 나의 우주 안에 상냥한 너의 미소 널 만나지 않은 오늘 같은 날에도 여전히 울리고 있는걸 정말 동화 속에서 방금 걸어나오셨다고 해도 믿을 만큼 너무 사랑스럽고 귀엽다   그리고 형광소년을 의미하는 가사 너를 볼 수 없는 오늘 같은 날에도 여전히 빛나고 있는걸 이 사람 천재 아냐 라고 생각했다  형광소년 항상 반짝반짝 빛나 내 마음 속에서 사랑해 사랑해 지구 끝까지 사랑해  도대체가 롯데 칠성은 지금 뭘 하고 앉아있는지 의문이 드는 노래다 왜냐면 우리 형광소년이 직접 밀키스로 이렇게 엄청난 노래를 만들어주셨는데 당장 송으로 쓰고 형광소년을 광고모델로 채용해야지 전주 부분 음이 마치 불투명한 흰 색의 밀키스가 기포 보글보글 올라오는 것 같다 너모너모 귀엽다 어쩜 이렇게 찰떡같이 음을 만들어냈을까 신기하다 이 곡에서도 꼭 맘에 드는 가사가 있는데 우리가 닦지 못할 얼룩은 없다고 그렇게 믿고 싶어요 너무 귀엽고 희망찬 가사가 아닌가 아무리 생각해도 롯데 칠성은 당장 움직여야 한다 정말 기분 좋아지는 노래다 이 노래를 들으며 밀키스 뻥 안 치고 다섯 번이나 사먹었다 나 원래 밀키스 느끼해서 안 좋아하는데 이게 모두 형광소년 때문이다 사랑해 을왕리해수욕장 형광소년 노래가 발매되었을 때 가장 먼저 들었던 곡인데 처음 들었던 순간이 아직도 생생하다 바쁘게 걷던 걸음을 멈추고 이어폰 속에서 흘러나는 노래를 음미했다 따뜻하고 부드럽게 진행되는 기타 연주에 갑자기 눈물이 주륵 나왔다 가사가 한 소절도 나오지 않았는데 너무 따뜻했고 곡의 분위기가 너무 잘 와닿았다 열스밍 돌리면서 정말 여러 번 노래를 들었는데 계속해서 눈물 나오는 곡 나중에 곡 소개 포스팅을 봤는데 형광소년의 노래 속에 실은 감정이 기타 음을 통해 내게로 잘 전달된 것 같아서 꽉 찬 마음이 들었다 아 그리고 을왕리 해수욕장 한 번도 안 가봤는데 가보고 싶어졌다 을왕리 해수욕장 형광소년한테 돈 주자 사랑해 회전목마 되게 모던한 느낌 외로운 서울의 느낌이 들었다 죄송해요 뭣도 모르면서 되는 대로 지껄여봤어요 쏴리 뮤비에서 형광소년이 동굴 터널 설명 바보 죄송 같은 곳을 지나가는데 그 장면과 노래가 정말 찰떡같이 어울린다고 생각했다 혼자 걸어가는 형광소년의 뒷모습을 보면서 진짜 같이 걸으면 안 될까요 저 공기처럼 가만히 있을게요 네 말하고 싶었다 함께 걸어주고 싶은 마음  그만큼 쓸쓸해 보여  아 그리고 뒷부분에 음이 두두두둥 두두두둥 하는 부분 뭔가 회전목마가 재빠르게 돌아가는 느낌이 든다 회전목마가 빠르게 돌아가고 그 사이로 보이는 형광소년 벌써 절절하다 멀어지지 마  사랑해  도입부 진짜 미쳤다 사실 형광소년의 다섯 곡 모두 도입부 미쳤지만 이건 특히 더 미쳤다 물론 좋은 뜻의 미침입니다  사랑해 부드럽고 조곤조곤한 형광소년의 목소리가 정말 좋다 나에게 속삭이는 느낌이 들고 그냥 듣고만 있으면 눈 물 좔 좔 이 곡이 좋은 이유는 나에게 서두르지 않아도 된다 고 말해주는 것 같아서다 이렇게 이대로도 충분하니까 서두르지 않아도 되고 우리 이대로 그냥 조금 더 있자 고 말해주는 그 편안함이 정말 좋다 따뜻하고 위로가 됐다 지금 계속해서 다섯 곡 중에 나의 원픽이 바뀌고 있긴 하지만 현재 내 마음속 위는 바로 실버문이다   형광소년의 느릿함 부드러움 따뜻함 이런 마음들이 너무 잘 느껴지기 때문에 말하지 않아도 알아요 사랑해 형광소년 음악추천 음악 추천 음악추천 을왕리해수욕장 회전목마 커버 숨은그림찾기 숨은음악찾기 노래추천 음악스타그램 노래굿 김예슬 사랑해지구끝까지

    영종도 간절히 힐링이 필요하다는 친구를 위해 선택한 곳은 영종도 약속시간에 맞춰 이동하는 길은 꽤나 춥고 비마저 내린다 날씨가 좋아야 기분도 좋아질텐데 괜히 감기만 걸리는건 아닐지 걱정이 앞선다 송도에 들려 백령면옥에서 식사하고 가볍게 타워 전망대를 구경한 뒤 인천대교를 건넌다 날씨가 좋지 못해 사진을 찍지 않았지만 다행히 전망대에서 송도를 볼 수 있었다 참고로 백령면옥은 내가 좋아하는 황해도식 냉면이며 주차가 가능하고 미닫이 문 입구에 작은 턱이 있지만 휠체어 이용이 가능하다 커널워크 바로 옆의 타워는 지인에게 듣기로 인천시에서 운영한다고 한다 오피스쪽은 출입증이 필요하지만 로비와 전망대는 누구나 이용가능하며 이용료와 주차가 무료이다 여기에 주차를 하고 송도 센트럴 파크를 산책 할 수도 있다 엘리베이터를 갈아타야 하지만 전망대는 층이며 휠체어 이용이 가능하다 인천공항에서 일 할 때 자주 다녔던 길인데도 인천대교를 건널때는 늘 새롭다 영종도 첫 코스는 언제부터인가 맛집 멘토가 되고 있는 친한 형님이 추천해 준 마시안제빵소 네비를 찍고 가면 도착할 즈음 바로 옆집에 마시랑빵집이 있어 두 건물이 헷갈린다 어쩌면 같은 주인일지도 모르겠다 아담한 주차장에 장애인주차공간과 턱 없는 문이 가장 먼저 눈에 띈다 입구를 들어서면 반대편 창을 통해 보이는 바다 뷰가 아주 좋다 바다 뷰가 너무 좋아서 입구 옆에 있던 동물 인형들 이야기는 패스 블로그를 찾아보니 이 곳의 시그니처 메뉴는 수제햄버거라고 한다 수제햄버거 브레이크 타임은 우리가 도착한 시각은 그냥 아메리카노와 적당한 크기의 빵을 고른다 브레이크타임이어서 그런지 빵의 종류도 거의 없었고 제빵소라하여 큰 기대를 했으나 커피와 빵 모두 맛은 보통 내 입맛엔 바다 뷰가 살린 카페로 기억하겠다 층과 테라스 층 모두 뷰가 좋고 작지만 엘리베이터도 있어 전 구역 휠체어 이용이 가능한 점이 마음에 들었다 게다가 시간이 지날수록 점점 하늘이 개이고 있다는 점 이 곳에서 친구와 이런저런 이야기를 나누며 또 느낀다 사람 사는게 가진게 많고 적고를 떠나 비슷비슷하다는 것 다 비슷한 상처를 안고 비슷한 감정들을 가지고 살아간다는 것 다만 그 이후에 선택이 조금씩 다를 뿐 삶이 늘 흐린 날만 있는건 아니라는걸 증명이라도 하듯 거짓말같이 하늘이 개인다 선녀바위 세상에 내려와 인간을 사랑하게 된 선녀를 옥황상제가 돌로 만들어버렸다는 설화가 있다 앞에서 해변을 바라보는 잠깐 사이에 갑자기 다른나라에 온 것 같다 먹구름에 덮인 하늘이 종일 비가 올 것 같은 분위기이더니 이렇게 순식간에 날씨가 좋아질 수 있나 싶다 우리 인생도 그렇겠지 낙담할 필요 없다 끝이 없을 것 같은 깊은 어둠속에서도 말도 안되는 기적은 일어난다 단 포기하지 않는다면 역시 서해바다는 오후부터 어릴 때 기억으로는 을왕리 해변이 참 지저분했었는데 지금의 모습은 완전히 다르다 을왕리 해변은 크기는 작지만 해변의 모양이 초승달 모양으로 예쁜 해변으로 알려져 있다 활짝 개인 날씨와 포근한 바람 따스한 햇볕 유유히 날아다니는 갈매기들 얕은 파도소리 바다에 반짝이는 햇빛 모든게 완벽하고 감사하다 힘든 시기를 겪고있는 친구에게 무한한 힐링이 되었기를 날씨도 시간도 이런 마음도 다 은혜다 서로 소통하고 이야기를 통해 감정을 보듬어 나갈 때 나의 마음도 정리가 된다 경청과 대화와 글쓰기가 도움이 된다 그저 감사하다 백령면옥 타워 마시안제빵소 선녀바위 을왕리해수욕장

    죄송하지만 다시 쓰는 부작 을왕리 오여사 제 화 바다는 따뜻하고 그 위의 공기층은 차가워서 온도차가 있어야 하며 파도는 잔잔해야 한다 육안으로 보이는 수평선 끝까지 구름 가스층 미세먼지는 물론 없어야 한다 피부과 의사인 인친님이 알려준 오여사가 강림하는 조건들이다 왠지 의사라 그런지 공신력 있어 보인다 그리고 한달 전 쯤 을왕리에서 사진 찍다가 옆에 있던 진사님이 하는 얘기를 우연히 들었다 해수면에 빛이 살아있어야 한단다 본인 경험상 그걸로 오여사 출몰 여부를 가늠한단다 귀가 솔깃했다 그런데 어제 유난히 해수면이 반짝거렸다 태양과 나를 잇는 잔잔한 물결 사이사이마다 빈틈없이 빛이 들어차기 시작한다 지금까지 을왕리 출사 전적은 전 무 패 무는 오여사 사촌 여동생 쯤 되는 애매한 오여사를 본 걸 무라 해둔다 어제로 스무번째 도전 일몰 전 눈이 간지러울 정도로 반짝거리는 바다를 앞에 놓고 조바심과 설레임이 마음 속에서 요동친다 그 정도면 만날 때도 된 것 같은 오여사를 못 만나 애태웠던 그동안의 마음처럼 때가 되었는데도 이루지 못한 일이 있다면 조바심이 날 수밖에 없다 내 나이 서른여섯이었을 때 결혼이라는 것이 그런 일이 아니었나 싶다 고향 친구들 대학 친구들 내 나이쯤 되는 직장 동료 선후배들 대부분이 결혼해서 애 하나 쯤은 키우고 있는 걸 보면 하지 못한 일에 대한 조바심은 점점 더 커질 수밖에 없었다 당시에는 결혼식과 신혼집 집들이 그리고 돌잔치에 가게 되면 거기에서 감도는 비현실적인 행복의 기운에 곧잘 감화되곤 했다 특히 결혼식장에서 남들 축의금 내고 신랑 신부에게 눈도장만 찍고 곧장 밥 먹으러 갈 때 나는 식을 끝까지 지켜봤었다 눈 앞에서 벌어지는 사랑의 결실을 현장에서 실시간으로 지켜보는 일은 영화나 글이 주는 감동에 비할 바가 아니었다 언젠가 누가 우스갯소리로 그랬다 서른 다섯이 넘은 남자가 아직 결혼을 하지 않았다면 그 이유는 세가지 중에 하나라고 하나는 여자 살냄새보다 남자 살냄새가 더 좋은 경우이고 둘은 남자 구실에 문제가 있는 경우 마지막은 신용불량일 경우라고 나는 분명 여자 살냄새가 좋고 남성 기능이 왕성했다 비록 그 나이 되도록 남들이 기대하는 만큼 모아 놓은 돈은 없었지만 그렇다고 신용불량은 아니었다 그런데도 불구하고 사람들은 내가 장가를 가지 못하는 이유를 지 주제를 모르고 눈이 머리 꼭대기에 붙어 있어서라고 했다 그러면서도 사정이 딱해보이는지 줄기차게 만남의 자리를 만들어 줬다 서른 여섯 나이에 소개팅 이라 해야 할지 선 이라고 해야 할지 모를 낯선 여인과의 첫 대면은 늘 껄끄러운 일이었다 어떤 경우 상대의 마음을 얻기 위해 온 힘을 다 해야 하는데 오 엑스 버튼만 누르면 되는 일이라면 좋겠지만 그게 그렇지가 않아서 먹는 애 의 양이 버거울 때가 있었다 당시 대략의 소개팅 전적은 이랬다 내 그린라이트는 들어왔으나 상대방 라이트가 들어오지 않은 경우 상대방 라이트가 들어왔으나 내 라이트가 들어오지 않은 경우 이도 저도 알 수 없는 경우 그리고 남은 가 서로의 라이트에 동시에 불이 들어온 경우다 이 의 경우에 사람들은 제정신으로는 할 수 없는 일들을 하기 시작한다 아무리 먼 거리라도 데려다주고 데려오고 매일 퇴근후 찾아가고 어떠한 불편도 감수할 수 있는 너그러운 마음을 갖게 된다 사랑이 시작되는 순간이다 당시 그 의 주인공은 바로 지금의 내 아내다 아내를 처음 만난 것은 종로구 통의동에 있는 어느 카페였다 나는 약속 장소에 좀 일찍 도착해 화장실에서 거울 한 번 보고 자리에 앉았다 미래의 아내가 될 처음 보는 여자를 만나기 전이다 앞으로 다시 없을 내 인생 마지막 소개팅이 시작되기 직전이다 심장이 쿵쾅거리기 시작했다 화에 계속 스무번째 을왕리 청춘열정 풍경사진 여행 일몰 영종도 을왕리해수욕장 을왕리오여사 캐논이미지스토밍 포토에세이 에세이 글 긴글

    사진 넘기다 얼굴 나오는 거 매우 죄송합니다 그닥 행복하지 않은데 사람을 만나면 행복한 척을 하는 것 같은 그런 느낌을 받은 적이 있어요 그 느낌이 너무 불쾌하고 나를 아프게 하는 것 같아 점차 사람을 만나는 빈도를 줄였고 사람을 만나지 않는 시간동안 항상 집에서 누워서 휴대폰만 봤었죠 그렇게 하루 이틀이 지나니까 나아지기보다 오히려 마음이 더 아프더라구요 점점 잊혀져가는 것 같기도 하고 남는 게 시간이고 돈은 없는데 어쩌지 어쩌지 하다가 정말 이렇게 시간을 버리면 마음이 너무 아플 것 같아 집 밖으로 나오기로 결심했어요 정말 저에겐 큰 용기가 필요한 부분이었는데 이 용기를 낼 수 있었다는 저에게 박수를 보냅니다 그렇게 뛰쳐나와 집 앞 버스 정류장에서 가장 빨리 도착한 버스를 탔고 그렇게 호선 지하철 종점에 왔어요 생각보다 할 게 없더군요 그러다 갑자기 바다가 가고 싶더라구요 그래서 인천에 가야겠다 싶었고 지도에서 바다랑 가까운 곳을 클릭해서 무작정 가라는대로 갔습니다 하필이면 부두에 갔어요 해수욕장 갔어야되는데 그래서 한 쯤에 공장만 실컷보다가 을왕리 해수욕장에 도착했어요 마침 시간도 해가 너무 예쁘게 떠있더라구요 사진들 중 바다 사진은 다 을왕리 해수욕장이고 제 얼굴은 부두 근처에서 찍었어요  그리고 갑작스럽게 정해진 저녁약속은 학교 친구와 피자집에 가서 맥주랑 먹고 술 조금 찌끄리고 집에 왔습니다 내일은 옷을 사러 바깥에 나가고 이제 경기도에 가보고 싶네요 남는 건 시간 돈은 없고 허전하다 싶을 때 그냥 집 밖에 나와 아무 버스나 타고 돌아다니는 게 정말 선뜻 들으면 어이없지만 생각도 할 수 있는 시간이고 사람들도 볼 수 있고 너무 좋은 것 같습니다 또다시 마음이 힘들어지는 날에는 아무 버스나 타고 저 멀리 떠나보고 싶네요 일상 데일리 을왕리해수욕장 바다 예뻐 피자 펍 또 술

    안녕하세요 해송조개구이 입니다 여자 대학생 이 저희가게를 찾아오셔서 조개특대를 주문해주셧어요 맛있게드시고 오늘도 신나는 하루가 되셧으면 좋겠어요 오늘도 저희가게를 찾아와주셔서 감사드립니다 을왕리해송조개구이 을왕리해수욕장 조개구이 을왕리조개구이 인천공항 인천공항맛집 바닷가나들이 커플 커플나들이 연인 연인나들이 썸 영종도맛집 을왕리맛집 소통 좋아요 선팔 맞팔 일상 데일리 먹스타그램 존맛 맛스타그램 맛집그램 부평맛집 부평존맛 부평술집 부평치킨

    퇴근후 밤바다 데일리 일상 주말 여행 바다 을왕리 인천 을왕리해수욕장 서해바다 조개구이 영종도 영종도여행 여행스타그램

    점심에 빠네빵 따로 추가하셔서 마늘오일파스타를 여자들의 일 숙제 다이어트 안하셔도 미모짱이시잖아요 저희 오즈테이블 운서점을 찾아주셔서 감사합니다 사진은 동의하에 올렸습니다 매장 주소 인천광역시 중구 운서 로 프라자 호 오즈테이블 매주 휴무 코로나 로 까지 마감합니다  예약 및 문의 카카오톡채널 오즈테이블운서점 인천 인천맛집 영종도 영종도맛집 인천공항 인천공항맛집 을왕리해수욕장 을왕리맛집 운서역맛집 운서동맛집 운서맛집 넙디맛집 하늘도시맛집 포토존 레스토랑 파스타맛집 스테이크맛집 브런치 술스타그램 맛집 오즈테이블운서점 좋아요반사 맞팔 소통해요 분위기맛집 분위기 테라스 영종도핫플

    안녕하세요 해송조개구이 입니다 남녀 두분이 오셔서 특별메뉴를 주문해주셧습니다 들은 멍멍이를 대리고 오셧는데 저도 강아지를 좋아하는지라   너무 이뻐서 한장 사진을 찍었어요   강아지와 같이 외출이라니 보기좋더라구요   식사 맛있게하시고 오늘도 즐거운 하루가되시기바랄께요 을왕리해수욕장 을왕리해송조개구이 인천공항맛집 영종도맛집 을왕리 데이트장소 데이트코스 을왕리맛집 인천맛집 치즈 먹스타 치즈덕후 주안 주안역 부평역 셀 셀피 셀카 셀스타그램 얼스타그램 인스타그램 인스타중독 데일리 사진 좋아요 일상

    안녕하세요 해송조개구이 입니다 남녀두분이 오셔서 조개중자를 주문해주셧어요 들은 서울에서 오신분들이라고해요   맛있게드시고 오늘하루도 즐거운하루가되셧으면 좋겠습니다 저희가게를 찾아와주셔서 감사드립니다 을왕리해송조개구이 을왕리해수욕장 을왕리조개구이 서울 인천나들이 인천 인천맛집 인천공항맛집 맛집추천 데이트장소 데이트명소 맘스타그램 육아맘 남매맘 아들맘 직장맘 데일리룩 셀카 뷰티 메이크업 대맘 아들딸 가족스타그램 을왕리맛집

    안녕하세요 해송조개구이 입니다 가족 이서 오셔서 스페셜 조개 랍스타 새우 중자를 주문해주셧어요 가족끼리 나들이오신모습이 참보기 좋더라구요 맛있게드시고 화목한 가정이 오래오래 되셧으면 좋겠습니다 오늘하루도 즐거운 하루가 되시길바랄께요 저희가게를 찾아와주셔서 감사드립니다 을왕리해송조개구이 을왕리해수욕장 데이트코스 데이트명소 을왕리조개구이 조개구이 조개구이맛집 바다뷰 힐링데이트 힐링여행 바다여행 맛집탐방 숨은맛집 맛집공유 인천공항맛집 영종도맛집 을왕리맛집 맘스타그램 육아맘 남매맘 아들맘 직장맘 데일리룩 셀카 뷰티 메이크업

    아무래도 위에서 설명한 것 처럼 textrank의 similarity는 긴 문장들이 추출되는 경향이 있다.

     

     

     

    KeysentenceSummarizer에 similarity = 'cosine'을 선택한 결과는 이러하다.

     

    결과

    더보기

    을왕리해수욕장 아름다운 모습 을왕리해수욕장 드라이브 다녀왔어요 을왕리해수욕장 을왕리 을왕리맛집 을왕리바다 을왕리해변 을왕리맛집 을왕리해수욕장펜션 을왕리카페 을왕리해수욕장가는길

    을왕리해수욕장 취해따 을왕리 을왕리해수욕장 을왕리맛집 조개구이 바다 술스타그램 먹스타그램 인천

    을왕리해수욕장 을왕리해수욕장 빠오 삼성역 을왕리해수욕장 녕안 여행 일본여행 바다 인천 을왕리해수욕장 여행스타그램 한국여행 욜로 인생네컷 일상

    을왕리해수욕장 을왕리 을왕리해수욕장 수욕장 해변 인천 인천중구 용유도 황해 바다 바닷가 켐핑

    을왕리해수욕장 을왕리 을왕리해수욕장 힐링 바다 삼수갑산 즉흥여행 청년여행가 군바리셋 그건맞다

    인천 을왕리해수욕장 오랜만에 데이트 인천 을왕리해수욕장 낙조대 을왕리 을왕리카페 을왕리맛집 데이트

    영종도 을왕리해수욕장 일몰 수원빛쟁이들 영종도 을왕리해수욕장 을왕리 해수욕장 일몰 사진 출사

    인천 을왕리 해수욕장 카라반 맡기고 집에 가기 아쉬워 을왕리 해수욕장 인천을왕리해수욕장 을왕리해수욕장 인천바다 덥다 여름엔계곡

    물빠진 을왕리 해수욕장 사랑하고 또 사랑하자 사랑 사랑해요 물 을왕리 을왕리해수욕장 을왕리해변 을왕리해수욕장 사랑스타그램

    와 바다다 을왕리해수욕장 바다 을왕리 을왕리해수욕장 추석 인천 가족나들이 셀카 셀스타그램 일상 데일리

     

     

     

    komo_summarizer = KeysentenceSummarizer(
        tokenize = komoran_tokenizer,
        min_sim = 0.5,
        verbose = False
    )
    komo_keysents = komo_summarizer.summarize(list(set(cleaned_sents)), topk=10)
    for _, _, sent in komo_keysents:
        print(sent)
        print()

    토크나이저를 형태소 분석기를 사용해도 결과는 비슷하게 아주 긴 문장이 선택되는 경향이 있음

    더보기

    영종도 간절히 힐링이 필요하다는 친구를 위해 선택한 곳은 영종도 약속시간에 맞춰 이동하는 길은 꽤나 춥고 비마저 내린다 날씨가 좋아야 기분도 좋아질텐데 괜히 감기만 걸리는건 아닐지 걱정이 앞선다 송도에 들려 백령면옥에서 식사하고 가볍게 타워 전망대를 구경한 뒤 인천대교를 건넌다 날씨가 좋지 못해 사진을 찍지 않았지만 다행히 전망대에서 송도를 볼 수 있었다 참고로 백령면옥은 내가 좋아하는 황해도식 냉면이며 주차가 가능하고 미닫이 문 입구에 작은 턱이 있지만 휠체어 이용이 가능하다 커널워크 바로 옆의 타워는 지인에게 듣기로 인천시에서 운영한다고 한다 오피스쪽은 출입증이 필요하지만 로비와 전망대는 누구나 이용가능하며 이용료와 주차가 무료이다 여기에 주차를 하고 송도 센트럴 파크를 산책 할 수도 있다 엘리베이터를 갈아타야 하지만 전망대는 층이며 휠체어 이용이 가능하다 인천공항에서 일 할 때 자주 다녔던 길인데도 인천대교를 건널때는 늘 새롭다 영종도 첫 코스는 언제부터인가 맛집 멘토가 되고 있는 친한 형님이 추천해 준 마시안제빵소 네비를 찍고 가면 도착할 즈음 바로 옆집에 마시랑빵집이 있어 두 건물이 헷갈린다 어쩌면 같은 주인일지도 모르겠다 아담한 주차장에 장애인주차공간과 턱 없는 문이 가장 먼저 눈에 띈다 입구를 들어서면 반대편 창을 통해 보이는 바다 뷰가 아주 좋다 바다 뷰가 너무 좋아서 입구 옆에 있던 동물 인형들 이야기는 패스 블로그를 찾아보니 이 곳의 시그니처 메뉴는 수제햄버거라고 한다 수제햄버거 브레이크 타임은 우리가 도착한 시각은 그냥 아메리카노와 적당한 크기의 빵을 고른다 브레이크타임이어서 그런지 빵의 종류도 거의 없었고 제빵소라하여 큰 기대를 했으나 커피와 빵 모두 맛은 보통 내 입맛엔 바다 뷰가 살린 카페로 기억하겠다 층과 테라스 층 모두 뷰가 좋고 작지만 엘리베이터도 있어 전 구역 휠체어 이용이 가능한 점이 마음에 들었다 게다가 시간이 지날수록 점점 하늘이 개이고 있다는 점 이 곳에서 친구와 이런저런 이야기를 나누며 또 느낀다 사람 사는게 가진게 많고 적고를 떠나 비슷비슷하다는 것 다 비슷한 상처를 안고 비슷한 감정들을 가지고 살아간다는 것 다만 그 이후에 선택이 조금씩 다를 뿐 삶이 늘 흐린 날만 있는건 아니라는걸 증명이라도 하듯 거짓말같이 하늘이 개인다 선녀바위 세상에 내려와 인간을 사랑하게 된 선녀를 옥황상제가 돌로 만들어버렸다는 설화가 있다 앞에서 해변을 바라보는 잠깐 사이에 갑자기 다른나라에 온 것 같다 먹구름에 덮인 하늘이 종일 비가 올 것 같은 분위기이더니 이렇게 순식간에 날씨가 좋아질 수 있나 싶다 우리 인생도 그렇겠지 낙담할 필요 없다 끝이 없을 것 같은 깊은 어둠속에서도 말도 안되는 기적은 일어난다 단 포기하지 않는다면 역시 서해바다는 오후부터 어릴 때 기억으로는 을왕리 해변이 참 지저분했었는데 지금의 모습은 완전히 다르다 을왕리 해변은 크기는 작지만 해변의 모양이 초승달 모양으로 예쁜 해변으로 알려져 있다 활짝 개인 날씨와 포근한 바람 따스한 햇볕 유유히 날아다니는 갈매기들 얕은 파도소리 바다에 반짝이는 햇빛 모든게 완벽하고 감사하다 힘든 시기를 겪고있는 친구에게 무한한 힐링이 되었기를 날씨도 시간도 이런 마음도 다 은혜다 서로 소통하고 이야기를 통해 감정을 보듬어 나갈 때 나의 마음도 정리가 된다 경청과 대화와 글쓰기가 도움이 된다 그저 감사하다 백령면옥 타워 마시안제빵소 선녀바위 을왕리해수욕장

    인스타일기 평일일기 갑자기인천 퇴근을 한 간 앞두고 정은이에게 연락이왔다 오늘 잠깐 인천바다 드라이브 가자고 요새 나도 싱숭생숭한 일들도 있고 생각할게 많아서 바로 퇴근하고 바다를 갔다 코로나의 역파 때문인지 생각보다 사람이 없었고 가는길에 생각치도 못하게 비가 조금씩 오다말다 했다 도착해선 다행히 비가 거의 안와서 바다를 보는데 물이 들어오고 있는건지 빠지고 있는건진 잘 모르겠지만 저번에 잠깐 왔을때보단 물이 멀리 있었다 말라 있는거 같아서 가까이보려 잠깐 들어 갔는데 갯조개 쏙조개 인줄 알고 살짝 밟앗던게 갑자기 꿈틀거려 간떨어질 뻔했다 주변에선 놀러온 여러 사람들이 불꽃놀이를 즐기고 있었고 천천히 둘러보다 정도 보고 신촌으로 돌아왔다 뭘먹을지 고민하다 며칠전부터 소곱창이 너무 먹고싶어서 곱창집에 갔는데 가게 사장님이 매우 친절했다 식당 들어가기 전에 앞에서 작은봉지에 마스크싸주시고 온몸에 소독약 뿌려주시고 손에 손소독제 까지 직접 짜주셨다 들어올 때 부터 서비스가 좋아서 기분이 좋았는데 가게안에도 매우 쾌적했다 모듬 중자를 시켜놓고 서비스로 약간의 육회와 해장국된장찌개 약간 육개장맛도 나고 오묘한 맛의 찌개가 나왔다 한입의 입맛을 돋구기엔 충분했다 그러고 난뒤 에 곱창을 시켜서 슬슬 먹기 시작하는데 정말 오랜만에 먹어서 그런지 정말 맛있었다 이런저런 서로 얘기를 하며 한참 먹다가 볶음밥까지 시켜먹고 급 피로감에 버스를 타고 집에왔다 잠깐의 시간이지만 바다를 눈에 담고와서 좋았고 정말 맛있는 곱창집을 알게된 거 같아서 기분이 좋았다 마지막 가기전에 주셨던 헛개차도 잘마셨어요 짧지만 바쁜 밤 이었다 일기 끝 갑자기바다 인천바다 을왕리해수욕장 퇴근후바다 물이빠졌어 불꽃놀이 해수욕장걷기 밤바다 비온다 생각보다안추워 바다스타그램 예쁜다리 신촌 부추곱창 서비스짱 친절 특모듬중자 곱창스타그램 막창 맛스타그렘 선팔맞팔 좋아요테러 소통

    을왕리 어부 신광호 을왕리해수욕장 친구가 대명에서 일하는데 솔비치 싸게 해준다고해서 갈까 하다와이프가 가까운곳으로 가자고해서 가게된 을왕리입니다 바다라서 그런지 바람이 많이 불더라구요 그날만 그런건가 저희는 무조건 조개구이가 먹구싶어서 검색 둘다 술을 먹어야하니 가까운곳으로 어부 신광호 주변에 평이 많고 괜찮은곳이 몇개나왔는데 가장 유명한 집으로 대리그냥 부르려구 차를 몰고 가는데 엇 여기가 바로 근처더라구요 와이프가 여기도 조개구이 있으니 여기가자고해서 갔는데 음 제기준엔 별로였습니다 짜리 조개구이 소를 시켰는데 스키는 아예거의없고 양도 저게 다더라구요 호일접시에 치즈도 다 얼어있구 백상합조개도 크기가 너무 커서 잘 익지도 않고 조개는 너무 커도 별룬데 가리비는 먼가 좀 이상하구 여기가 무지개물회랑 조개찜이 유명하다던데 조개구이만 그럴까하는 생각도 걍 원래 갈려고 했던곳으로 갈걸 그랬어요 실망해서 해물칼국수도 안시켜먹었네여 을왕리 해수욕장 바다 구경하려고 다음날 갔는데 마침 시간대가 썰물때라 바닷물이 많이 빠져있더라구요   아 모가 되는게 없냐 점점 동해로 안간게 후회가 그래도 딸랑구는 이런 바다도 신기해하고 좋아해서 갈매기가 참 많았네여   아쉽지만 그냥 바다바람만 맞아도 먼가 힐링되는 느낌은 있었네여   간만에 출근하니까 참 적응안되고 먼가 그럽니다   빨리 집가고 싶어요 어제부터 허리가 먼가 아픈게 다 꼬여버린듯한 느낌이   오늘 하루도 파이팅하시고 좀있다가 놀러갈게용 인천 을왕리 을왕리해수욕장 블로그맛집 역시믿으면안돼 몬가꼬여버린나들이 그래도바다는좋다 어부신광호 조개구이 먹스타그램 먹부림 여행스타그램 바다스타그램 술스타그램 선팔 맞팔

    어제 건빵이 생일겸 일 제주여행 계획이였는데 돌아오는 티켓이 없다함 아쉬운대로 급 가까운 인천 바다로 출동 점심시간 맞춰서 도착 처음 와봤는데 아들은 너무 좋아하네 그럼 된거지 뭐 엄마는 이대로 인천공항으로 가고 싶던데 점심 조개구이 회도먹고 해물라면 해물칼국수 너가좋으면나도좋아 을왕리맛집 횟집너무많아 결정장애 일단먹고바다로가보자 소소한일상 배펑 날씨도좋고 인천 을왕리해수욕장 여유로운주말 외출 우리가족 사랑해 맛스타그램 먹방스타그램 먹방샷 음식그램 마싯다그램 주말

    세가족 첫 호캉스 송도센트럴파크 을왕리사촌누나네 처가집 호캉스 센트럴파크 오라카이송도파크호텔 세가족 가족스타그램 외식스타그램 셀카그램 아기 아기스타그램 인스타베이비 베이비스타그램 딸바보 딸맘 딸파파 아기아빠 일산파파 일산맘스타그램 일산맘소통 황금돼지띠맘 황금돼지띠 소통 도치맘 육아맘 육아소통 육아소통환영 맞팔환영 을왕리해수욕장 아이가 아직 한돌이 지나지 않아서 올해 해외여행은 잠시 미루고 국내 호캉스투어를 다니기로 했다 결혼 년차 주년 결혼기념일 맞이 호캉스 휴가를 호텔에서 즐기는 것을 말한다 호텔 과 바캉스 의 합성어이다 진정한 휴가는 여행이 아니라 휴식이라고 생각하는 사람들이 늘어나면서 휴가를 호텔에서 보내는 사람도 늘어나고 있다 투어의 첫 여행지는 송도신도시로 정했다 와이프가 좋아하는 도시야경과 넓은 공원이 자리하고 있는 송도센트럴파크는 더없이 좋은 호캉스지였다 호캉스지 선정 기준 일산 집 기준 이내 둘러보기 제주에 살아 봤던 것처럼 일산집을 기준으로 주변지 여행하기 사진순 번호순 일차 송도센트럴파크 집에서 일찍 나와 호텔체크인시간 전에 체크인 호텔도착 리셉션에 여행가방 맡기고 호텔 바로앞 산책 날씨도 좋고 기온도 덥지않아 사진찍기 참 좋았다 아진이 방긋 이제 외출을 많이 했다고 다니는곳 마다 별로 낯설어 하지 않는다 다만 중간 중간 한숨소리를 내는것이 에휴 또 어디가나 보다 하는거 같은 느낌이 든다 아진아 미안 아진이 목도 가눌줄 알게 되었다 아진이의 웃음은 딱 이정도 거리에서 많이 나오는거 같다 적당한 거리에서 바라보기 호텔앞 사거리에서 포스코빌딩은 너무 높아 잡히질않는다 그래도 기념으로 한컷 목적지는 롯데마트 커리볼스낵사러 포스코타워 송도 영어 혹은 구 동북아무역타워 영어 로 불렸던 이 건물은 대한민국 인천광역시 연수구 송도국제도시에 있는 마천루이다 높이 층 규모로 년 잠실 롯데월드타워 완공전까지 대한민국 최고층 빌딩이었다 타워 사업은 총 사업비 억원을 들여 송도에 지하 층 지상 층 지상 해발 건축연면적 의 규모다 송도국제도시에 있는 포스코타워 송도는 이상의 마천루로서 공기동역학적인 외형으로 인해 송도 신도시의 랜드마크 역할을 수행하게 될 것이다 업무시설과 숙박시설 용도로 활용될 예정이며 국내 기업 및 글로벌 기업에게 교역의 장을 마련해 줄 것으로 기대된다 여기를 보세요 가족사진 사진모음 호텔앞 거리 센트럴파크 점심 타코집 바네스타코 커플 세트 브리또 퀘사디아 감자튀김 캔음료 타코 추가 골목식당 원주 중앙시장편 부리또만나 타코집 보다가 송도가면 타코 브리또 먹으로 가자 해서 미리 방문하려 알아봤던 타코집엘 들렀다 밥종류는 별로 땡기질 않았던 차에 브리또 퀘사디아 타코는 잃은 입맛을 찾아 주기에 충분했다 양이 적을줄 알았는데 생각보다 양이 많아 배가 불렀다 먹자 먹자 바네스타코 내부 모습 오픈첫손님이 우리가족이였다 아진이 수영복 갈아입기 점심맛나게 먹고 호텔 체크인후 수영장 갈 준비르 했다 아진이는 벌꿀수영복으로 갈아입기 호텔 침구류가 마음에 들었는지 연신 방긋방긋 웃었다 실내수영장 호텔 층에위치 으로 고고 개월 미만 아이는 수영장엘 못들어간다고 해서 엄마랑 구경 금새 잠들어 버렸다

    바다보러왔다가 바다먹고가기 근데 코로나 맞아 사람 되게 많다 그중하나는 나고 을왕리 을왕리해수욕장 바다 드라이브 조개 조개구이 바다여행 인천 여행 먹스타그램 술스타그램 주말 가지마 행복 행복했다 노는게제일좋아 힐링 일상 소통 선팔 좋반

    갑자기 을왕리해수욕장으로 어린이집에 아이들을 데리러 갔다 큰아들 희준이 선생님께서 희준이 오늘 꽃게를 잡으러 가나요 하고 물으신다 원래 한의원 가기로 약속했었는데 선생님께 담주에 갈꺼예요 라고 말해주고 두 아들을데리고 나왔다 큰아들 한의원은 안가고 꽃게를 잡으러 가야겠단다 시간이 너무늦어서 안된다 했더니 아들이 떼를 쓰며 징징덴다 친구들한테도 꽃게를 잡으러 간다고 이야기한 아들을 위해 거짓말쟁이가 안되게 에 을왕리해수욕장으로 출발 에 도착 이곳은 새로운 세계다 갯벌은 아니지만 꽃게는 업었지만 모래사장과 소라껍질 안에든 꽃게를 잡았다 그리고 불가사리와 갯지렁이 어러마리를 가져갔던 통에 넣어 잡아왔다 또 우리아들 기르고 싶단다 오랜만에 넓은 바다와 함께 아이들과 신나게 뛰어눌았다 물장구도 치고 꽃게도 잡고 모래놀이도 햇다 간동안 열심히 놀고 조개구이 먹으러 구이집에 갔다 친절하신 조갯집 사장님 덕에 치 배터지게 먹었다 맛은 썩 별루 하지만 칼국수와 새우 조개 낙지 굴 여러가지 해조류 들을 맛보았다 아내는 셋째 때문에 놀지못해 아슀지만 바닷바람 쇠니 기분이 좋은듯 하네 사장님이 키우는 마피아들이 키운다는 커다란 개 한마리가 있어서 만져도 보고 사진도 찍었다 그리고 저녁이 되어 해변에서 꼭 해본다는 불꽃놀이도 아이들과 같이 해 보았다 얼마나 좋아하던지 역시 오길 잘했어 하는 생각이 든다 큰아들 희준이 한테 여기까지 오게 해 줘서 고맙다고 하니 왜 하고 다시 묻는다 그래서 희준이가 떼쓰지 않았으면 아빤 이곳에 안왔을꺼니까 라고 말해 주고 머리를 쓰다듬어 주었다 이제 내일 우리 아들은 거짓말 쟁기가 아닌 진짜 꽃게잡으러 갔다 왔다고 얘기하며 자랑 할껄 생각하니 아빠는 너무 흐뭇한 하루다 오늘도 아빠는 아이들을 위해 최선을 다한 하루다 이렇게 인생을 행복하게 살게 해줌에 너무 감사하고 또 감사드린다 을왕리해수욕장에서 하루를 가족여행 을왕리해수욕장 영종도 육아대디 행복한일상 아들과함께 가족 아들바보 사랑해 주말 광명근처가볼만한곳 인천가볼만한곳추천 조개구이 아빠가 새우구이 조개구이집 맛나다 행복

    어린이날 집에만 있기엔 너무 미안해서 애비가 급 제안한 을왕리해수욕장 가기 가기전 시댁들렸다가 아점겸해서 명륜진사갈비가서 고기냠냠하고 친정가게들려서 엄마한번보고 을왕리로 출발 추웠다가 더웠다가 지마음대로인 날씨덕에 애미만 불쾌지수 업 휴게소 들려서 엉망인 상태로 생에 첫 인생사진 컷 촬영한 가족사진 을왕리해수욕장에서 혼자 쓸쓸히 바다를 거닐던 세 남자아기 첫바다에는 무섭다고 울고불고 하는게 정상아닌가 근데 쟨 왜 더 좋아서 물에 들어가려는건지   겁이 많은거야 없는거야 알수가없는아이네   간 놀고 날이추워서 부랴부랴 동네로 넘어오려다가 울아들 선물사줄겸 홈플러스가서 장보고 너능좋겠다 혼자 선물 개나 받고   집에 다되서 도착 정말 개피곤하다   요번에 고생한 아범덕에 우린 재밋게 잘 다녔네요 다음엔 키즈팬션가쟈 고맙고 사랑하는 우리가족 다들 아프디말고 건강하게 잘 뭉쳐서 행복한 인생살자뀨 오늘하루도 언능 마무리하고 내일부턴 다시 일상으로 궈궈해야지 어린이날선물 어린이날 선물만 개째 부럽다너 을왕리해수욕장 홈플러스강서점 명륜진사갈비 시댁 친정 화곡본동 바다 인천 서해 썰물 밀물 넘나좋아하는아이 귀여워 비글 독박육아 헬육아 데일리 일상 육아 오오디티 애엄마 소통환영 맞팔 좋반 언팔금지

    을왕리해수욕장 밤바다 조개구이 냠냠 즉흥으로 밤바다 보기 죠아죠앙 내일 출근실화임 난 젊으니까 날새고 출근 할수있떠   인천 월미도 을왕리 바다 해수욕장 여행 우정여행 출근 일상 소통 데일리 맞팔 먹스타그램 술스타그램 팔로우 좋아요

    솔직후기 맛있는 쌉밥정식을 먹고왔답니다 월래는 송도신도시에있는 가격비슷한 한정식에가려고했지만 어떤길을 보시더니 이리로빠지면 공항가는길에 쌈밥정식이있다면서 신랑한테 애기하니 순식간에 급 빠져버리더라고요 일단주차를 해야하니 주차할곳을 찾는데 바로앞 넓은주자장있군용 하지만 정확히 주차할수잇는곳은 자리에 비해 많은편은 아닌듯 한참 차많이 들어오면 그냥 막더라도 주차해야될수도있답니다 그래도 가족단위로 많이 오는곳이기때문에 너무 많은차가있는건아니랍니다 여기는모든곳이 좌식으로 되어있어요 천장도 높고 넓직넓직해서 편안하게 앉을수있답니다 단 아기의자가필요하신분은 꼭 챙겨가셔야될거같아요 메뉴는쌈밥집이라고해서 이것저것있는건아니고 보쌈종류한가지만있어용 기본 돌솥정식 에 밑반찬이랑 국 쌈장 야채 돌솥 고기 생선 나오더라고요 돌솥밥이라그런지 주문하고 나오는시간이있더라고요 기다리는 여유를가지고 시키셔야될거에요 엄마말로는 정식 할때부터 간간히 왔다고하시더라고요 그럼 그만큼 오랫기간동안 한거같아서 검색해보니 대째 대물림받아서 영업하고계시다고하시더라고요 일단 밑반찬으로 나물종류가 가장많이 차지하고 보쌈 우렁쌈장 된장국 묵 동치미등 새우장까지 많이 나오더라고요 일단은 아기가있는저로써는 골고루 있을수록 아기가 먹을수있는 가지수가 많아서 너무 좋았어요 제일먼저 돌솥에서 밥을 푼후 안에 물을 쭈루루룩 넣어주고 뚜껑을 덥고 기다리는동안 밥이랑 고기랑 쓱쓱싹싹 먹어줍니당 항상야식으로 보쌈족발을 먹었떤저로써는 고기양이좀 부족하다고 생각했습니당 하지만 밑반찬이랑 마지막 숭늉까지 쭉 먹고 배터지는줄 알았다는거죠 혹 옥 시라도 고기 부족하신분은 중 대로 고기만따로 시킬수있으니부족한양을 채울수있습니다 된장국은 꾀큰사이즈로나온답니다 고기집에서 나오는사이즈로 나올줄알았는데 푸짐함에 놀랐다는거죠 여기또한 눈치없이 다시먹고싶은거는 또시킬수있다는장점이좋았고요 서빙하시는분들도 친절하신거같아서 좋았어요 남편이 전에도 한번가자고했는데 거기까지 가기싫다고해서 안왔는데 다음에 남편이가자고하면 말없이 가야될거같아요 진짜 싹싹 먹었습니다 여기는 거의 좋았던 기억만 남았네요 배부르게 먹고 주변에 을왕리해수욕장이랑 선녀바위가잇는데 선녀바위는 태풍이랑파도때문에 많이 깍인걸로알고있습니다 고래도 해변가를 한번쭉걸으면 많이 소화되더라고요 그럼또 근처에 카페가많아서 커피한잔마시면 꺄 맛집와서 맛있는거먹고 가벼운여행하는기분으로 일석이조 다음에또갈세용 사장님 그때도이렇게 맛나게 해주세용 늘목 인천 중구 용유서로 예약가능 을왕리해수욕장 을왕리맛집 공항가는길 공항가는길맛집 맛집 인천맛집 늘목 쌈밥 쌈밥정식 늘목위치 선녀바위 아가옷 솔직후기 후기 먹그램

     

     

    summarizer.R

    KeysentenceSummarizer의 R에 각 문장의 PageRank가 저장되어 있는데,

    뉴스의 경우는 첫 문장이 중요도가 높게 설정되는 것을 볼 수 있다고 한다.

    이 중요도를 조정해서 앞 부분 또는 뒷 부분에 중요하다고 가정할 수 있다.

    SNS 데이터의 경우는 딱히 설정해주지 않아도 될 것 같아서 내버려 두었다.

     

     

     

     

    TextRank의 문제점(?)은 중요한 단어가 많이 포함되어 있는 문장을 핵심 문장으로 선택한다는 것이다.

    때문에 핵심 문장으로 비슷한 문장이 추출된다.

    따라서 뉴스 같은 비슷한 문장이 거의 없는 데이터의 경우 유효하지만 그 외에는 유용하지 않을 수 있다.

    다음 포스팅에는 similarity 외에 diversity를 고려하는 핵심 문장 추출 기법에 대해 살펴보도록 하겠다.

     

     

     

    References

     

    https://github.com/lovit/textrank

    Efficient unsupervised keywords extraction using graphs

    네이버 블로그로 동시출현단어 분석

    NLP :: TextRank 키워드 추출 알고리즘

     

     

    댓글

Designed by Tistory.