Облако популярности Python не работает - PullRequest
0 голосов
/ 23 октября 2010

Я создал облако популярности, но оно не работает должным образом. Текстовый файл:

1 Top Gear
3 Scrubs
3 The Office (US)
5 Heroes
5 How I Met Your Mother
5 Legend of the Seeker
5 Scrubs
.....

В моем облаке популярности имена пишутся с частотой. Например, Legend of the Seeker пишется 5 раз, и их размер увеличивается. Каждое слово должно быть написано один раз, а размер должен соответствовать числу популярности (5). Но каждое слово должно быть написано один раз, и его размер должен соответствовать его популярности. Как я могу это исправить?

А также моя программа должна обеспечить следующее условие:

Термины с одинаковой частотой обычно отображаются одним и тем же цветом, например Гольф и Каратэ. Разные частоты обычно показаны разными цветами, например Баскетбол, Крикет и Хоккей. Внизу каждого облака выведите частоту / количество цветов, используемых для отображения значений в облаке.

Здесь следует мой код.

#!/usr/bin/python
import string

def main():
    # get the list of tags and their frequency from input file
    taglist = getTagListSortedByFrequency('tv.txt')
    # find max and min frequency
    ranges = getRanges(taglist)
    # write out results to output, tags are written out alphabetically
    # with size indicating the relative frequency of their occurence
    writeCloud(taglist, ranges, 'tv.html')

def getTagListSortedByFrequency(inputfile):
    inputf = open(inputfile, 'r')
    taglist = []
    while (True):
        line = inputf.readline()[:-1]
        if (line == ''):
            break
        (count, tag) = line.split(None, 1)
        taglist.append((tag, int(count)))
    inputf.close()
    # sort tagdict by count
    taglist.sort(lambda x, y: cmp(x[1], y[1]))
    return taglist

def getRanges(taglist):
    mincount = taglist[0][1]
    maxcount = taglist[len(taglist) - 1][1]
    distrib = (maxcount - mincount) / 4;
    index = mincount
    ranges = []
    while (index <= maxcount):
        range = (index, index + distrib-1)
        index = index + distrib
        ranges.append(range)
    return ranges

def writeCloud(taglist, ranges, outputfile):
    outputf = open(outputfile, 'w')
    outputf.write("<style type=\"text/css\">\n")
    outputf.write(".smallestTag {font-size: xx-small;}\n")
    outputf.write(".smallTag {font-size: small;}\n")
    outputf.write(".mediumTag {font-size: medium;}\n")
    outputf.write(".largeTag {font-size: large;}\n")
    outputf.write(".largestTag {font-size: xx-large;}\n")
    outputf.write("</style>\n")
    rangeStyle = ["smallestTag", "smallTag", "mediumTag", "largeTag", "largestTag"]
    # resort the tags alphabetically
    taglist.sort(lambda x, y: cmp(x[0], y[0]))
    for tag in taglist:
        rangeIndex = 0
        for range in ranges:
            url = "http://www.google.com/search?q=" + tag[0].replace(' ', '+') + "+site%3Asujitpal.blogspot.com"
            if (tag[1] >= range[0] and tag[1] <= range[1]):
                outputf.write("<span class=\"" + rangeStyle[rangeIndex] + "\"><a href=\"" + url + "\">" + tag[0] + "</a></span> ")
                break
            rangeIndex = rangeIndex + 1
    outputf.close()

if __name__ == "__main__":
    main()

1 Ответ

0 голосов
/ 13 февраля 2013

Я не уверен, что это можно классифицировать по цвету, но требуется всего 4 строки кода для генерации облака тегов в каталоге, в котором вы запускаете код. https://github.com/atizo/PyTagCloud

...