这是我在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']
但是,如果我使用剩余元组中的表情符号进行测试,则代码不起作用且不会转换表情符号。有人可以帮我找出列表理解有什么问题吗?或者可能建议另一种将表情符号转换为字符串的方法? 谢谢!
答案 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
,因为它运行得更快,特别是您处理的推文越多。此外,您可以使用漂亮,可读的列表解析来大幅减少代码。
关于速度的说明:
您当前的程序必须遍历字符串(O(n)
)内的每个标记的每个表情符号(O(n)
)。制作算法O(n^2)
。你的技术更像O(ne)
,其中n是令牌数量,e是唯一表情符号的数量。所以,它不是字面上的O(n ^ 2)。但我用它来解释效率差异。
但是,在我的代码中,我们必须对每个标记进行字典检查(O(1)
)。这是我的O(n)
,当你处理大众的推文时会产生很大的不同。
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 :)'))