(지난이야기: 싫지만 한국어 유음화 실험을 해야 해 🤪 [시리즈 보기])
한국어 음운문법을 가진 화자들이 어떻게 유음화를 적용하는지 확인하기 위해서는 처음보는 단어에 유음화를 적용하는지 안하는지를 관찰해야 한다. 재차 강조하자면, 개별적인 한국어 단어에 관심이 있는 것이 아니고 그걸 만들어내는 음운문법에 포커스가 있는 것이기 때문이다.
비단어(nonce word)는 '그럴싸하게 생겼지만 의미가 없는 음소의 연쇄' 정도로 정의할 수 있다. 고전적인 예로 영어의 blik과 bnik이 있는데, 전자는 비단어이고 후자는 불가능한 단어다. blik은 영어에서 음소가 결합되는 규칙을 따르기 때문에 '우연히' 뜻이 없는 단어다. 미래에 이 단어가 영어 렉시콘에 추가될 가능성이 있다. bnik은 그렇지 않다. 죽었다 깨어나도 영어단어가 되지 않을 것이다.
한국어에서 유음화가 적용될법한 비단어는 "발니"나 "반리" 같은 것이 있겠다. 이걸 기계적으로 만들어내는 것이 핵심이다. 왜냐면 인간의 상상력은 한계가 있고 기계적인 작업은 기계한테 시키는 것이 윤리적으로 합당하기 때문이다. 그래서 간단한 알고리즘을 pseudocode로 구성하면 아래와 같다. 1
# Step 1: trigram probabilities 집어넣을 dictionary 만들기
initialize empty dictionary trigram_probs
# Step 2: 코퍼스 각 단어에서 trigram sequence 뽑아내기
for word in corpus:
# get_segments()는 단어를 분절음으로 나누고 앞뒤에 단어경계 넣음
segments = get_segments(word)
# 분절음 3개 window로 캡처하기
for i in range(len(segments) - 2):
trigram = segments[i:i+3]
# 카운팅 업데이트하기
if trigram in trigram_probs:
trigram_probs[trigram] += 1
else:
trigram_probs[trigram] = 1
# Step 3: probability로 구성
total_trigrams = sum(trigram_probs.values())
for trigram in trigram_probs:
trigram_probs[trigram] /= total_trigrams
# Step 4: Backoff smoothing 적용 (코퍼스에 '유연히' 부재한 trigram위해서)
smoothing_value = 0.01 # 이 파라미터는 연구자의 책임으로 결정하는 작은 값.
for trigram in possible_trigrams:
if trigram not in trigram_probs:
trigram_probs[trigram] = smoothing_value / total_trigrams
# Step 5: 비단어 생성
nonce_words = []
for n in range(num_nonce_words):
word_structure = "CVLNVC" # 난 유음화가능 비단어만 원하니까
nonce_word = []
for i in range(len(word_structure) - 2):
trigram_context = nonce_word[-2:] if i >= 2 else ["<s>", nonce_word[-1]]
possible_trigrams = get_possible_trigrams(trigram_context, trigram_probs)
# 그 뒤로는 확률에 따라 생성
next_segment = weighted_random_choice(possible_trigrams, trigram_probs)
nonce_word.append(next_segment)
nonce_words.append("".join(nonce_word))
간단히 정리하자면 한국어에 존재하는 trigram(3개 분절음 덩어리)을 쭉 정리한 다음 각 trigram이 출현하는 probability를 구한다. 이때 backoff smoothing을 하는데, 설명하면 길어지니까. 다른 블로거들에게[링크] 설명을 넘긴다[링크].
그리고 편의상 위 pseudocode엔 안 적었는데, Step 5 구현하는 함수에선 어떤게 C(자음)이고, 어떤게 V(모음)이고 어떤게 L(=ㄹ)이고, 어떤게 N(=ㄴ)인지를 무식하게 하드코딩해주었다.
어쨌든 이 알고리즘을 구현해서 비단어를 뽑아내면 "갈농" "골눕" "널넥" "흘닙" 등의 2음절 비단어들이 나온다.
("실험은어려워" 태그에서 이어집니다.)
- 글이 유익했다면 후원해주세요 (최소100원). 투네이션 || BuyMeACoffee (해외카드필요)
- 아래 댓글창이 열려있습니다. 로그인 없이도 댓글 다실 수 있습니다.
- 글과 관련된 것, 혹은 글을 읽고 궁금한 것이라면 무엇이든 댓글을 달아주세요.
- 반박이나 오류 수정을 특히 환영합니다.
- 로그인 없이 비밀글을 다시면, 거기에 답변이 달려도 보실 수 없습니다. 답변을 받기 원하시는 이메일 주소 등을 비밀글로 남겨주시면 이메일로 답변드리겠습니다.
- "기계적인 건 기계에게"는 이 블로그를 관통하는 주제인 것 같다.ㅋㅋㅋ [본문으로]
'생각나는대로' 카테고리의 다른 글
[실험은 어려워] 4. 윤리심사받기 (1) (0) | 2024.11.12 |
---|---|
음운론 연구에서 수어의 위치에 관한 단상들 (4) | 2024.11.11 |
[실험은 어려워] 2. 주제와 방법론을 고정하기 (2) | 2024.11.09 |
[실험은 어려워] 1. 실험할 결심 (5) | 2024.11.08 |
1930년대 한국어 어휘강세 (2) | 2024.10.20 |