通过替换现有文本中的单词进行翻译

时间:2010-02-08 21:13:11

标签: python regex language-agnostic string nlp

在必须重建文本时(使用标点符号和其他内容),在给定文本中翻译某些单词(或表达式)的常用方法是什么?

翻译来自查询表,涵盖单词,搭配和表情符号,如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)

4 个答案:

答案 0 :(得分:1)

你的笑脸示例不适用于正则表达式的原因是\ b指的是单词边界。由于笑脸中没有“单词”字符,因此没有单词边界,因此表达式不匹配。你可以使用lookaheads / lookbehinds来查看你是否被空格限制,但考虑到你的表情符号是用标点符号来检查标点符号可能很困难。

答案 1 :(得分:0)

问题不在于正则表达式不能与表情符号相匹配(这根本不是真的:P),而是表达了笑脸的正则表达式。

在python文档中,边界\b的描述如下:

  

匹配空字符串,但仅匹配单词的开头或结尾。单词被定义为Unicode字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字的非下划线Unicode字符表示。请注意,正式地,\ b被定义为\ w和\ W字符之间的边界(反之亦然)。

现在的问题是像:-)这样的符号本身就是字边界,所以它们特别是而不是字,因此与\w不符。因此,笑脸之前的空间不被识别为单词边界(仅仅因为没有单词跟随)。

因此,如果您想要匹配表情符号,则无法使用\b,但必须检查空格或其他内容。

答案 2 :(得分:0)

如果您正在寻找非正则表达式解决方案,那么这就是我的想法。以下是我将使用的步骤。

的制备:将

  • 创建一个链接单词的字典 替换为他们的替代品。
  • 创建单词的三元树 被替换。

搜索和替换:

  1. 使用split()按空格分隔单词。我使用术语“单词”来指代一组不包含空格的字母。
  2. 迭代所有的单词
    1. 在三元树中搜索单词 - 如果找到部分匹配,请检查单词的其余部分是否为标点符号(或至少不是会使其不匹配的内容)。
    2. 如果在三元树中找到字词,则使用字典查找替换该字
  3. 您可以阅读有关三元搜索树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()