본문 바로가기

Elastic Search

[Elastic Search] MBTI 검색 프로젝트 - 2. Emoji 검색 및 Aggregation

반응형

MBTI 별 특성을 파악하는 프로젝트를 진행 중입니다. 수집된 텍스트들을 보니 이모지가 많이 사용되고 있는 걸 찾을 수 있었습니다.

###Q: Emoji가 ElasticSearch 에서 검색이 되나요?
###A: 네 Emoji도 텍스트로 취급되기 때문에 검색이 잘 됩니다!

하지만 모든 이모지를 검색하여 문서 수가 얼마나 있는지 파악하기는 쉽지 않습니다. 그래서 이미 수집된 데이터에서 이모지만 파싱 해봅시다.
저는 Python의 Regex를 이용해서 이모지를 추출했습니다.

import pandas as pd
import re

# ... DB에서 데이터를 가져오는 부분은 생략
# df는 칼럼으로 contents(수집된 텍스트), doc_url(텍스트의 url)을 가지고 있음

emoji_pattern = re.compile("["
        u"\U0001F600-\U0001F64F"  # emoticons
        u"\U0001F300-\U0001F5FF"  # symbols & pictographs
        u"\U0001F680-\U0001F6FF"  # transport & map symbols
        u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                           "]+", flags=re.UNICODE)

# emoji_set 에 원문에서 파싱한 모든 이모지를 수집함
result, emoji_set = [], []
for idx, row in df.iterrows():
    cont, url = row['contents'], row['doc_url']
    emoji_list = emoji_pattern.findall(cont)
    if not emoji_list:
        continue
    emoji_list = ''.join(emoji_list)
    emj_set = list(set([e for e in emoji_list]))
    result.append({url: emj_set})
    emoji_set.extend(emj_set)
    
# set 함수를 사용해 중복을 제거함
emoji_set = list(set(emoji_set))

# 엘라스틱서치에 연결
es = elasticsearch.Elasticsearch(["<URL>"])

# emoji를 파싱하는 함수
def parse_emoji(t, e):
    """
    :params t: elasticsearch 결과
    :params e: emoji
    """
    
    result_list = t.body.get('aggregations', {}).get('mbti_types', {}).get('buckets', [])
    parse_meta = {r['key']:r['doc_count'] for r in result_list}
    parse_meta = dict({'emoji': e}, **parse_meta)
    
    # {"emoji": "emoji", "MBTI-TYPE": 1 ...}
    return parse_meta

# 쿼리에 이모지를 넣어 각 이모지별 결과를 구함
parse_list = []
for e in emoji_set:
    query = {
        "size": 0, 
        "query": {
          "match": {
            "contents": e
          }
          },
        "aggs": {
          "mbti_types": {
            "terms": {
              "field": "keyword",
              "size": 16
            }
          }
        }
    }
    t = es.search(index='mbti', body=query)
    parse_list.append(parse_emoji(t, e))

출처: https://studyprogram.tistory.com/1

 

Python에서 텍스트 안의 이모지(emoji)제거하기

파이썬으로 텍스트를 처리하던 도중 안에 이모지가 있으면 처리를 못해서 에러가 나는 일이 있었습니다. 셀레니움 find_element_by_*****.send_key(text) 에서 text에 이모지가 있을 때 WebDriverException: unkno..

studyprogram.tistory.com

이를 통해 얻은 결과는 다음과 같습니다.

대략적인 결과이지만, 이를 RDB에 Insert 하여 결과를 종합해야 할 것 같습니다.

 

하지만 생각해봐야 할 것이 있습니다. 콘텐츠는 앞으로 계속 수집될 것이고 이미 있는 이모지라면 카운트가 계속 Update 되는 형태가 되어야 합니다. 업데이트가 자주 일어나는 환경에서는 RDB를 사용하는 것이 좋지 않습니다.

이에 방향은 2가지를 생각해봐야 합니다.

1. RDB 외에 다른 DB를 사용한다(Document DB or NoSQL)

2. 일자별, MBTI 유형별 이모지의 문서 수를 집계한다.

3. Elastic Search Query에서 집계 함수를 사용하여 해결한다.

 

현재 Elastic Search를 공부 중이니, 다음에는 3번 해결방안을 만들어보겠습니다.

반응형