TextEncoder 가 n_most_common·min_count 인자를 무시하는 문제 수정
speechbrain: TextEncoder.limited_labelset_from_iterable 가 n_most_common / min_count 를 무시하는 문제 수정
링크: https://github.com/speechbrain/speechbrain/pull/3095
배경
speechbrain.dataio.encoder.CategoricalEncoder.limited_labelset_from_iterable 는 라벨 빈도를 세어 상위 N개(n_most_common ) 또는 최소 등장 횟수(min_count ) 이상인 라벨만 라벨셋에 넣는 메서드다. 텍스트용 서브클래스 TextEncoder (및 이를 상속한 CTCTextEncoder )는 sequence_input 기본값만 True 로 바꾸기 위해 이 메서드를 오버라이드한다.
원인
speechbrain/dataio/encoder.py 916-922행의 오버라이드가 전달받은 인자를 부모에 넘기지 않고 상수를 하드코딩해서 넘긴다.
return super().limited_labelset_from_iterable(
iterable, sequence_input=True, n_most_common=None, min_count=1
)
그래서 TextEncoder 에서는 n_most_common , min_count , sequence_input 을 어떤 값으로 주든 조용히 무시되고, 모든 라벨이 라벨셋에 들어간다. 예외도 경고도 없어서 어휘 크기를 제한했다고 생각한 채로 학습이 진행된다. 바로 위의 형제 오버라이드 update_from_iterable , update_from_didataset 은 인자를 그대로 전달하고 있어 단순 실수로 보인다 (2020-12 최초 작성 이후 그대로).
변경 내용
speechbrain/dataio/encoder.py: 오버라이드가sequence_input,n_most_common,min_count를 그대로 부모에 전달하도록 수정 (1행 → 4행).sequence_input기본값True는 유지.tests/unittests/test_categorical_encoder.py:test_text_encoder_limited_labelset추가 (n_most_common=2,min_count=3,sequence_input=False세 경우).
재현 방법
from speechbrain.dataio.encoder import TextEncoder
sentences = [["a", "b", "c"], ["a", "b"], ["a"]]
text = TextEncoder()
text.limited_labelset_from_iterable(sentences, n_most_common=2)
print(text.lab2ind) # develop: a, b, c 모두 포함 / 수정 후: a, b 만
검증
- 새 테스트는
develop(89ead74d) 에서 실패, 수정 후 통과. pytest tests/unittests/test_categorical_encoder.py7 passed,pytest --doctest-modules speechbrain/dataio/encoder.py5 passed.pytest tests/unittests전체: 750 passed, 5 skipped, 7 failed. 7건은 수정 전develop에서도 동일하게 실패하는 환경 요인(torch 버전, transformers 미설치).ruff check,ruff format --check(0.12.4) 통과. codespell, yamllint 는 로컬에서 실행하지 않음.- 중복 확인: 이슈/PR 검색에서 동일 보고 없음, 오픈 PR 중
encoder.py를 건드리는 것 없음.