word2vec로 emoji에서 i 모드 이모티콘으로 변환
tr;dr
CA의 헤세이 마지막 해커슨에서 emoji에서 i 모드 이모티콘으로 변환하는 시스템을 자연 언어 처리와 기계 학습을 사용하여 구현했으므로 소개한다. 형태소 분석에는 MeCab, 기계 학습에는 Word2Vec을 사용했다. emoji와 i 모드 이모티콘을 한번 벡터하고 코사인 유사도를 사용하여 유사도가 높은 i 모드 이모티콘을 냈다. 이러한 기술을 사용하면 약 1000 개의 모든 이모지를 약 170 개의 i 모드 이모티콘으로 변환 할 수 있습니다.
 
 어떻게 할까
 emoji-ja을 사용하여 emoji 레이블을 얻습니다. 그런 다음 단어 벡터를 얻습니다. 다음으로 i 모드 이모티콘의 라벨을 벡터화하고 emoji의 라벨과 유사도가 높은 i 모드 이모티콘을 제안한다
 사용하는 기술
emoji-ja을 사용하여 emoji 레이블을 얻습니다. 그런 다음 단어 벡터를 얻습니다. 다음으로 i 모드 이모티콘의 라벨을 벡터화하고 emoji의 라벨과 유사도가 높은 i 모드 이모티콘을 제안한다
사용하는 기술
방법
 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"
 결과
 좋은 결과
 
 나쁜 결과
 
 요약
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')
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')
from gensim.models import KeyedVectors
model_dir = "entity_vector.model.bin"
model = KeyedVectors.load_word2vec_format(model_dir, binary=True)
"🍺": {
        "keywords": [
            "ジョッキ",
            "バー",
            "ビール",
            "ビールジョッキ",
            "居酒屋"
        ],
        "short_name": "ビールジョッキ",
        "group": "飲み物と食べ物",
        "subgroup": "飲み物"
}
# emojiの読み込み
emoji_dir = "{emoji_ja.jsonのパス}"
emoji_json_file = open(emoji_dir, "r")
emoji_json = json.load(emoji_json_file)
def emoji_to_text_lists(emoji):
    text_lists = emoji_json[emoji]["keywords"]
    return text_lists
##こんなのが返ってくるよ的な記述
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
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])
def imode_emoji_to_vector(text):
    try:
        imode_emoji_vector = model.wv[text]
    except:
        imode_emoji_vector = np.zeros(200)
    return imode_emoji_vector
def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
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"
좋은 결과

나쁜 결과

요약
마지막으로
이번에, 헤세이 마지막 해커슨에서, 「헤세이의 커뮤니케이션 수단을 체험하는 시스템」을 개발하기 위해서, 이러한 것을 개발할 수 있었습니다.
내 시스템이 내놓은 결과를 좋은 느낌으로 웹 앱으로 표시해 주었다 @kubo_programer 씨, @ptero1d 씨, 함께 팀을 구성해 주셔서 감사합니다.
그리고 헤세이 마지막 해커슨을 기획해 주신 CyberAgent 여러분 감사합니다.
감사의 뜻을 담아, 탭플에 과금해 연애 즐깁니다! (웃음)
소스 코드는 여기입니다.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(word2vec로 emoji에서 i 모드 이모티콘으로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/koh_hei128/items/b849c0f9e7d488cd5eb2
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
Reference
이 문제에 관하여(word2vec로 emoji에서 i 모드 이모티콘으로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/koh_hei128/items/b849c0f9e7d488cd5eb2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)