【问题标题】:Purifying a text string in python在python中净化文本字符串
【发布时间】:2020-04-13 09:52:13
【问题描述】:

这是this question 的延续。我有这个字符串;

s = 'A ligeira raposa marrom ataca o cão preguiçoso Быстрая коричневая лиса прыгает через ленивую собаку +='

我想保留俄语字母并删除其余字母。因此,我想获得葡萄牙字母表中所有可能的字母,以便我可以将其应用于任何行。

我的问题是可以从网站上获取某种语言的所有可能字母吗?或直接从计算机本身。什么都容易。

感谢和最好的问候

迈克尔

【问题讨论】:

  • 也许s.encode()(编码为UTF-8)可以帮助你一些想法。至少在这个例子中,每个语言单词的字节表示看起来非常不同。
  • 您好,感谢您的回复。谢谢和最好的问候

标签: python unicode linguistics


【解决方案1】:

Python 处理 Unicode 的工具具有 unicodedata 模块 - 它有一些工具可以处理这个问题。 在“逐个字符”的基础上进行测试,并尝试在“if_esque”结构中检查所有可能的重音拉丁字母组合,不仅外观和感觉都不好:这是一种不好的方法。

处理 unicode 的最基本工具之一是获取字符名称本身 - 所有拉丁字母的名称中都包含“LATIN”,所有西里尔字符的名称中都包含“CYRI​​LLIC”。

In [1]: import unicodedata                                                                                          

In [2]: unicodedata.name("ã")                                                                                       
Out[2]: 'LATIN SMALL LETTER A WITH TILDE'

In [3]: unicodedata.name("ы")                                                                                       
Out[3]: 'CYRILLIC SMALL LETTER YERU'

如果您想保留空格、数字等,您的策略会有所不同 - 但基本上,如果您想删除所有非西里尔字符:

In [7]: s = 'A ligeira raposa marrom ataca o cão preguiçoso Быстрая коричневая лиса прыгает через ленивую собаку +='
   ...:                                                                                                             

In [8]: print(''.join(char for char in s if 'CYRILLIC' in unicodedata.name(char)))                                  
Быстраякоричневаялисапрыгаетчерезленивуюсобаку

反之,如果您想保留所有内容并删除所有拉丁字符:

In [9]: print(''.join(char for char in s if 'LATIN' not in unicodedata.name(char)))                                 
        Быстрая коричневая лиса прыгает через ленивую собаку +=

仅凭这些信息,就可以实现您的目标 - 尽管字符中的 unicode 元数据比它们的名称多,例如它们的“类别”。如果你需要 优化您的过滤器,unicodedata.category(...) 将返回一个两个字符的代码 对于字符类别。所有字母(无论字母如何)都将带有“L” 该代码的第一个位置,例如:

In [10]: unicodedata.category("a")                                                                                  
Out[10]: 'Ll'

In [11]: unicodedata.category("ã")                                                                                  
Out[11]: 'Ll'

In [12]: unicodedata.category("л")                                                                                  
Out[12]: 'Ll'

In [13]: unicodedata.category("A")                                                                                  
Out[13]: 'Lu'

In [14]: unicodedata.category("2")                                                                                  
Out[14]: 'Nd'

【讨论】:

    【解决方案2】:

    您可以使用 str.translate 从字符串中删除字母并将它们替换为空 - 我在这里使用了一些字符串常量(参见 f.e. string.ascii_letters):

    from string import ascii_letters, digits, punctuation
    
    s = 'A ligeira raposa marrom ataca o cão preguiçoso Быстрая коричневая лиса прыгает через ленивую собаку +='
    
    # first + second string are translations, last string will be removed from result
    
    to_be_removed = ascii_letters + digits + punctuation + "+=áâãàçéêíóôõú"
    t = str.maketrans("", "", to_be_removed)
    k = s.translate(t)
    
    print(k.strip())
    

    输出

    Быстрая коричневая лиса прыгает через ленивую собаку
    

    您还需要向 string.ascii_letters 添加更多非 ascii_letters 以删除它们。我从 Portuguese orthography: Diacritics 手动获取它们,这是一次手动操作。

    【讨论】:

    • 嗨,感谢您的回复。但是,这仅在我想删除拉丁脚本时才有效。谢谢和最好的问候迈克尔
    • @michael 在这种情况下,“保留俄语脚本”等同于“删除 ascii + portogese 特殊变音符号”?
    • @downvoter - 发表评论让您投反对票的原因可以让我修复它。
    • Downvoter here:这种方法完全不是最优的,因为有 100.000 多个 unicode 字符 - 明确地将您想要删除的内容列入黑名单几乎不会真正起作用。有关于字符本身的元数据信息,可用于在这种情况下进行过滤。
    • @jsbueno 您的回答非常出色——唯一的赞成票是我。我的回答对于保留俄语和删除葡萄牙语 shrug 是可行的——这就是所需要的。我从你那里了解到,你也可以查询元信息。感谢您的反馈。
    【解决方案3】:

    这似乎不是 Python 相关的问题,我还要说它与编程无关。

    但是 - StackExchange 网络上总是有答案,这次是在语言学网站上:https://linguistics.stackexchange.com/questions/28766/character-sets-for-top-100-languages-as-opposed-to-unicode

    【讨论】:

    • 如果 OP 将 Python 用于他们的代码,那显然是“与 Python 相关的”——因为他们可以直接访问 Python 工具来处理 unicode,例如 Python 的 stdlib unicodedata 模块 - (有解决这个“难题”的工具)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多