latine alphabet 지우기.

intro

  • 저는 키워드를 분석하는 작업을 많이 하는데, 키워드, 즉 문자열에 ‘라틴 알파벳’이 등장하는 경우들이 있습니다.
  • 아래 그림에서처럼 액센트도 있고, 합니다.

라틴 문자 지우기

  • 아래 코드가 약간 복잡해보일 수도 있지만, 설명하면 다음과 같습니다.

  • 텍스트를 정규화함: 텍스트를 정규화하여 분해하면, 각각의 캐릭터들을 분리할 수 있음
    • fi 처럼 캐릭터가 합쳐져 있는 경우, f, i로 분해
    • 엑센트+캐릭터인 경우 엑센트와 캐릭터로 분해
  • 분해된 텍스트에서 필요없는 카테고리에 속한 캐릭터를 삭제
  • 텍스트 생성
import unicodedata 

target_text = 'fi áé nnn íñóúü'
# 캐릭터들을 각각 출력해보면, 아래처럼 엑센트가 포함되어 있는 것을 알 수 있다. 
print(f"characters in target text: {list(target_text)}")
for c in target_text:
    print(c, unicodedata.category(c)) # LU: Letter, upper case Ll: lower case

#unicodedata.normalize("NFKD", 'áéíñóúü')

"""
- 엄밀히 따지면, 액센트와 알파벳은 서로 다른 문자입니다. 
- 또한, fi 처럼 두 문자가 합쳐져 있는 경우도 구분하는 것이 필요하죠. 
- 두 문자를 혼합하여 새로운 문자를 생성해냈다고 보는 편이 정확하죠. 
- 따라서, 이 두 문자를 분해하는 작업이 필요합니다. 
- 분해를 위해서 normalize를 사용합니다. 
"""
print("=="*20)
## 모두 분리된 것을 알 수 있습니다. 
NFKD_normalzed_text = unicodedata.normalize("NFKD", target_text)
print(f"characters in normalized target text: {list(NFKD_normalzed_text)}")
## 각 캐릭터의 카테고리를 보면 엑센트의 카테고리는 'Mn'인 것을 알 수 있습니다. Mn은 Mark, no spacing 의미라고 하네요. 
for c in NFKD_normalzed_text:
    print(c, unicodedata.category(c))

## 그럼 이제 Mn인 것만 제외하면 되지 않을까요? 
remove_latin_text = "".join(
    [c for c in list(NFKD_normalzed_text) if unicodedata.category(c) != 'Mn']
)
print("=="*20)
print(remove_latin_text)
print("=="*20)

wrap-up

  • 처음에는 조금 복잡하다고 생각했는데, 써보니까 그렇게 막 복잡하지는 않군요 하하핫.

reference

댓글남기기