首页 > 解决方案 > 在 python pandas 中提取和计算表情符号

问题描述

我有一个具有这种结构的 csv 文件(如果更容易,也以 json 的形式存在):例如

id,created_at,text,author_id
1432691762007400458,2021-08-31T13:08:28.000Z,"9月1日㈬は…\n\n♦️18:50〜 山岸一生\n『練馬から変える!国会を創る!キックオフ集会』\nhttpstest\n\n♦️20:30~ 辻元清美\n#りっけんチャンネル\n「コロナ禍・五輪から見えた""おっさん政治""の実態」について\nhttpsxzt\n\n【テレビ】\n♦️19:30~ 玄葉光一郎\nBS-TBS「報道1930」",951781409470889984
1432687902148816898,2021-08-31T12:53:08.000Z,やはり別の地平であったか...\n\nコロナ禍五輪\n貴重な物資をなぜ捨てる?,1227501971742937088

我找到了这个:

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['en'] for char in word):
            emoji_list.append(word)
    
    return emoji_list

但是,我首先需要导入 csv 并将查询限制为“文本”列,对吗?所以我想知道我是否可以像这样设置它:

import csv
import re
import pandas as pd
import emoji
import regex

df = pd.read_csv('/Users/hidden/testfile.csv')
df = df[['id','created_at','text','author_id']]

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

但是,这样它甚至不会启动模块“表情符号”。我是否需要下载一个额外的包(我已经通过 pip 安装了表情包)。还有没有办法获得表情符号+表情符号计数的新列表?比如像这样:

2 1 对不起,MWE 非常不足,请和我一起裸露。

标签: pythonpandasemoji

解决方案


首先,您必须只使用文本列。然后在你的代码中,有一个错误

data = regex.findall(r'\X', 'text')您对错误的文本变量使用引号。如果您想计算表情符号的数量,请使用 Counter 库,如下所示:

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

df =pd.DataFrame([{'id':1432691762007400458,'created_at':"2021-08-31T13:08:28.000Z",'text':"9月1日㈬は…\n\n♦️18:50〜 山岸一生\n『練馬から変える!国会を創る!キックオフ集会』\nhttpstest\n\n♦️20:30~ 辻元清美\n#りっけんチャンネル\n「コロナ禍・五輪から見えた""おっさん政治""の実態」について\nhttpsxzt\n\n【テレビ】\n♦️19:30~ 玄葉光一郎\nBS-TBS「報道1930」",'author_id':951781409470889984},
{'id':1432687902148816898,'created_at':"2021-08-31T12:53:08.000Z",'text':"やはり別の地平であったか...\n\nコロナ禍五輪\n貴重な物資をなぜ捨てる?",'author_id':1227501971742937088}])

text = df['text']
emoji_list= [] 
for t in text:
  emoji_list=emoji_list+split_count(t)


from collections import Counter

print(Counter(emoji_list))


------------------
output:
Counter({'♦️': 3, '': 2, '': 2})

请注意,某些文本可能在 HTML 编码中包含 emoji,因此无法检测到这些 emoji 我建议您在 split_count 函数的开头使用 `text = html.unescape(text)' 将此 emoji 转换为 Unicode 格式。您可能需要为此部分安装HTMLParser 。

还有其他库两个预处理文本并将它们用于您的目的。像ekphrasis图书馆。可以添加自定义表情符号字典。

此外,您可以像以下代码一样从头开始编写它:

emoticons = [':-)', ':)', '(:', '(-:', ':))', '((:', ':-D', ':D', 'X-D', 'XD', 'xD', 'xD', '<3', '</3', ':\*',
                 ';-)',
                 ';)', ';-D', ';D', '(;', '(-;', ':-(', ':(', '(:', '(-:', ':,(', ':\'(', ':"(', ':((', ':D', '=D',
                 '=)',
                 '(=', '=(', ')=', '=-O', 'O-=', ':o', 'o:', 'O:', 'O:', ':-o', 'o-:', ':P', ':p', ':S', ':s', ':@',
                 ':>',
                 ':<', '^_^', '^.^', '>.>', 'T_T', 'T-T', '-.-', '*.*', '~.~', ':*', ':-*', 'xP', 'XP', 'XP', 'Xp',
                 ':-|',
                 ':->', ':-<', '$_$', '8-)', ':-P', ':-p', '=P', '=p', ':*)', '*-*', 'B-)', 'O.o', 'X-(', ')-X']

def split_count(text):
    text = html.unescape(text)
    emoji_list = []
    data = regex.findall(r'\X', text)
    for word in data:
        if any(char in emoji.UNICODE_EMOJI['en'] for char in word):
            emoji_list.append(word)
    
    for word in text.split(' '):
        if word in emoticons :
          emoji_list.append(word)

    return emoji_list

推荐阅读