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.)
Reference
이 문제에 관하여(word2vec로 emoji에서 i 모드 이모티콘으로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/koh_hei128/items/b849c0f9e7d488cd5eb2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)