기본 콘텐츠로 건너뛰기

11월, 2018의 게시물 표시

냉장고 가계부 프로젝트 40

식품을 추가하면, 해당 식품이 어떤 종류인지 사람은 쉽게 유추할 수 있다. 예를들어, 우유, 치즈 같은 제품은 유제품으로 분류할 수 있고, 사과, 바나나, 딸기 같은 제품은 과일로 분류할 수 있다. 이렇게 같은 특성을 지닌 부류나 범위를 범주 , 또는 카테고리 라고 한다. 사용자가 새로운 식품을 추가하면, 해당 식품이 어느 범주에 속하는지를 분류해서 입력값으로 넘겨준다면 좋겠지만, 너무 많은 입력을 요구하면 View가 복잡해지고 사용자 편의성이 떨어지게 된다. 따라서, 입력되는 식품명을 기반으로 해당 식품의 범주가 어디에 속하는지 분류해준다면 편리할 것이다. 식품명에 따른 범주화해주는 로직은 다음과 같다. 사용자로부터 식품명을 입력받는다. 사전에 분류해둔 키워드 데이터들과 입력받은 식품명의 유사도를 측정한다. 측정된 유사도 결과값 중에서 가장 유사한 키워드의 범주를 반환한다. 예를들어, {사과, 바나나, 딸기} 는 "과일" 이라는 집단으로 분류하고, {우유, 치즈, 요거트} 는 "유제품" 이라는 집단으로 분류한다. 사용자가 입력한 식품명이 "맛있는 사과 5kg (23과내)" 라고 주어졌을 때, "사과" - "맛있는 사과 5kg (23과내)" 와 유사도를 측정하고, "바나나" - "맛있는 사과 5kg (23과내)" 와 유사도를 측정하고, "딸기" - "맛있는 사과 5kg (23과내)" 와 유사도를 측정한다. 같은 방식으로 유제품의 키워드들과도 유사도를 측정한다. 키워드 각각 주어진 식품명과 유사도를 측정해서 나온 결과 값이 가장 높은 키워드의 범주값을 반환한다. 키워드 데이터와 주어진 문자열 사이의 유사한 정도를 측정하기 위해서 자카드 유사도 라는 알고리즘을 사용한다. 자카드 유사도( 자카드 지수 )는 두 집합 사이의 유사도를 측정하는 방법이다. 자카드 유사도 알고

냉장고 가계부 프로젝트 39

식품명을 등록하는 부분에 자동완성 기능을 제공하면 사용자가 식품명을 입력할 때 좀 더 편리하게 사용할 수 있다. 위 스크린샷처럼 식품명을 한글자씩 입력할 때마다, 입력한 키워드로 시작하는 단어들을 제공한다. 냉장고 가계부 프로젝트에서는 단지 식품명을 입력하는데 도움을 주는 기능을 제공하므로, 사전에 준비된 키워드 목록을 제공한다. javascript는 bootstrap3-typeahead 를 사용한다. 키워드를 검색하기 위한 fridge-search 프로젝트를 새로 생성한다. 키워드 목록의 빠른 검색을 위해 Trie 알고리즘 을 사용한다. Trie 알고리즘을 구현한 Apache Commons Collection4 라이브러리를 사용하기위해 pom.xml 에 다음과 같이 의존성을 추가한다. <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> </dependency> Apache Commons Collections의 Trie  인터페이스를 구현한 구현클래스 PatriciaTrie 를 사용하여 자동완성 기능을 구현한다. 내부적으로 Map 인터페이스를 구현하고 있기때문에 데이터의 추가는 put, 삭제는 remove 메서드를 사용하며, prefixMap 이라는 메서드는 주어진 key 값을 접두사로 갖는 데이터들을 SortedMap 타입으로 리턴한다. 식품명 자동완성을 위해 ProductNameTrie 클래스를 다음과 같이 구현했다. @Component public class ProductNameTrie { private Trie<String, Long> trie = new PatriciaTrie<>(); private static final int MAX_SIZE = 10; public s