python - 在 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 非常不足,请和我一起裸露。
解决方案
首先,您必须只使用文本列。然后在你的代码中,有一个错误
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