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
正規表現で一致させる
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ライブラリのドキュメント