• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

emoji

date: 2017-04-04 excerpt: emojiのハンドリングについて

tag: nlpmecabemoji


emojiのハンドリングについて

概要

  • unicode.orgで規格が定義されている
    • https://unicode.org/emoji/charts/full-emoji-list.html
  • 正規表現でハンドリングする
  • 形態素解析で抽出すると、絵文字は記号となるが、絵文字のみを集めたい場合、すべてのemojiを取得し、一致したものでフィルタリングすれば良い
    • emojiというライブラリも登場しており、ライブラリ経由で操作するのが安全

emojiライブラリを使用する

インストール

$ python3 -m pip install emoji

使用例

%pip install emoji
import emoji
import pprint
pp = pprint.PrettyPrinter(indent=2, width=120, depth=6)

pp.pprint(emoji.EMOJI_DATA) # すべての絵文字とその情報をdictでダンプ

assert emoji.demojize("🍔") == ":hamburger:" # 絵文字を文字に変換
assert emoji.emojize(":hamburger:") == "🍔" # 文字を絵文字に変換

Google Colab

  • emoji-example

正規表現で一致させる

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

# 使い方
if eomoji_pattern.match(word) or emoji_extra.match(word):
    ...

すべてのemojiをオンラインから取得

  • 毎年増える絵文字に正規表現で対応するのは難しいので、オンラインから絵文字の一覧を取得してしまう方法
import re
import os

def emoji_filter(tf: pd.DataFrame) -> pd.DataFrame:
    # 必要に応じて有効化
    # os.system("wget https://unicode.org/emoji/charts/full-emoji-list.html -O /tmp/full-emoji-list.html")
    with open("/tmp/full-emoji-list.html") as fp:
        text = fp.read()
    # parse "<td class='code'><a href='#1f600' name='1f600'>U+1F600</a></td>" lines
    emojis = []
    for code in re.findall("<td class='code'><a href=.*?>(.*?)</a></td>", text):
          # ref. parse unicode like format https://stackoverflow.com/questions/41597657/converting-from-u-unicode-string-definition-to-true-unicode-character
        emoji = "".join([chr(int(x[2:], 16)) for x in code.split()])
        emojis.append(emoji)
    # デバッグ用
    # print(*EMOJIS, sep="\n")
    tf = tf[tf["term"].apply(lambda x: True if len(x) >= 2 or x in emojis else False)]
    return tf
tf = emoji_filter(tf)

ゼロ幅接合文字で表現される絵文字(zero width joiner)

  • 特定の属性を示して絵文字の表現を拡張するためにゼロ幅接合文字が使われることがある
  • 形態素解析を行うと<U+200D> + ♀のような表現が合われる時、ある絵文字の属性を女性にしたという意味である
  • pythonではre.sub("\u200d", "", str)などすると取り除くことができる
  • moshはOSのwcwidth関数の実装が特殊で、絵文字の幅が2となるため、moshで絵文字を表示すると文字がずれることがある

e.g.

  • 女性がサイクリングしている絵文字 =「🚴 + \U+200D + ♀」

参考

  • emoji/carpedm20.github.io
    • emojiライブラリのドキュメント


nlpmecabemoji Share Tweet