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

时间:2017-10-30 22:33:03

标签: python python-3.x unicode

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

我该怎么做?

我尝试过使用Counter集合,使用utf8格式打开文件,使用text.split()list(text)分割文本字符串,但python仍然将'å'和'±'统计为同一个字母!

2 个答案:

答案 0 :(得分:8)

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

这意味着单独的Python Counter将无法处理它,至少没有额外的步骤。在Python代码中,找到这些标记字符的方法是使用unicodedata.category - 它不是那么友好,只返回two-character identifier for the 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)

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

答案 1 :(得分:0)

您可以在计数之前将特殊字符替换为可由单个代码点表示的另一个字符。只需确保替换字符不会出现在语料库中。

text.replace('ą̊', 'Ʒ').replace('Ą̊', 'ʒ')