在必须重建文本时(使用标点符号和其他内容),在给定文本中翻译某些单词(或表达式)的常用方法是什么?
翻译来自查询表,涵盖单词,搭配和表情符号,如L33t,CUL8R,:-)等。
简单的字符串搜索和替换是不够的,因为它可以替换部分较长的单词(cat> dog≠> caterpillar> dogerpillar)。
假设以下输入:
s = "dogbert, started a dilbert dilbertion proces cat-bert :-)"
翻译后,我应该收到类似的内容:
result =“ anna ,开始 george dilbertion 流程 cat-bert 笑脸”
我不能简单地标记,因为我松散标点符号和单词位置。
正则表达式,适用于普通单词,但不会捕捉到像笑脸那样的特殊表达式:-)但确实如此。
re.sub(r'\bword\b','translation',s) ==> translation
re.sub(r'\b:-\)\b','smiley',s) ==> :-)
现在我正在使用上面提到的正则表达式,并简单替换非字母数字的单词,但它远非防弹。
(p.s。我正在使用python)
答案 0 :(得分:1)
你的笑脸示例不适用于正则表达式的原因是\ b指的是单词边界。由于笑脸中没有“单词”字符,因此没有单词边界,因此表达式不匹配。你可以使用lookaheads / lookbehinds来查看你是否被空格限制,但考虑到你的表情符号是用标点符号来检查标点符号可能很困难。
答案 1 :(得分:0)
问题不在于正则表达式不能与表情符号相匹配(这根本不是真的:P),而是表达了笑脸的正则表达式。
在python文档中,边界\b
的描述如下:
匹配空字符串,但仅匹配单词的开头或结尾。单词被定义为Unicode字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字的非下划线Unicode字符表示。请注意,正式地,\ b被定义为\ w和\ W字符之间的边界(反之亦然)。
现在的问题是像:
,-
和)
这样的符号本身就是字边界,所以它们特别是而不是字,因此与\w
不符。因此,笑脸之前的空间不被识别为单词边界(仅仅因为没有单词跟随)。
因此,如果您想要匹配表情符号,则无法使用\b
,但必须检查空格或其他内容。
答案 2 :(得分:0)
如果您正在寻找非正则表达式解决方案,那么这就是我的想法。以下是我将使用的步骤。
的制备:将
搜索和替换:
您可以阅读有关三元搜索树here的信息。有三元搜索树python实现,但你可以简单地制作自己的。这种方法的主要问题是如果在单词之前有标点符号(如“)”,但可以轻松处理。
答案 3 :(得分:0)
我有一个类似的问题,标准表情符号被替换为值。 Here是表情符号列表。我把它们放在一个纯文本文件中(这样我就可以在需要的时候附加/删除它),用tab分隔。
:[ -1
:/ -1
:( -1
:) 1
然后将其读入字典
emoticons = {}
for line in open('data/emoticons.txt').xreadlines():
symbol, value = line.split('\t')
emoticons[str(symbol)] = int(value)
然后是查找功能
def mark_emoticons(t):
for w, v in emoticons.items():
match = re.search(re.escape(w),t)
if match:
print w, "found "
使用
调用该函数mark_emoticons('Hello ladies! How are you? Fantastic :) Look at your man ...')
对于L33t而言,我有一个单独的文件slangs.txt,看起来像
u you
ur you are
uw you are welcome
wb welcome back
wfm works for me
wtf what the fuck
将类型函数读取到字典俚语{}以及类似函数来替换俚语的类似函数。
def mark_slangs(t):
for w, v in slangs.items():
s = r'\b' + w + r'\b'
match = re.search(s,t)
if match:
#print w, "found in:",t, "replacing with",readtable.slangs[w]
t = re.sub(w,slangs[w].rstrip(),t)
...
来自Python library re.escape()
re.escape(字符串) 返回字符串 所有非字母数字都被反击; 如果你想匹配一个,这很有用 可能有的任意文字字符串 正则表达式元字符 它
根据您的需要,您可能需要使用re.findall()