'Recommendation'에 해당되는 글 5건

  1. 2017.03.31 [미미박스 검색이야기] 검색 홈 개인화 추천 서비스 오픈!!
  2. 2017.03.16 [미미박스 검색이야기] PC웹 검색 결과 내 검색어 추천 상품 제공
  3. 2017.01.24 [검색추천] Apache mahout + Elastic Stack 을 이용한 기본 추천
  4. 2016.12.05 [미미박스 검색이야기] 검색로그 기반의 추천과 데이터.
  5. 2016.07.22 [Elasticsearch] MoreLikeThis API 설명

[미미박스 검색이야기] 검색 홈 개인화 추천 서비스 오픈!!

ITWeb/미미박스검색이야기 2017. 3. 31. 16:07

3월의 마지막 드디어 미미박스 검색 홈에 개인화 추천 상품 서비스가 오픈이 되었습니다.


구경하러 가기)

https://m.search.memebox.com


추천 상품을 다양하게 보고 싶으시다면 검색 기능 활용을 많이 해보시면 좋습니다.

대부분의 추천 상품들은 협업필터를 이용해서 구성이 되어 있습니다.


2. 비슷한 취향의 고객님이 선택한 상품

이 기능은 user to user CF를 이용해서 추출 하였습니다.

저희는 데이터의 규모가 크지 않아서 sampling 을 100% 로 적용했습니다.


4. 많이 본 상품과 연관된 추천상품

이 기능은 item to item CF를 이용해서 추출 하였습니다.


각 추천 영역별 설명은 아래 이미지를 참고 하시면 됩니다.


※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.

:

[미미박스 검색이야기] PC웹 검색 결과 내 검색어 추천 상품 제공

ITWeb/미미박스검색이야기 2017. 3. 16. 12:33

작년 10월에 만들어 놨던 추천 데이터 마트 인데 이제야 겨우 PC웹에만 적용이 되었습니다.

우선 검색어 추천 상품은 어떻게 만들어 질까요?


기본 데이터 생성 로직은 아래와 같습니다.


Step 1)

검색을 한 사용자들의 검색어 로그를 수집 합니다.


Step 2)

검색 결과에서 클릭이 발생한 상품 정보를 수집 합니다.


Step 3)

검색어 + 클릭이 발생한 상품 정보에 대한 통계 분석을 하고 RDBS 에 저장 합니다.


Step 4) 

저장된 데이터를 서비스하기 위해 별도 색인 및 API 서버로 데이터를 제공 합니다.


이 과정을 거쳐 아래와 같은 결과가 나오게 됩니다.


검색어)

메이크업


결과)


사실 보통 검색어 별 최대 20개 까지의 추천 상품을 만들어 놓게 되는데요.

왜 3개만 보여 주고 있는지 저는 이해할 수 없지만, 추후 개선해 보자고 설득해 보려 합니다.

만들어진 데이터는 더보기 버튼을 넣어서 보여 주는게 더 좋겠다는 개인적인 생각 입니다.

더 보고 싶은 고객은 더 볼 것이고 보고 싶지 않은 고객은 안 볼 것이고 만들어 놓고 그냥 포기 하는건 지금도 이해가 잘 안되내요.


더 좋은 추천 상품을 제공 할 수 있도록 노력하겠습니다. ^^


※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.


:

[검색추천] Apache mahout + Elastic Stack 을 이용한 기본 추천

Elastic/Elasticsearch 2017. 1. 24. 11:47

Elastic Stack 과 Apache mahout 을 이용한 추천 데이터 생성을 다뤄 볼까 합니다.

기본적으로는 Elastic Stack 만 가지고도 cohort 분석을 통해 추천 데이터 마트 구성이 가능 한데요.

추천 데이터에 대한 품질을 좀 더 좋게 하기 위해 Apache mahout 을 활용해 보도록 하겠습니다.


여기서 다루는 내용은 누구나 쉽게 접근 할 수 있도록 Hello World! 수준만 기술 합니다.


[Elastic Stack]

https://www.elastic.co/products


[Apache mahout]

https://mahout.apache.org/


위 두 솔루션은 모두 오픈소스 이며 예제 코드가 해당 소스에 잘 만들어져 있어 누구나 쉽게 활용이 가능합니다.


Step 1)

Elasticsearch + Logstash + Kibana 를 이용해 로그를 수집하고 추천 할 raw data 를 생성 합니다.


User item click log -> Logstash collect -> Elasticsearch store -> Kibana visualize -> CSV download


여기서 수집한 데이터 중 추출 데이터는 user id + item id + click count 입니다.

아래는 Kibana QueryDSL 예제 입니다.

{

  "size": 0,

  "query": {

    "filtered": {

      "query": {

        "query_string": {

          "query": "cp:CLK AND id:[0 TO *]",

          "analyze_wildcard": true

        }

      },

      "filter": {

        "bool": {

          "must": [

            {

              "range": {

                "time": {

                  "gte": 1485010800000,

                  "lte": 1485097199999,

                  "format": "epoch_millis"

                }

              }

            }

          ],

          "must_not": []

        }

      }

    }

  },

  "aggs": {

    "2": {

      "terms": {

        "field": "user_id",

        "size": 30000,

        "order": {

          "_count": "desc"

        }

      },

      "aggs": {

        "3": {

          "terms": {

            "field": "item_id",

            "size": 10,

            "order": {

              "_count": "desc"

            }

          }

        }

      }

    }

  }

}


