2017-10-30 2 views
8

텍스트에서 다른 문자의 빈도를 찾고 싶습니다. 그 중 일부는 분음 부호를 사용합니다. 예를 들어 텍스트는 'å'와 'ą̊'(U + 00E5 U + 0328)을 모두 사용하며 빈도는 별도로 계산해야합니다.텍스트의 발음 구별 부호가있는 문자를 올바르게 계산하는 방법은 무엇입니까?

어떻게하면됩니까?

나는 카운터 컬렉션을 사용하여 utf8 형식을 사용하여 파일을 열고, text.split()list(text)을 모두 사용하여 텍스트 문자열을 분할했지만 파이썬은 여전히 ​​'å'과 '±'를 같은 문자로 간주합니다!

답변

7

여기서 문제는 일부 문자에 대해 하나 이상의 유니 코드 코드 포인트를 사용하는 유니 코드 텍스트 (utf-8에 대해 잊어 버려야합니다. 데이터를 올바른 파이썬 3 문자열로 디코딩 한 후 이야기하는 것입니다)가 ' 따라서 "±"와 "å"는 적절한 정규화 후에 하나의 문자로 존재할 수 있지만, 두 개의 마크를 모두 가지고있는 문자는 유니 코드에서 "결합 마크"문자 중 하나를 사용해야합니다.

즉, 파이썬 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

text.replace('ą̊', 'Ʒ').replace('Ą̊', 'ʒ') 
"문자"'판독 라인 따옴표 안 unicodedata.category 경우 ("문자") [0] == "M" '은 변수를 지칭한다. – olooney

+0

발견해 주셔서 감사합니다. – jsbueno

+1

감사합니다. 테스트를 거쳤고 이중 마커가있는 글자에도 효과적입니다. :) 'unicodedata.normalize' 및'unicodedata.category'를 확인해야하므로 다른 사람이 필요하면 링크가 있습니다. https://docs.python.org/2/library/unicodedata.html#unicodedata.normal https://docs.python.org/2/library/unicodedata.html#unicodedata.category http : // www .fileformat.info/info/unicode/category/index.htm 도움을 주셔서 감사합니다. – user11448

0

당신에게 (스 니펫은 위의 계좌로 잠재적 인 잘못된 텍스트 조각을하지 않습니다, 즉 위치 0에 표시 문자로 시작할 것) 특수 문자를 계산하기 전에 단일 코드 포인트로 표현할 수있는 다른 문자로 바꿀 수 있습니다. 대체 문자가 코퍼스에 나타나지 않는지 확인하십시오.

관련 문제