用python

时间:2017-11-22 09:14:54

标签: python-3.x nlp list-comprehension

这是我在stackoverflow上的第一篇帖子/问题!

尝试替换表情符号(包含在元组中的列表中)时出现问题。这是代码:

emoticons = [('SMILE',[':-)', ':)', '(:', '(-:']),
        ('LAUGH',[':-D', ':D', 'X-D', 'XD', 'xD']),
        ('LOVE', ['<3', ':\*']),
        ('WINK', [';-)', ';)', ';-D', ';D', '(;', '(-;']),
        ('FROWN', [':-(', ':(', '(:', '(-:']),
        ('CRY', [':,(', ':\'(', ':"(', ':(('])]


def token_to_emot(token):
    for (emoji, smileys) in emoticons:
        if token in smileys:
            converted = token.replace(token, emoji)
            return converted
        else:
            return token

sample_tweet = ['It', 'was', 'amazing', ':)']
processed_tweet = [token_to_emot(token) for token in sample_tweet]
print(processed_tweet)

第一次尝试产生了预期的输出:

['It', 'was', 'amazing', 'SMILE']

但是,如果我使用剩余元组中的表情符号进行测试,则代码不起作用且不会转换表情符号。有人可以帮我找出列表理解有什么问题吗?或者可能建议另一种将表情符号转换为字符串的方法? 谢谢!

3 个答案:

答案 0 :(得分:0)

无论是否找到表情符号,都会返回循环的第一次迭代。 相反,您应该首先完成遍历整个emoticons列表的迭代,如果没有找到替换,则只返回未转换的令牌:

def token_to_emot(token):
    for (emoji, smileys) in emoticons:
        if token in smileys:
            converted = token.replace(token, emoji)
            return converted

    # Note this is AFTER the for loop is exhausted.    
    return token

答案 1 :(得分:0)

问题在于“其他”陈述

def token_to_emot(token):
  for (emoji, smileys) in emoticons:
      if token in smileys:
          converted = token.replace(token, emoji)
          return converted
      else:
          return token

如果在第一个表情符号数组中找不到笑脸,则返回令牌。

将其修改为: -

def token_to_emot(token):
  for (emoji, smileys) in emoticons:
      if token in smileys:
          converted = token.replace(token, emoji)
          return converted
  else:
      return token 
      # return token only and only if token!=smileys for all emoticons

此外,您还可以使用: -

sample_tweet = ['It', 'was', 'amazing', ':)']
processed_tweet = list(map(token_to_emot, sample_tweet))

答案 2 :(得分:0)

我为此使用了dictionary,因为它运行得更快,特别是您处理的推文越多。此外,您可以使用漂亮,可读的列表解析来大幅减少代码。

关于速度的说明:

  1. 您当前的程序必须遍历字符串(O(n))内的每个标记的每个表情符号(O(n))。制作算法O(n^2)。你的技术更像O(ne),其中n是令牌数量,e是唯一表情符号的数量。所以,它不是字面上的O(n ^ 2)。但我用它来解释效率差异。

  2. 但是,在我的代码中,我们必须对每个标记进行字典检查(O(1))。这是我的O(n),当你处理大众的推文时会产生很大的不同。

  3. 代码

    emoticons = [('SMILE',[':-)', ':)', '(:', '(-:']),
            ('LAUGH',[':-D', ':D', 'X-D', 'XD', 'xD']),
            ('LOVE', ['<3', ':\*']),
            ('WINK', [';-)', ';)', ';-D', ';D', '(;', '(-;']),
            ('FROWN', [':-(', ':(', '(:', '(-:']),
            ('CRY', [':,(', ':\'(', ':"(', ':(('])]
    
    emoticonDi = {e:string for string,emoji in emoticons for e in emoji}
    
    import re
    def convert_emoji(string):
        sample_tweet = string.split(" ")
        processed_tweet = [emoticonDi[v] if v in emoticonDi else v for v in sample_tweet]
        return processed_tweet
    
    print(convert_emoji('It was amazing :)'))