Step 2)

Apache mahout 에서 사용할 recommender 는 UserBasedRecommender 입니다.

샘플 코드에도 나와 있지만 dataset.csv 파일은 아래와 같은 형식 입니다.

- Creating a User-Based Recommender in 5 minutes


1,10,1.0
1,11,2.0
1,12,5.0
1,13,5.0

형식) userId,itemId,ratingValue


Step1 에서 위와 같은 형식을 맞추기 위해 user_id, item_id, click_count 를 생성 하였습니다.

이 데이터를 기반으로 UserBasedRecommender 를 돌려 보도록 하겠습니다.


Step 3)

아래 보시면 샘플 코드가 잘 나와 있습니다.

https://github.com/apache/mahout/tree/master/examples/src/main/java/org/apache/mahout


Main class 하나 만드셔서 Step2 에 나와 있는 코드로 돌려 보시면 됩니다.

저는 UserBasedRecommender 를 implements 해서 별도로 구현했습니다.

이건 누구나 쉽게 하실 수 있는 부분이기 때문에 examples 에 나와 있는 BookCrossingRecommender 클래스등을 참고 하시면 됩니다.


UserBasedRecommenderRunner runner = new UserBasedRecommenderRunner();

Recommender recommender = runner.buildRecommender();


// 710039번 유저에 대한 추천 아이템 3개

List<RecommendedItem> recommendations = recommender.recommend(710039, 3);


for (RecommendedItem recommendation : recommendations) {

    LOG.debug("추천 아이템 : {}", recommendation);

}


[실행 로그]

11:39:31.527 [main] INFO  o.a.m.c.t.i.model.file.FileDataModel - Creating FileDataModel for file /git/prototype/data/user-to-item.csv

11:39:31.626 [main] INFO  o.a.m.c.t.i.model.file.FileDataModel - Reading file info...

11:39:31.765 [main] INFO  o.a.m.c.t.i.model.file.FileDataModel - Read lines: 63675

11:39:31.896 [main] INFO  o.a.m.c.t.i.model.GenericDataModel - Processed 10000 users

11:39:31.911 [main] INFO  o.a.m.c.t.i.model.GenericDataModel - Processed 19124 users

11:39:31.949 [main] DEBUG o.a.m.c.t.i.r.GenericUserBasedRecommender - Recommending items for user ID '710039'

11:39:31.965 [main] DEBUG o.a.m.c.t.i.r.GenericUserBasedRecommender - Recommendations are: [RecommendedItem[item:35222, value:4.0], RecommendedItem[item:12260, value:4.0], RecommendedItem[item:12223, value:1.5]]

11:39:31.966 [main] DEBUG o.h.p.mahout.meme.MemeProductRunner - 추천 아이템 : RecommendedItem[item:35222, value:4.0]

11:39:31.966 [main] DEBUG o.h.p.mahout.meme.MemeProductRunner - 추천 아이템 : RecommendedItem[item:12260, value:4.0]

11:39:31.967 [main] DEBUG o.h.p.mahout.meme.MemeProductRunner - 추천 아이템 : RecommendedItem[item:12223, value:1.5]


[Recommender]

similarity = new PearsonCorrelationSimilarity(dataModel);


// 이웃한 N명의 사용자 데이터로 추천 데이터 생성

// UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, dataModel, 0.2);


// 특정 값이나 임계치를 넘는 모든 사용자의 데이터로 추천 데이터 생성, samplingrate : user sampling rate 10%

// UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, dataModel, 0.1);


UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.2, similarity, dataModel, 1.0);

recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);


- 데이터 크기가 너무 작아 ThresholdUserNeighborhood 를 이용하였습니다.


이와 같이 검색 클릭 로그를 기반으로 CF를 돌려 추천 데이터를 만드는 아주 간단한 방법을 알아봤습니다.

만든 추천 데이터에 대한 평가도 가능 합니다.

역시 examples 에 xxxxxxEvaluator 클래스들을 참고하셔서 구현해 보시면 됩니다.


:

[미미박스 검색이야기] 검색로그 기반의 추천과 데이터.

ITWeb/미미박스검색이야기 2016. 12. 5. 12:37

12월 5일 오픈한 미미박스의 상세페이지 내 추천 데이터에 대해서 알려 드리려고 합니다.

추천 데이터 마트 구성은 10월 중순에 시작해서 11월 초에 완료를 했었는데요.

서비스에 적용은 12월 5일에 되었습니다.


초기 추천 데이터 구성을 위해 아래와 같은 데이터를 만들어야 했습니다.

아주 기본적인 추천 데이터라 누구라도 쉽게 하실 수 있을 것이라 생각 됩니다.


[검색로그 기반 추천 데이터]

- 나와 같은 검색어로 검색한 사람들의 다른 검색어

