web-dev-qa-db-ja.com

テキストからすべての絵文字を抽出する方法は?

次のリストを考慮してください。

a_list = ['???? ???? me así, bla es se ???? ds ????????????']

a_list内のすべての絵文字を新しいリストで抽出するにはどうすればよいですか?:

new_lis = ['???? ???? ???? ???? ???? ????']

正規表現を使用しようとしましたが、可能なすべての絵文字エンコーディングがありません。

33
tumbleweed

emoji ライブラリを使用できます。 emoji.UNICODE_EMOJIに含まれているかどうかを確認することにより、単一のコードポイントが絵文字コードポイントであるかどうかを確認できます。

import emoji

def extract_emojis(str):
  return ''.join(c for c in str if c in emoji.UNICODE_EMOJI)
46
Pedro Castilho

以前の回答は???? ‍ ???? ‍ ???? ‍ ????のような絵文字では機能しないことを指摘することが重要だと思います、4つの絵文字で構成されているため、... in emoji.UNICODE_EMOJIを使用すると4つの異なる絵文字が返されます。 ????????のような肌の色の絵文字でも同じです。

私のソリューションには emojiregex モジュールが含まれています。正規表現モジュールは、書記素クラスター(単一文字としてレンダリングされたUnicodeコードポイントのシーケンス)の認識をサポートしているため、???? ‍ ???? ‍ ???? ‍ ????のような絵文字をカウントできます。

import emoji
import regex

def split_count(text):

    emoji_list = []
    data = regex.findall(r'\X', text)
    for Word in data:
        if any(char in emoji.UNICODE_EMOJI for char in Word):
            emoji_list.append(Word)

    return emoji_list

テスト(肌の色で絵文字を追加):

line = ["???? ???? me así, se ???? ds ???????????? hello ????????‍???? emoji hello ????‍????‍????‍???? how are ???? you today????????????????"]

counter = split_count(line[0])
print(' '.join(emoji for emoji in counter))

出力:

???? ???? ???? ???? ???? ???? ????????‍???? ????‍????‍????‍???? ???? ???????? ????????

編集:

????????のようなフラグを含める場合Unicodeの範囲は ???? から ???? になるため、以下を追加します。

flags = regex.findall(u'[\U0001F1E6-\U0001F1FF]', text) 

上記の関数、およびreturn emoji_list + flags

フラグの詳細については、 this post を参照してください。

9
sheldonzy

外部ライブラリを使用したくない場合は、Pythonの方法として、正規表現とre.findall()を適切な正規表現とともに使用して絵文字を見つけることができます。

In [74]: import re
In [75]: re.findall(r'[^\w\s,]', a_list[0])
Out[75]: ['????', '????', '????', '????', '????', '????']

正規表現r'[^\w\s,]'は、Word文字、空白文字、またはコンマ以外の文字に一致する否定文字クラスです。

コメントで述べたように、テキストには通常、Wordの文字と句読点が含まれており、このアプローチで簡単に処理できます。他の場合は、文字クラスに手動で追加するだけです。文字クラスで文字の範囲を指定できるため、より短く、より柔軟にすることもできます。

別の解決策は、否定文字クラスの代わりに非絵文字を除外することで、絵文字を受け入れる文字クラスを使用することです([]なしの^)。たくさんの絵文字があります 異なるユニコード値で 、文字クラスに範囲を追加するだけです。より多くの絵文字を照合したい場合は、異なる絵文字のそれぞれの範囲を持つすべての標準的な絵文字を含む良いリファレンスがあります http://apps.timwhitlock.info/emoji/tables/unicode

7
Kasramvd

最高評価の回答が常に機能するとは限りません。たとえば、フラグ絵文字は見つかりません。文字列を考えてみましょう:

s = u'Hello \U0001f1f7\U0001f1fa hello'

うまくいくのは

import emoji
emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys())
r = re.compile('|'.join(re.escape(p) for p in emojis_list))
print(' '.join(r.findall(s)))
4
user594836

タンブルウィードが求めるものを正確に取得するためのソリューションは、最高評価の回答とuser594836の回答をミックスすることです。これはPython 3.6で機能するコードです。

import emoji
import re

test_list=['???? ???? me así,bla es,se ???? ds ????????????']

## Create the function to extract the emojis
def extract_emojis(a_list):
    emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys())
    r = re.compile('|'.join(re.escape(p) for p in emojis_list))
    aux=[' '.join(r.findall(s)) for s in a_list]
    return(aux)

## Execute the function
extract_emojis(test_list)

## the output
['???? ???? ???? ???? ???? ????']
3
iair linker
from emoji import *

EMOJI_SET = set()

# populate EMOJI_DICT
def pop_emoji_dict():
    for emoji in UNICODE_EMOJI:
        EMOJI_SET.add(emoji)

# check if emoji
def is_emoji(s):
    for letter in s:
        if letter in EMOJI_SET:
            return True
    return False

これは、毎回すべての絵文字をループする必要がないため、大規模なデータセットを使用する場合の優れたソリューションです。より良い結果を得るためにこれを見つけました:)

2
sushi_dev

ステップ1:テキストがutf-8でデコードされていることを確認してくださいtext.decode('utf-8')

ステップ2:テキストからすべての絵文字を見つけます。テキストごとに文字を区切る必要があります[str for str in decode]

ステップ3:すべての絵文字をリストに保存します[c for c in allchars if c in emoji.UNICODE_EMOJI]以下の完全な例:

>>> import emoji
>>> text     = "???? ???? me así, bla es se ???? ds ????????????"
>>> decode   = text.decode('utf-8')
>>> allchars = [str for str in decode]
>>> list     = [c for c in allchars if c in emoji.UNICODE_EMOJI]
>>> print list
[u'\U0001f914', u'\U0001f648', u'\U0001f60c', u'\U0001f495', u'\U0001f46d', u'\U0001f459']

テキストから削除したい場合

>>> filtred  = [str for str in decode.split() if not any(i in str for i in list)]
>>> clean_text = ' '.join(filtred)
>>> print clean_text
me así, bla es se ds
2
Cornea Valentin

わかりました-私はこの同じ問題を抱えていたので、ライブラリ(絵文字やreなど)をインポートする必要がなく、1行のコードであるソリューションを作成しました。文字列内のすべての絵文字を返します:

def extract_emojis(sentence):
    return [Word for Word in sentence.split() if str(Word.encode('unicode-escape'))[2] == '\\' ]

これにより、軽量なソリューションを作成することができ、すべての人に役立つことを願っています。実際には、文字列内の絵文字を除外するものが必要でした-それは上記のコードと同じですが、わずかな変更が1つあります:

def filter_emojis(sentence):
        return [Word for Word in sentence.split() if str(Word.encode('unicode-escape'))[2] != '\\' ]

動作中の例を次に示します。

  • a = '???? ????私のように、bla es se ???? ds ???????????? '
  • b = extract_emojis(a)
  • b = ['????'、 '????'、 '????'、 '????????????']
0

この関数は文字列を想定しているため、入力のリストを文字列に変換します

a_list = '???? ???? me así, bla es se ???? ds ????????????'

# Import the necessary modules
from nltk.tokenize import regexp_tokenize

# Tokenize and print only emoji
emoji = "['\U0001F300-\U0001F5FF'|'\U0001F600-\U0001F64F'|'\U0001F680- 
 \U0001F6FF'|'\u2600-\u26FF\u2700-\u27BF']"

print(regexp_tokenize(a_list, emoji)) 

output :['????', '????', '????', '????', '????']
0
Amar