代码之家  ›  专栏  ›  技术社区  ›  Berry Tsakala

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

  •  1
  • Berry Tsakala  · 技术社区  · 16 年前

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

    翻译来自查找表,包括单词、搭配和表情符号,如l33t、cul8r、:-)等。

    简单的字符串搜索和替换是不够的,因为它可以替换部分较长的单词(cat>dog__gt;卡特彼勒>dogerpillar)。

    假设以下输入:

    s = "dogbert, started a dilbert dilbertion proces cat-bert :-)"
    

    翻译后,我应该收到如下信息:

    结果= 安娜 开始了 乔治 折迭 过程 猫伯特 斯迈利

    我不能简单地标记化,因为我松了 标点符号 词位 .

    正则表达式适用于普通单词,但不捕获像smiley:-)这样的特殊表达式,但确实如此。

    re.sub(r'\bword\b','translation',s) ==> translation
    re.sub(r'\b:-\)\b','smiley',s) ==> :-)
    

    目前,我正在使用上面提到的regex,并简单地替换非字母数字单词,但它远不是防弹的。

    (另外,我用的是python)

    4 回复  |  直到 16 年前
        1
  •  0
  •   Brock Adams    14 年前

    我有一个类似的问题,用标准的表情符号替换为值。 Here 是一个表情符号列表。我把它们放在一个纯文本文件中(这样我可以在需要时追加/删除到文件中),用类似制表符的方式分隔开。

    :[        -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 Speak,我有一个单独的文件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逃逸()

    关于转义(字符串) 返回字符串 所有非字母数字反斜杠; 如果要匹配 可能具有的任意文本字符串 正则表达式元字符 它。

    根据您的需要,您可能需要使用re.findall()。

        2
  •  1
  •   Jeff B    16 年前

    您的smiley示例不适用于regex的原因是\b引用了单词边界。因为笑脸中没有“单词”字符,所以没有单词边界,所以表达式不匹配。您可以使用lookaheads/lookbehinds来查看是否被空格包围,但是考虑到您的笑脸是由标点组成的,检查标点符号可能很困难。

        3
  •  0
  •   poke    16 年前

    问题不在于regexp不能匹配smileys(这不是真的:p),而是如何生成该smiley的正则表达式。

    单词边界 \b 在python文档中描述如下:

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

    现在的问题是 : , - ) 本身就是词的边界,所以它们特别 不是文字,因此不符合 \w . 因此,笑脸前面的空格不能被识别为单词边界(只是因为后面没有单词)。

    所以如果你想匹配笑脸,你就不能用 \b 但是必须检查空白或其他东西。

        4
  •  0
  •   Justin Peel    16 年前

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

    制备:

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

    搜索和替换:

    1. 使用split()按空格拆分单词。我用这个词指的是一组不包含空格的字母。
    2. 遍历所有单词
      1. 在三元树中搜索单词-如果找到部分匹配,请检查单词的其余部分是否为标点符号(或至少不是使其不匹配的内容)。
      2. 如果在三元树中找到单词,请使用字典查找替换它

    你可以阅读三元搜索树 here . 有三元搜索树python实现,但您可以使自己的实现非常简单。这种方法的主要问题是,如果单词前有标点符号(如a),但这很容易处理。