开发者

python popularity cloud not working

开发者 https://www.devze.com 2023-01-20 21:55 出处:网络
I built a popularity cloud but it doesn\'t work properly. The txt file is; 1 Top Gear 3 Scrubs 3 The Office (US)

I built a popularity cloud but it doesn't work properly. The txt file is;

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

In my popularity cloud, names are written their frequency times. For example, Legend of the Seeker is written 5 times and their size increases. Every word is supposed to be written one time and the size must be according to popularity number (5). But every word should be written one time and its size must be according to its popularity. How can I fix it?

And also my program should provide that condition:

Terms with the same frequency are typically displayed in the same colour e.g. Golf and Karate. Different frequencies are typically shown in different colours e.g. Basketball, Cricket and Hockey. At the bottom of each cloud output the frequency/count in the colour used to display the values in the cloud.

My code follows here.

#!/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.appe开发者_如何学编程nd((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()


I'm not sure this can categorize by color, but it only takes 4 lines of code to generate a tag cloud in the directory you run the code in. https://github.com/atizo/PyTagCloud

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号