如何在文本中正确计算带变音符号的字母?

use*_*448 8 python unicode python-3.x

我想在文本中找到不同字母的频率,其中一些使用变音符号.例如,文本同时使用'å'和'±'(U + 00E5 U + 0328),频率需要单独计算.

我怎么做?

我已经使用计数器收集尝试,使用UTF8格式打开文件,同时使用拆分文本字符串text.split()list(text),但蟒蛇仍然被"A"和"A"为相同的字母!

jsb*_*eno 8

这里的问题是unicode文本(忘记utf-8,我在将数据解码为正确的Python 3字符串后说话)对某些字符使用多个unicode代码点:''''例如有两个标记,所以两者都是正确归一化后,"ą"和"å"可作为单个字符存在,带有两个标记的字符必须使用unicode中的"组合标记"字符之一.

这意味着Counter,如果没有至少额外的步骤,单独的Python 将无法处理它.在Python代码中,找到这些标记字符的方法是使用unicodedata.category- 并且它不是那么友好,它只返回该类别双字符标识符.

因此,我认为可以做的一件事是将文本预处理到一个列表中,其中每个字符及其标记都使用一些"纯Python"代码进行规范化.然后,Counter可以完成它的工作.

它可能是:

import unicodedata
from collections import Counter

characters = []

text = ...

# Decompose all characters into plain letters + marking diacritics:
text = unicodedata.normalize("NFD", text)
for character in text:
    if unicodedata.category(character)[0] == "M": 
        # character is a composing mark, so agregate it with
        # previous character
        characters[-1] += character
    else:
        characters.append(character)

counting = Counter(characters)
Run Code Online (Sandbox Code Playgroud)

(请注意,上面的代码段未考虑可能存在格式错误的文本片段,该片段将以位置0中的标记字符开头)