【问题标题】:How can I create a string in english letters from another language word?如何从另一种语言单词中创建英文字母字符串?
【发布时间】:2017-07-14 08:33:28
【问题描述】:

我需要找到一种方法将某些语言的单词(音译)重写为英语。例如привет(俄语)听起来像privet(英语)。

意思和语法无关紧要,但我希望它有更相似的发音。一切都应该是Python,我在网上很努力地查了一下,没有找到好的方法。

例如,类似这样的:

translit("юу со беутифул", "ru") = juu so beutiful

translit("кар", "ru") = kar

【问题讨论】:

  • 这个问题没有简单的解决方案,但是您可以为字母创建一个映射文件,以便 п 映射到 P。不过您必须手动创建这些文件。
  • 所以您正在寻找西里尔字母到罗马/拉丁语的转换器而不是语言转换器?你搜索过“西里尔到罗马的转换器库”或“python 西里尔到罗马的转换器”吗?
  • 我看到了几种语言的几种方法。但我不需要超级解决方案,简单的东西会很好。我认为,这些东西有一个大包装。
  • 我从您的示例中了解到,translit 不能满足您的要求,您是否尝试过创建自定义语言包?
  • 不仅是西里尔文,还有其他语言的方法。有源源不断的单词,我应该把它们转换成英文。

标签: python nlp nltk translation


【解决方案1】:

这是使用正则表达式的另一种可能的解决方案,您可以配置此功能以将特殊字符替换为您想要的字符:

import re

def remove_accents(string):
    if type(string) is not unicode:
        string = unicode(string, encoding='utf-8')

    string = re.sub(u"[àáâãäå]", 'a', string)
    string = re.sub(u"[èéêë]", 'e', string)
    string = re.sub(u"[ìíîï]", 'i', string)
    string = re.sub(u"[òóôõö]", 'o', string)
    string = re.sub(u"[ùúûü]", 'u', string)
    string = re.sub(u"[ýÿ]", 'y', string)

    return string

【讨论】:

    【解决方案2】:

    这是@lenz 的替代解决方案。但我确实喜欢@lenz 对unidecode 更好的建议=)

    Python - Replace non-ascii character in string (»)Can somone explain how unicodedata.normalize(form, unistr) work with examples?

    解决变音符号、重音和坟墓:

    >>> re.sub(r'[^\x00-\x7f]',r'', normalize('NFD', u"Avec Éloïse, ils président à l'assemblée"))
    u"Avec Eloise, ils president a l'assemblee"
    

    但它并不能解决尖锐的 S 字符和西里尔文:

    >>> re.sub(r'[^\x00-\x7f]',r'', normalize('NFD', u"die größten Probleme"))
    u'die groten Probleme'
    
    >>> re.sub(r'[^\x00-\x7f]',r'', normalize('NFD', u"юу со беутифул"))
    u'  '
    

    【讨论】:

    • “ß”(拉丁小写字母 SHARP S)与“β”(希腊小写字母 BETA)不同!
    • NFD 方法相当不错,但遗憾的是没有分解版本的字符,如“ø”、“œ”等。因此,为了获得良好的覆盖率,手工制作的表格是没有办法的.
    • 谢谢!哈哈哈,就是S尖。编辑了答案。
    【解决方案3】:

    也许你应该试试unidecode

    >>> import unidecode
    >>> unidecode.unidecode("юу со беутифул")
    'iuu so beutiful'
    >>> unidecode.unidecode("die größten Probleme")
    'die grossten Probleme'
    >>> unidecode.unidecode("Avec Éloïse, ils président à l'assemblée")
    "Avec Eloise, ils president a l'assemblee"
    

    pip安装它:

    pip3 install unidecode
    

    【讨论】:

    • 绝对比音译好,它不能做反向但解码所有字符。 wp
    • 绝对是一个很棒的图书馆,里面有漂亮的手工制作的桌子!
    • 手工制作很棒,但这也是它是单向的原因——你只能得到 ASCII 输出,没有别的。如果您想删除变音符号(“重音”),但要保留在脚本中,例如,@alvas 方法的修改版本效果很好。 “ὰ”→“α”。
    • 只是想补充一下德语,这不太好,'größten' 应该是 'groessten'
    • @dre_84w934 实际上,unidecode 没有特定于语言的规则(这需要它首先进行语言识别)。
    【解决方案4】:

    也许你已经在使用它了;但你可以使用transliterate 包。

    使用 pip 进行基本安装:

    pip install transliterate
    

    然后是代码

    # coding: utf-8
    
    from transliterate import translit
    
    print translit(u"юу со беутифул", 'ru', reversed=True) # juu so beutiful
    

    自定义类

    正如@Schmuddi 建议的那样,您可以创建自己的自定义类来处理德语特殊字符(尽管仅适用于 python 3.X)。

    pip3 install transliterate
    

    然后是代码:

    # coding: utf-8
    
    from transliterate import translit
    from transliterate.base import TranslitLanguagePack, registry
    
    class GermanLanguagePack(TranslitLanguagePack):
        language_code = "de"
        language_name = "Deutsch"
    
        pre_processor_mapping = {
            u"ß": u"ss",
        }
    
        mapping = (
            u"ÄÖÜäöü",
            u"AOUaou",
        )
    
    registry.register(GermanLanguagePack)
    
    print(translit(u"Die größten Katzenrassen der Welt", "de")) 
    #Die grossten Katzenrassen der Welt
    

    奖金,法国人:

    class FrenchLanguagePack(TranslitLanguagePack):
        language_code = "fr"
        language_name = "French"
    
        pre_processor_mapping = {
            u"œ": u"oe",
            u"Œ": u"oe",
            u"æ": u"ae",
            u"Æ": "AE"
        }
    
    
        mapping = (
            u"àâçéèêëïîôùûüÿÀÂÇÉÈÊËÏÎÔÙÛÜŸ",
            u"aaceeeeiiouuuyAACEEEEIIOUUUY"
        )
    
    
    registry.register(FrenchLanguagePack)
    
    print(translit(u"Avec Éloïse, ils président à l'assemblée", 'fr'))
    #Avec Eloise, ils president a l'assemblee
    

    其他可能的解决方案

    由于 transliterate 不涵盖德语(还没有?),您可以使用另一个包直接翻译句子:py-translate 但它使用谷歌翻译,因此您确实需要互联网连接。

    使用 pip 进行基本安装:

    pip install py-translate
    

    然后你的代码:

    # coding: utf-8
    
    from translate import translator
    
    print translator('ru', 'en', u"юу со беутифул")
    print translator('de', 'en', u"Die größten Katzenrassen der Welt")
    

    【讨论】:

    • 谢谢,但我已经用过了。这还不够。有德语单词。
    • 仅支持亚美尼亚语 保加利亚语 (beta) 格鲁吉亚语 希腊语 马其顿语 (alpha) 蒙古语 (alpha) 俄语 乌克兰语 (beta)
    • 还有使用谷歌翻译的包,但你需要一个互联网连接,它并不真正相关。对不起,我误解了你的问题。
    • @Alex:你有没有注意到你可以为transliterate注册自己的音译映射?将德语映射到类似英语的东西似乎是一项相当容易的任务。我认为您不会找到任何更接近您的问题的匹配项。
    • 感谢您的努力,但我不需要在线工具(:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多