2011-02-28 3 views
5

우리는 시장에서 서로를 찾으려하는 구매자와 판매자가 있다고 가정합니다. 구매자는 키워드로 자신의 필요를 태그 할 수 있습니다. 판매자는 판매하는 상품에 대해 동일한 조치를 취할 수 있습니다. 나는 그들의 두 키워드 세트에 기초하여 특정 구매자에 대한 관련성 측면에서 순위 순서 판매자가 알고리즘을 찾는 데 관심이있다.키워드를 기반으로 매칭을위한 알고리즘

buyer_keywords = {"furry", "four legs", "likes catnip", "has claws"} 

다음 우리는 우리가 그들의 관련성의 측면에서 순서를 평가해야 할 두 가지 잠재적 인 판매자가 : 우리가 키워드의 교차를 사용하는 경우

seller_keywords[1] = {"furry", "four legs", "arctic circle", "white"} 
seller_keywords[2] = {"likes catnip", "furry", 
         "hates mice", "yarn-lover", "whiskers"} 

을 여기

은 예입니다 , 우리는 많은 차별을받지 않습니다 : 둘 다 두 키워드에서 교차합니다. 교차 수를 집합 유니온의 크기로 나눈다면 판매자 2는 더 많은 수의 키워드로 인해 실제로 악화됩니다. 이는 키워드 세트 크기를 수정하지 않는 모든 메소드에 대해 자동 페널티를 도입하는 것처럼 보일 것입니다. 키워드를 추가하면 벌칙을 부과하고 싶지 않습니다.

문제에 좀 더 구조를 넣으려면, 우리는 우리가 할 수 이제 키워드 (각 판매자 1로 요약 할) 특성, 예를 들어, :

seller_keywords[1] = {"furry":.05, 
         "four legs":.05, 
         "arctic circle":.8, 
         "white":.1} 

seller_keywords[2] = {"likes catnip":.5, 
         "furry":.4, 
         "hates mice":.02, 
         "yarn-lover":.02, 
         "whiskers":.06} 

강도의 일부 진실 측정이 있다고 가정 조회수 값을 합산합니다. 이제 판매자 1은 .1의 점수를 얻지 만 판매자 2는 .9의 점수를 얻습니다. 지금까지 너무 좋아,하지만 지금 우리는 매우 제한, 비 기술적 인 키워드 세트와 세 번째 판매자를 얻을 수 있습니다 :

seller_keywords[3] = {"furry":1} 

이 아닌 자신의 유일한 키워드의 모든 히트의 상단에 투석기를 좋은.

어쨌든, 내 생각에 이것은 상당히 일반적인 문제이며 알려진 강점과 한계를 지닌 다른 알고리즘 솔루션이 있다는 것입니다. 이것은 아마도 CS101에서 다룰 내용입니다. 따라서이 질문에 대한 좋은 대답은 관련 참조에 대한 링크 일 수 있습니다.

+0

나는 우리가 일치하는 키워드의 수로 유효 점수를 곱해야한다고 생각합니다. 예를 들어, II'nd의 경우에 우리는 단지 1 개의 일치를 가지며 점수 1을 가지므로 유효 점수 1 * 1 = 1.But in 2 개의 일치 항목이 발견되면 2 * 1 = 2 인 효과적인 점수를 얻게됩니다.이 항목이 선택됩니다.이 접근 방식에 대해 뭐라 말합니까? – Algorithmist

답변

7

감사합니다 나는 당신이 cosine similarity를 사용하는 방법을 찾고 생각; 그것은 첫 번째 해킹으로 당신을 꽤 끌어들일 수있는 기본적인 기술입니다.

person1[0] = 0  # this person doesn't care about aardvarks 
person1[1] = 0.05 # this person cares a bit about anteaters 
... 
person1[N] = 0 

각 사람이 지금의 벡터이다 :

terms[0] --> aardvark 
terms[1] --> anteater 
... 
terms[N] --> zuckerberg 

그런 다음 각 사람이 공간에 벡터를 만들 : 직관적으로, 당신은 당신이 알고있는 모든 태그는 특정 인덱스를 갖는 벡터를 생성 N 차원 공간. 그런 다음 코사인 유사성을 사용하여 쌍의 유사성을 계산할 수 있습니다. 계산식으로, 이것은 기본적으로 두 벡터 사이의 각도를 묻는 것과 같습니다. 코사인을 1에 가깝게 설정하려면 벡터가 대략 동일 직선 상에 있음을 의미합니다. 즉, 대부분의 치수에 대해 비슷한 값을가집니다.

이 메트릭을 개선하려면 tf-idf 벡터의 요소에 가중치를 사용하는 것이 좋습니다. Tf-idf는 인기있는 용어 (예 : 'iPhone')의 중요성을 경시하며이 사람이 특히 연관되어있는 인기없는 용어의 중요성을 홍보합니다.

tf-idf 가중치와 코사인 유사도를 결합하면 이와 같은 대부분의 응용 프로그램에서 잘 나타납니다.

+2

코사인 유사성은'{ "furry": 1}'의 마지막 문제를 해결하지 못했지만 (즉, 두 정규화 된 벡터의 내적을 취하는 대신) 실제 내적을 사용할 수 있습니다. 구매자를 정규화하지 않는 것은 중요하지 않습니다. 왜냐하면 구매자가 모든 결과에 동일한 축척 계수를 적용하고 여전히 동일한 순위를 매기므로. 판매자를 정규화하지 못하면 키워드 목록에 초점을 맞추는 것뿐만 아니라 다른 기준에 따라 판매자를 비중있게 선택할 수 있습니다. 간단한 예를 들어 하나의 키워드의 강도를 제한 할 수 있으므로 하나의 키워드 만 나열하는 판매자의 진도는 <1입니다. –

0

당신이 찾고있는 것은 분류학입니다. 내용에 태그를 지정하고 관련성의 순서에 따라 순서를 매 깁니다.

일부 준비가 된 알고리즘을 찾을 수는 없지만 실질적인 사례부터 시작할 수 있습니다. Drupal documentation for taxonomy은 몇 가지 지침을 제공하고 search module의 출처를 확인합니다.

기본적으로 순위는 용어의 빈도를 기반으로합니다. 적은 수의 태그로 제품을 정의하면 더 많은 가중치를 갖게됩니다. 극소수의 제품 페이지에만 나타나는 태그는 매우 구체적이라는 것을 의미합니다. 당신은 당신의 말의 강도를 정적 인 방법으로 정의해서는 안됩니다. 그러나 그들의 문맥에서 그들을 시험한다.

+0

이것은 문제를 해결하기위한 알고리즘이나 수학적 프레임 워크가 아니라 문제를 해결하기위한 특정 라이브러리와 더 비슷합니다. – templatetypedef

관련 문제