word2vec로 emoji에서 i 모드 이모티콘으로 변환

tr;dr



CA의 헤세이 마지막 해커슨에서 emoji에서 i 모드 이모티콘으로 변환하는 시스템을 자연 언어 처리와 기계 학습을 사용하여 구현했으므로 소개한다. 형태소 분석에는 MeCab, 기계 학습에는 Word2Vec을 사용했다. emoji와 i 모드 이모티콘을 한번 벡터하고 코사인 유사도를 사용하여 유사도가 높은 i 모드 이모티콘을 냈다. 이러한 기술을 사용하면 약 1000 개의 모든 이모지를 약 170 개의 i 모드 이모티콘으로 변환 할 수 있습니다.



어떻게 할까



emoji-ja을 사용하여 emoji 레이블을 얻습니다. 그런 다음 단어 벡터를 얻습니다. 다음으로 i 모드 이모티콘의 라벨을 벡터화하고 emoji의 라벨과 유사도가 높은 i 모드 이모티콘을 제안한다

사용하는 기술


  • MeCab
  • Word2vec
  • selenium (스크래핑)
  • urllib (이미지 다운로드)

  • 방법



    1. 스크래핑으로 i 모드 이모티콘 다운로드


    from selenium import webdriver
    import urllib.request
    
    
    driver = webdriver.Chrome("chromedriverのディレクトリ")
    driver.get("https://www.nttdocomo.co.jp/service/developer/make/content/pictograph/basic/index.html")
    
    # 画像のURL
    src = driver.find_element_by_xpath("""//*[@id="maincol"]/div[1]/div/div/table/tbody/tr[4]/td[2]/img""").get_attribute("src")
    # 画像の名前
    alt = driver.find_element_by_xpath("""//*[@id="maincol"]/div[1]/div/div/table/tbody/tr[4]/td[7]/span""")
    
    # 画像をダウンロードし画像の名前で保存
    urllib.request.urlretrieve(src, save_dir+alt+'.png')
    

    이것을 176장 반복
    for i in range(4,180):
        xpath_src = """//*[@id="maincol"]/div[1]/div/div/table/tbody/tr[{}]/td[2]/img""".format(i)
        xpath_alt = """//*[@id="maincol"]/div[1]/div/div/table/tbody/tr[{}]/td[7]/span""".format(i)
        src = driver.find_element_by_xpath(xpath_src).get_attribute("src")
        alt = driver.find_element_by_xpath(xpath_alt).text
        urllib.request.urlretrieve(src, save_dir+alt+'.png')
    

    2.word2vec 학습된 모델 로드



    h tp // w w. cl. 에세이. 도호쿠. 아 c. jp/~m-스즈키/쟈ぃき_ゔぇc와 r/에서 20170201.tar.bz2 (2017년 2월 1일판, 1.3GB, 압축 해제 후 2.6GB)을 다운로드하고,

    모델을 읽습니다.
    from gensim.models import KeyedVectors
    
    model_dir = "entity_vector.model.bin"
    
    model = KeyedVectors.load_word2vec_format(model_dir, binary=True)
    

    3. emoji 벡터화



    📙 UNICODE 이모티콘 일본어 읽기/키워드/분류 사전 📙

    를 사용하여 emoji의 일본어 읽기를 얻습니다.

    내용은 이런 느낌이다. 이번에는 "keywords"에 해당하는 부분을 사용했습니다.
    "🍺": {
            "keywords": [
                "ジョッキ",
                "バー",
                "ビール",
                "ビールジョッキ",
                "居酒屋"
            ],
            "short_name": "ビールジョッキ",
            "group": "飲み物と食べ物",
            "subgroup": "飲み物"
    }
    

    emoji_ko.json 로드
    # emojiの読み込み
    emoji_dir = "{emoji_ja.jsonのパス}"
    emoji_json_file = open(emoji_dir, "r")
    emoji_json = json.load(emoji_json_file)
    

    emoji에 대한 일본어 목록 얻기
    def emoji_to_text_lists(emoji):
        text_lists = emoji_json[emoji]["keywords"]
        return text_lists
    ##こんなのが返ってくるよ的な記述
    

    emoji를 벡터화
    def emoji_to_vector(word_list, word_i=0):
        if word_i > 10:
            return np.zeros(200)
        try:
            vector = model.wv[word_list[word_i]]
        except:
            word_i = word_i + 1
            vector = emoji_to_vector(word_list, word_i)
        return vector
    

    4.i 모드 이모티콘 벡터화



    i 모드 이모티콘의 파일을 읽고 이름 만 목록을 만듭니다.
    from glob import glob
    # imode_emojiの読み込み
    imode_emoji_paths = glob("imode_emoji_data/*")
    
    imode_emoji_lists = []
    # ファイルパスから名前だけのリストを作成する
    for imode_emoji_file_path in imode_emoji_paths:
        imode_emoji_lists.append(os.path.splitext(os.path.basename(imode_emoji_file_path))[0])
    

    i 모드 이모티콘의 이름을 벡터화하는 함수 준비
    def imode_emoji_to_vector(text):
        try:
            imode_emoji_vector = model.wv[text]
        except:
            imode_emoji_vector = np.zeros(200)
        return imode_emoji_vector
    

    5. 유사도 계산식의 함수 준비



    이번에는 코사인 유사도 계산식을 준비했다.
    def cos_sim(v1, v2):
        return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
    

    6. emoji에서 가장 유사성이 높은 i 모드 이모티콘



    emoji를 인수로 i 모드 이모티콘의 파일 이름을 반환하는 함수를 준비했습니다.

    가능하면 최적화하고 싶습니다.
    def emoji_to_imode_emoji(emoji):
        max_simi_rate = 0
        max_simi_word = ""
        emoji_vector = emoji_to_vector(emoji_to_text_lists(emoji))
    
        for imode_emoji_name in imode_emoji_lists:
            # print(imode_emoji_name)
            imode_emoji_vector = imode_emoji_to_vector(imode_emoji_name)
            simi_rate = cos_sim(emoji_vector, imode_emoji_vector)
            if max_simi_rate < simi_rate:
                max_simi_rate = simi_rate
                max_simi_word = imode_emoji_name
    
        return max_simi_word + ".png"
    

    결과



    좋은 결과





    나쁜 결과





    요약


  • 자연 언어 처리와 기계 학습을 사용하여 emoji를 i 모드 이모티콘으로 변환했습니다.
  • 비교적 좋은 결과가 나왔다고 생각한다(정량화는 하지 않는다)
  • "모바 Q", "i 모드"등에 대응하는 emoji를 찾고 싶다

  • 마지막으로



    이번에, 헤세이 마지막 해커슨에서, 「헤세이의 커뮤니케이션 수단을 체험하는 시스템」을 개발하기 위해서, 이러한 것을 개발할 수 있었습니다.

    내 시스템이 내놓은 결과를 좋은 느낌으로 웹 앱으로 표시해 주었다 @kubo_programer 씨, @ptero1d 씨, 함께 팀을 구성해 주셔서 감사합니다.

    그리고 헤세이 마지막 해커슨을 기획해 주신 CyberAgent 여러분 감사합니다.
    감사의 뜻을 담아, 탭플에 과금해 연애 즐깁니다! (웃음)
    소스 코드는 여기입니다.

    좋은 웹페이지 즐겨찾기