【问题标题】:Compare two CSV files and search for similar emoji比较两个 CSV 文件并搜索相似的表情符号
【发布时间】:2020-12-14 02:27:13
【问题描述】:

假设我有两个 CSV 文件,每个文件都包含不同的表情符号。

第一个 CSV 包含具有相应 Unicode 的所有表情符号的列表(此处为提问而缩短):

Emojis     Unicode
????         1F600
????         1F603
????         1F604
????         1F601
????         1F606
????         1F605
????         1F525
✨         2728

第二个 CSV 包含一个较短的从 Twitter 帖子中抽取的随机表情符号列表

Emojis     Freq.     
????          45
????           3
????          93
????          39
✨          35

我正在尝试找出一种解决方案,该解决方案将使用 Unicode 创建一个新列,该列对应于 SECOND CSV 文件的每一行中的表情符号。最终结果会是这样的:

Emojis     Freq.     Unicode     
????          45       1F600
????           3        1F525
????          93       1F603
????          39       1F601
✨          35       2728

我能找到的最接近的问题是here,但在我的情况下它不起作用......

我正在使用 Python 3.9

【问题讨论】:

  • 表情符号只是文本,您可以将它们用作字典键

标签: python csv emoji


【解决方案1】:

您可以将第二个 csv 读入单个 dict,然后根据该 dict 过滤第一个。

with open('freqs.csv', newline='') as f:
    reader = csv.reader(f)
    # Skip the header row, if there is one
    next(reader)
    freqs = {emoji: frequency for (emoji, frequency) in reader}


with open('emoji.csv', newline='') as f:
    reader = csv.reader(f)
    # skip the header
    next(reader)
    # Find the rows that have a matching frequency 
    filtered_rows = [row for row in reader if row[0] in freqs.keys()]

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['Emojis', 'freq', 'unicode'])
    for row in filtered_rows:
        emoji = row[0]
        row.insert(1, freqs[emoji])
        writer.writerow(row)

【讨论】:

  • 在我的回答中被赞成和被盗,并进行了改编。
  • @tripleee 没问题 :-) 我从你的 unicode 答案中学到了很多。
  • @snakecharmerb 我尝试了您的解决方案,但在“output.csv”上没有写入任何内容。检查出了什么问题,很明显,filtered_rows 列表是空的。不确定这是否应该发生。
  • @KosuK。该代码适用于我,使用问题中的数据。要检查的内容可能包括:文件结构与问题中的相同(没有额外的列或顺序差异);值中没有前导或尾随空格;正如 Tripleee 所观察到的,您可能需要规范化表情符号以确保一切都匹配。同时打印出freqs字典;如果看起来不错,那么它的键和 emoji csv 中的值一定不匹配。
【解决方案2】:

一个复杂的问题是,例如。 Tweepy 通常为您提供奇怪且实际上无效的代理格式的表情符号(因为 UTF-8 明确禁止使用代理,这实际上只是作为 UTF-16 的兼容性黑客)。您需要执行 Unicode 规范化以正确比较两个 Unicode 字符串,除此之外,处理输入中存在的代理项。

这是对 snakecharmerb's answer 的修改,添加了这个,我还将第二个循环更改为一次只操作一行。

from unicodedata import normalize
import csv

defun normalize_with_surrogate(s):
    "See https://stackoverflow.com/a/54549164/874188"
    return normalize('NFKD', s.encode('utf-16', 'surrogatepass').decode('utf-16'))

with open('freqs.csv', newline='') as f:
    reader = csv.reader(f)
    next(reader)
    freqs = {normalize_with_surrogate(emoji): frequency for (emoji, frequency) in reader}

with open('emoji.csv', newline='') as f, open('output.csv', 'w', newline='') as o:
    reader = csv.reader(f)
    writer = csv.writer(o)
    next(reader)
    # The world will be a more beautiful place without this
    writer.writerow(['Emojis', 'freq', 'unicode'])

    for row in reader:
        emoji = normalize_with_surrogate(row[0])
        if emoji in freqs:
            row.insert(1, freqs[emoji])
            writer.writerow(row)

当然,如果 Emojis 文件真的只包含每个 emoji 的代码点,那么您根本不需要那个文件;只需打印'%05X' % ord(emoji) (该文件似乎也是错误的;您示例中的第一个实际上是U+1F603)。

【讨论】:

    【解决方案3】:

    您可以使用 pandas 进行左连接(合并)以返回匹配的 unicode 值。

    import pandas as pd
    df_all = pd.read_csv('all_emojis.csv')
    df_twitter = pd.read_csv('twitter_emojis.csv')
    
    output = df_twitter.merge(df_all, on='Emojis', how='left')
    
    # To write to csv
    output.to_csv('twitter_emojis_with_unicode.csv', index=False)
    

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多