9화에서 괄호 파싱 이야기를 했습니다. 긴 문자열을 쪼개서 개별 원재료 이름을 뽑아내는 것까지 왔어요.
그런데 뽑아낸 이름들이 문제였습니다.
같은 원재료인데 이름이 다른 경우. 1화에서도 잠깐 언급했었죠.
실제로 데이터를 살펴보니, 이런 상황이 정말 많았습니다.
설탕 하나만 해도요. ‘설탕’, ‘백설탕’, ‘정백당’, ‘정제당’, ‘자당’. 이것들이 전부 다른 이름으로 등록되어 있었습니다.
‘식물성유지’도 마찬가지였어요. ‘식물성유지’, ‘식물성 유지’, ‘식물유지’, ‘식물성지방’.
띄어쓰기 하나 차이로 다른 것이 되기도 하고, 같은 뜻인데 한자어냐 순우리말이냐에 따라 달라지기도 합니다.
이런 상태로는 비교가 안 돼요. A 제품에 ‘설탕’이 들어가 있고, B 제품에 ‘정백당’이 들어가 있을 때, “둘 다 설탕이 들어가 있네요”라고 알려주려면 이 두 이름이 같은 것이라는 걸 알아야 하니까요.
다행히, 이 문제를 해결할 수 있는 단서가 있었습니다.
4화에서 이야기한 것 중에, 원재료의 표준 코드 사전을 제공하는 API가 있다고 했었죠.
식약처의 I2520이라는 API입니다. 여기에 약 4만 3천 개의 원재료가 등록되어 있고, 각각에 표준 이름과 고유 코드가 부여되어 있었습니다.
그리고 중요한 것이 하나 더 있었어요. 일부 원재료에는 ‘이명’이라는 것이 같이 기록되어 있었습니다.
이명. ‘다른 이름’이라는 뜻입니다.
예를 들어, 표준 이름이 “설탕”인 항목에 이명으로 “정백당”, “백설탕”이 등록되어 있는 식이에요.
이걸 활용하면, 제조사가 “정백당”이라고 적어도 “아, 이건 설탕이구나”라고 연결할 수 있게 됩니다.
그래서 매칭이라는 작업이 필요했습니다.
파싱으로 뽑아낸 각각의 원재료 이름을, 표준 사전의 항목과 연결하는 것.
“이 이름은 사전의 저 항목과 같은 것이다”라고 짝을 지어주는 거예요.
제가 이해한 방식으로 비유하자면 이렇습니다.
학교에 전학생이 왔다고 생각해보세요. 전학생의 이름은 ‘정백당’입니다. 교무실에 있는 학생 명부에는 ‘설탕’이라는 이름이 등록되어 있고, 별명 목록에 ‘정백당’, ‘백설탕’이 적혀 있어요.
전학생이 오면, 별명 목록을 확인해서 “아, 이 학생은 명부의 ‘설탕’과 같은 사람이구나” 라고 연결해주는 것.
이 작업을 98만 건의 원재료 데이터 전체에 대해 하는 것이 매칭 엔진이 하는 일이었습니다.
매칭 방법은 여러 단계로 나뉘었습니다.
가장 확실한 건 이름이 정확히 일치하는 경우입니다. 제조사가 “설탕”이라고 적었고, 사전에도 “설탕”이 있으면 바로 연결이 됩니다. 이걸 ‘정확 일치’라고 불렀어요.
그 다음은 이명 일치. “정백당”이라고 적혀 있는데, 사전의 “설탕” 항목에 이명으로 “정백당”이 등록되어 있으면 연결.
그런데 이 두 가지로 해결되지 않는 경우가 있었습니다.
“밀가루(밀:미국산)“처럼 괄호가 붙어 있으면 정확 일치가 안 되거든요. 사전에는 “밀가루”라고만 등록되어 있으니까요.
그래서 괄호를 떼어내고 비교하는 단계도 만들었고, 띄어쓰기를 제거하고 비교하는 단계도 만들었습니다.
“식물성 유지” → 띄어쓰기 제거 → “식물성유지” → 사전에 있음 → 매칭.
이런 식으로, 단계별로 조금씩 조건을 완화하면서 매칭을 시도하는 구조를 만들었어요.
각 단계마다 ‘신뢰도’라는 점수를 붙였습니다.
이름이 정확히 일치하면 신뢰도 1.0. 이명으로 일치하면 0.95. 괄호를 제거하고 일치하면 0.85. 이름의 일부가 포함되어 있으면 0.7.
신뢰도가 높은 매칭은 자동으로 승인하고, 낮은 매칭은 “이건 좀 확실하지 않으니 나중에 검토하자”라고 표시해두는 방식입니다.
왜 이렇게 했냐면요. 98만 건을 사람이 하나하나 확인할 수는 없으니까, 확실한 것은 자동으로 처리하고, 불확실한 것만 모아서 나중에 확인하려고 했던 거예요.
그런데 이 중에서 ‘포함’ 매칭이라는 것이 있었습니다. 원재료 이름의 일부가 사전 항목에 포함되어 있으면 연결하는 방식인데요.
이게 양날의 검이었습니다.
예를 들어, “고추냉이”라는 원재료가 있을 때, 사전에 “고추”가 있으면 “고추냉이 안에 고추가 포함되어 있으니 매칭”이라고 판단합니다.
그런데 고추냉이는 고추가 아닙니다. 완전히 다른 식물이에요.
이런 식의 오매칭이 포함 매칭에서 발생할 수 있었습니다.
그래서 포함 매칭에는 추가 규칙을 넣었어요. 더 긴 이름을 우선하고, 너무 짧은 이름(한 글자나 두 글자)은 포함 매칭에서 제외하고, 특정 패턴(합성향료의 화학명 등)은 아예 포함 매칭을 시도하지 않도록.
이렇게 해서, 98만 건의 원재료 데이터를 표준 사전과 연결하는 작업이 시작됐습니다.
결과는 다음 화에서 이야기하겠습니다. 700만 건이 넘는 매칭을 수행하면서 어떤 일이 벌어졌는지에 대해서요.