- 나와 같은 상품을 본 사람들이 본 다른 상품

- 나와 같은 검색어를 입력한 사람들이 본 다른 상품

- 내가 보고 있는 상품이 속한 카테고리의 상품 중 다른 사람이 본 상품

- 내가 보고 있는 상품이 속한 브랜드의 상품 중 다른 사람이 본 상품


그 이외 

- 카테고리 별 인기 검색어 (구현 되어 있음)

- 브랜드 별 인기 검색어 (구현 되어 있음)

- 키워드 별 인기 카테고리 (구현 되어 있음)

- 키워드 별 인기 브랜드 (구현 되어 있음)

- 구매 기반의 추천 데이터

- 장바구니 기반의 추천 데이터

- 사용자 기호/성향 등에 의한 추천 데이터

등등 앞으로도 해야 할것이 많이 남아 있기는 합니다.


[이 상품을 본 다른 고객들이 본 다른 상품]

- 다른 고객님이 함께 보신 상품으로 노출 되고 있습니다.


[내가 보고 있는 상품이 속한 카테고리 내 다른 고객들이 많이 찾아 본 상품]

- 페이스 메이크업 카테고리 BEST 로 노출 되고 있습니다.


[내가 보고 있는 상품이 속한 브랜드 내 다른 고객들이 많이 찾아 본 상품]

- 미미박스 브랜드 BEST 로 노출 되고 있습니다.


추천 상품이 실제 고객에게 도움이 될 수 있도록 앞으로 더 발전 시켜 나가 보도록 하겠습니다.

많이 사용해 주세요. ^^


※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.

:

[Elasticsearch] MoreLikeThis API 설명

Elastic/Elasticsearch 2016. 7. 22. 16:21

mlt 를 이용하면 쉽게 추천 기능을 구현 할 수 있습니다.

그래서 해당 API에 대한 문서를 제 맘데로 옮겨다 놓았습니다.

추후 elasticsearch + mlt 를 이용한 machine learning 이나 recommendation 구현 방법에 대해서 공유 하도록 하겠습니다.


참고문서)

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html


API 설명)

More Like This Query

- MLT 쿼리는 주어진 문서셋과 같은 문서를 찾도록 해줍니다.

- 입력된 문서의 대표 키워드 셋을 가지고 질의 하여 결과를 리턴하게 됩니다.

- 리턴된 결과의 문서들은 대표 키워드 셋과 유사한 문서들로 구성 되게 됩니다.

- MLT 질의 시 문서 또는 키워드로 질의를 할 수 있습니다.


Parameters


Document Input Parameters

  - like

    작성된 문서 또는 text를 바탕으로 문서를 검색 합니다.

  - unlike

    작성된 문서 또는 text에서 제외 시킬 term을 작성 합니다.

  - fields

    문서에서 analyzed text 를 가져올 필드를 지정 합니다.

    이 필드를 대상으로 질의 수행이 이루어 집니다.

  - like_text

    like 와 더불어 문서를 검색 할떄 추가적으로 사용할 text를 작성 합니다.

  - ids or docs

    @deprecated


Term Selection Parameters

  - max_query_terms

    작성된 문서 또는 text에서 추출하여 사용할 최대 query term size 입니다. (default 25)

  - min_term_freq

    작성된 문서 또는 text의 최소 TF 값으로 이 값보다 작을 경우 작성된 문서와 text는 무시 됩니다. (default 2)

  - min_doc_freq

    입력된 개별 term들에 대해서 각각 matching 된 문서의 최소 크기로 해당 크기 보다 작은 term의 결과는 무시 됩니다. (default 5)

  - max_doc_freq

    입력된 개별 term들에 대해서 각각 matching 된 문서의 최대 크기로 해당 크기 보다 큰 term의 결과는 무시 됩니다. (default unbounded 0)

  - min_word_length

    입력된 개별 term들의 최소 길이로 정의한 값보다 작은 term은 무시 됩니다. (default 0)

  - max_word_length

    입력된 개별 term들의 최대 길이로 정의한 값보다 큰 term은 무시 됩니다. (default unbounded 0)

  - stop_words

    불용어 목록을 등록 합니다.

  - analyzer

    입력한 문서와 text에 대한 analyzer 를 지정 합니다. 지정 하지 않을 경우 first field 의 analyzer 를 사용하게 됩니다.


Query Formation Parameters

  - minimum_should_match

    작성된 문서 또는 text에서 추출된 term matching 에 대한 minimum_should_match 정보를 구성 합니다. (default 30%)

  - boost_terms

    tems boost value 를 지정 합니다.

  - include

    검색 결과로 입력 문서를 포함 할지 말지를 결정 합니다. (default false)

  - boost

    전체 질의에 대한 boost value 를 지정 합니다. (default 1.0)


샘플 QueryDSL)

{

  "query": {

    "more_like_this": {

      "fields": [

        "title"

      ],

      "like": "마스크 수분",

      "min_term_freq": 1,

      "min_doc_freq": 10,

      "min_word_length": 2,

      "include": true

    }

  },

  "from": 0,

  "size": 5,

  "fields": [

    "id",

    "title"

  ]

}


: