자동 수정을 담당하는 AppleSpell은 텍스트 필드가 특정 언어의 예측을 처음 요청할 때 데이터베이스를 열려고 함
SQLite는 없는 데이터베이스 파일은 생성하지만 상위 폴더까지 만들지는 않음
폴더가 없으면 no such file or directory로 실패하고, AppleSpell은 경로가 포함된 com.apple.libsqlite3 오류를 기록한 뒤 데이터베이스 없이 계속 동작함
사용자에게 보이는 오류가 없어 이 기능이 꺼진 상태를 알아차리기 어려움
파일을 생성하려면 ~/Library/Keyboard 폴더를 만든 뒤 AppleSpell을 재시작하고 TextEdit 같은 네이티브 앱에 문장을 입력할 수 있음
공개된 조사에서는 일반 kill이 무시되어 kill -9 $(pgrep AppleSpell)을 사용했으며, macOS가 필요할 때 서비스를 다시 실행함
사용 기록은 비속어를 입력할 때마다 생기는 것이 아니라, 자동 수정이 비속어를 다른 표현으로 바꾸려 할 때 원래 단어를 유지해야 기록됨
조사한 Mac은 2023년부터 폴더가 있어 2024년 4월 데이터베이스가 정상 생성됨
TextEdit 시험에서는 모든 단어의 철자가 정확해 수정 제안이 없었으므로 기록되지 않은 결과와 맞아떨어짐
기록 대상은 다른 곳에서 이미 비속어로 표시한 단어이므로, 다음 조사 대상은 시스템 사전의 분류였음
시스템 사전과 비공개 API
dyld 공유 캐시에서 vulgar를 검색해 LX 접두사의 C API와 _LXEntryGetCategoryFlags, _LXEntryGetMetaFlags를 찾음
Lexicon.framework 는 /System/Library/LinguisticData/의 언어별 사전을 읽는 비공개 프레임워크임
각 단어는 LXEntry이며 두 개의 32비트 플래그 필드를 가짐
LXVulgarWordUsageDatabaseCreate, LXVulgarWordUsageDatabaseCanAutocorrect 같은 함수도 있음
공개 API에는 비속어 분류가 노출되지 않음
NSSpellChecker, UITextChecker, NaturalLanguage, UILexicon에서 해당 값을 얻을 수 없음
SensitiveContentAnalysis는 텍스트가 아니라 이미지와 영상을 다룸
Apple 개발자 사이트의 비속어 관련 항목은 App Store 연령 등급과 심사 지침에서만 확인됨
헤더는 없지만 C 함수가 내보내져 있고 CoreFoundation 규약을 따르므로 시그니처를 추정해 호출할 수 있음
C 예제는 로케일로 사전을 열고 루트 커서에서 항목을 재귀 순회해 단어와 두 플래그를 출력함
Swift 예제는 dlopen, dlsym으로 함수를 동적 로드하므로 비공개 프레임워크를 직접 링크하지 않아도 되며, 세 단계 중 하나가 설정된 단어만 출력함
두 예제 모두 키보드가 사용하는 사전을 읽기 전용으로 열어 출력함
플래그 해석: 3단계와 11개 주제
Apple은 비트를 문서화하지 않았으므로 분류 의미는 추론에 기반함
Claude가 같은 비트가 설정된 단어를 묶고 표본을 읽어 주제를 추정함
시스템 코드의 offensiveVulgarSensitive 열거형과 인접한 메타 비트 3개가 단계 해석의 단서가 됨
en_US의 199,019개 항목 중 4,271개에 다음 단계 중 하나가 있으며, 이 사전에서는 단계가 서로 겹치지 않음
0x00800000, vulgar: 1,050개이며 욕설과 성적 속어가 중심임. fuck, shit, cunt, cock, crap, wtf, fml, bullshitting, fucktard, shizzle, merde 등이 포함됨
0x01000000, offensive: 663개이며 집단을 겨냥한 멸칭이 중심임. kike, wop, dago, fag, Paki, japs, Klansman, retard, Oriental, ass, asshole 등이 포함됨
0x02000000, sensitive: 2,558개이며 가벼운 욕설, 모욕, 약물, 무기, 극단주의, 질병, 신체 기능 등 선제 추천을 피할 법한 표현이 포함됨. damn, bitch, idiot, LSD, abortion, gun, suicide, anus, pee, poo 등이 해당함
다른 필드는 주제 비트마스크이며 한 단어에 여러 주제가 설정될 수 있음
0x00100, 배설: 123개. feces, barf, crapper, piddle, pooped 등이 있음
0x00200, 신체 부위: 958개. nipples, navel, buttock, perineum, triceps 등이 있음
0x00400, 모욕과 정체성 관련 표현: 823개. idiot, cretin, hick, pleb, sexist, homophobic, blacklist 등이 있음
0x00800, 질병: 93개. Covid, herpes, PTSD, leprosy, monkeypox 등이 있음
0x01000, 약물: 222개. heroin, shroom, crackhead, hotbox, OD 등이 있음
0x02000, 정치와 극단주의: 266개. Hamas, Goebbels, Leninism, democrat, swastikas, Trump 등이 있음
0x04000, 종교와 저주: 420개. Sikhism, jihadi, Beelzebub, damn, hell, jeez 등이 있음
더 파볼 만한 내용이 많음. 중국어 문구 차단 목록은 영어보다 훨씬 큼. 간체자는 약 281KB, 번체자는 325KB, 광둥어는 160KB인데 영어는 28KB임. shouldShowTaiwanFlagEmoji()와 deviceIsChinese() 함수도 있는 듯하지만, 이 데이터베이스와는 무관함.
이런 윤리적 딜레마는 전부 shouldActLikeTheEthicalBusinessWeClaimToBe() 뒤에 숨기면 되겠네.
“Apple의 단어 목록을 추출했다”고 하지만, 실제로는 Claude가 추출했고 글도 쓴 게 분명해 보임.
“유일한 예외는 n-word임. 영어와 여러 다른 언어의 목록에 들어 있지만, 여기서는 직접 쓰지 않겠음”이라는 문장에서 유독 Opus 5.5 느낌이 남.
그런데 멋대로 웹사이트를 해킹하기라도 하면, 갑자기 Claude가 아니라 다시 사용자 책임이 됨.
그 논리라면 계산은 사람이 아니라 계산기가 한 셈임.
그 댓글도 직접 쓴 게 아니라 키보드가 쓴 셈임.
낡은 Windows·Linux 노트북을 대체하려고 MacBook을 샀지만, 이 글은 내가 MacBook 사용을 중단한 이유를 압축해서 보여줌. 끝없는 과잉보호와 불투명함, “다 너를 위한 거란다”라는 어린애 취급에 질렸음. 부끄러워서 팔 엄두조차 나지 않음.
Linux를 설치하고 Apple 로고 위에 커다란 X를 새기면 됨.
그런데 저 비속어 목록의 목적은 의도적으로 쓴 단어를 자동 수정하지 않는 것임.
파일의 버전별 변경 이력을 확보해서 어떤 단어가 언제 추가되거나 삭제됐는지 볼 수 있을까? 사건, 인물, 유행, 밈, 논란 등과 변경 사항을 대조하면 흥미로울 듯함.
2023년에 추가됐으니 최대 3년치 업데이트가 있을 수 있음. 추가로, 이 댓글에서 15.6과 26.2의 차이를 볼 수 있음: https://news.ycombinator.com/item?id=50358223.
누군가 iOS의 성인 웹사이트 목록도 추출해 주면 좋겠음. 영국에서는 정부 발급 신분증 등을 제출하지 않으면 기본적으로 차단되는 사이트들임.
목록이 아니라 일련의 머신러닝 분류로 처리됨. 사실상 아동 모드가 강제로 켜져 있는 셈이며, 해결책은 영국 Apple ID를 쓰지 않는 것임.
영국판 iOS가 운영체제 수준에서 성인 웹사이트를 차단한다는 뜻인가?
이 기능은 평소라면 오타라고 판단할 단어도 사용자가 즐겨 쓰면 학습해서 의도적인 입력일 가능성을 고려하도록 하는 것임. 사용자에게 적응하는 비검열 기능인 셈임.
검열이 아니라면 단어를 분류하는 이유는 무엇인가?
내 Mac의 26.2 내장 사전은 글에서 다룬 15.6보다 최신이며, 여러 분류가 바뀌었음. 전체 항목은 199,019개에서 199,940개로, 비속어는 1,050개에서 850개로, 모욕적 표현은 663개에서 727개로, 민감한 표현은 2,558개에서 2,748개로 변함. Oedipus는 비속어에서 성 관련 민감 표현으로, cooties는 비속어에서 일반 단어로 바뀜. Biden에는 정치 주제 태그가 추가됐지만 여전히 민감도 등급은 없음.
Trump는 여전히 정치 주제의 민감 표현이고, 카드 게임 용어인 소문자 trump는 일반 단어임. Obama, Putin, Vance, Harris에는 등급이 없고 Musk는 여전히 사전에 없음. Tom과 Mick은 모욕적 표현, pee·poo·niggle·underling·blacklist·Isis는 민감 표현으로 유지됨. idiot도 여전히 민감 표현이며, 이제 포괄적인 ‘민감한 맥락’ 주제까지 붙어 있음.
글에서 빠뜨린 대문자로 시작하는 민감 표현에는 Saddam, Grindr, Oedipus/Oedipal, TERF, Viagra가 있음. 이 목록에서 살아 있는 정치인은 여전히 Trump뿐임.