어떻게 Python 을 통 해 라벨 클 라 우 드 알고리즘 을 실현 합 니까?

라벨 클 라 우 드(Tag Cloud)는 각종 블 로그 사이트 에서 흔히 볼 수 있 는데 라벨 은 사이트 내용 분류 에 유리 하고 관련 내용 추천 에 도 사용 할 수 있다.최근 필 자 는 개인 적 인 오픈 소스 블 로그 Django블 로그 에 새로운 기능 인 태그 클 라 우 드 가 추가 되 었 습 니 다.

실현 원리
라벨 클 라 우 드 가 최종 적 으로 보 여 주 는 효 과 는 두 개의 HTML 매개 변수 에 의 해 제 어 된 것 이다.그것 이 바로 font-size 와 color 이다.예 를 들 어:

<a href="http://foofish.net/blog/tag/django" rel="external nofollow" style="font-size:24px; color:#4f4f4f">django</a>
태그 와 연 결 된 글 이 많 을 수록 이 태그 가 인용 되 는 횟수 가 많 고 font-size 의 값 도 클 수록 color 의 색 이 진 하 다 는 것 을 나타 낸다.체험 효 과 를 고려 하여 font-size 는 태그 의 인용 횟수 가 증가 함 에 따라 무한 으로 증가 할 수 없습니다.그렇지 않 으 면 페이지 가 매우 추 해 보 입 니 다.따라서 font-size 를 한 구간 으로 제어 하고 동 리 color 도 한 구간 에 있다.
여기 font-size 를 12 에서 33 사이 에 배열 FONTSIZES,태그 의 font-size 속성 은 안의 한 값 일 수 있 습 니 다.COLORS 는 FONT 입 니 다.SIZES 에 대응 하 는 배열,12 에 대응 하 는\#ccc,15 에 대응 하 는\#adadad 를 유추 합 니 다.

MIN_FONT_SIZE = 12 #     
MAX_FONT_SIZE = 33 #     
FONT_SIZES = [MIN_FONT_SIZE, 15, 18, 21, 24, 27, 30, MAX_FONT_SIZE] 
COLORS = ['#ccc', "#adadad", '#8e8e8e', '#6f6f6f', '#4f4f4f', '#303030', '#111', '#000']
현재 관건 적 인 문 제 는 라벨 의 인용 횟수(tagref_count)font-size 를 확인 합 니 다.font-size 가 되면 color 도 이에 따라 확정 된다.태그 의 font-size 를 배열 FONT 에 고 르 게 분포 하려 면SIZES 에서 지 켜 야 할 원칙 은 횟수 가 증가 함 에 따라 font-size 의 수치 도 증가 하고 인용 횟수 가 가장 적은 라벨 은 MIN 을 사용 하 는 것 이다.FONT_SIZE,인용 횟수 가 가장 많은 라벨 은 MAX 사용FONT_SIZE。
그래서 공식 이 있 습 니 다.MINFONT_SIZE + n*step = MAX_FONT_SIZE,step 는 걸음 길이 입 니 다.n 은 인용 횟수 가 가장 많은 라벨 에서 인용 횟수 가 가장 적은 라벨 을 뺀 것 을 말 합 니 다.둘 사이 에 모두 몇 걸음 의 step 가 있 는 지 를 말 합 니 다.이 루트 에 따라 한 걸음 의 step 값 이 얼마 인지 계산 할 수 있 습 니 다.걸음 이 길 다 는 것 을 알 게 되면 임의의 라벨 의 font-size 를 계산 할 수 있 습 니 다.모든 라벨 에서 최소 라벨 까지 의 걸음 수 는 이들 의 차이 입 니 다.그래서 모든 태그 의 font-size 는 MIN 입 니 다.FONT_SIZE + (tag_ref_count-min_ref_count)*step

원본 코드:

# encoding: utf-8
__author__ = 'liuzhijun'
class TagCloud(object):
MIN_FONT_SIZE = 12
MAX_FONT_SIZE = 33
FONT_SIZES = [MIN_FONT_SIZE, 15, 18, 21, 24, 27, 30, MAX_FONT_SIZE]
COLORS = ['#ccc', "#adadad", '#8e8e8e', '#6f6f6f', '#4f4f4f', '#303030', '#111', '#000']
def __init__(self, min_ref_count, max_ref_count):
TagCloud.min_ref_count = min_ref_count
#              ,          0,        font-size.
if max_ref_count == min_ref_count:
TagCloud.step = 0
else:
TagCloud.step = (TagCloud.MAX_FONT_SIZE - TagCloud.MIN_FONT_SIZE) / (max_ref_count - min_ref_count)
def get_tag_font_size(self, tag_ref_count):
font_size = TagCloud.MIN_FONT_SIZE + (tag_ref_count - TagCloud.min_ref_count) * TagCloud.step
#        font_size       FONT_SIZES      ,               
#        FONT_SIZES     
font_size = min(TagCloud.FONT_SIZES, key=lambda x: abs(font_size - x))
return font_size
def get_tag_color(self, tag_ref_count):
return TagCloud.COLORS[(TagCloud.FONT_SIZES.index(self.get_tag_font_size(tag_ref_count)))]
출력 결과:

12,12,12,18,24,18,21,27,33,
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기