package com.kennycason.kumo;
import com.kennycason.kumo.bg.CircleBackground;
import com.kennycason.kumo.bg.PixelBoundryBackground;
import com.kennycason.kumo.bg.RectangleBackground;
import com.kennycason.kumo.font.FontWeight;
import com.kennycason.kumo.font.KumoFont;
import com.kennycason.kumo.font.scale.LinearFontScalar;
import com.kennycason.kumo.font.scale.SqrtFontScalar;
import com.kennycason.kumo.nlp.FrequencyAnalyzer;
import com.kennycason.kumo.nlp.tokenizer.ChineseWordTokenizer;
import com.kennycason.kumo.palette.ColorPalette;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Created by kenny on 6/29/14.
*/
@Category(IntegrationTest.class)
public class PolarWordCloudITest {
private static final Logger LOGGER = Logger.getLogger(WordCloudITest.class);
@Test
public void whaleImgLargePolarTest() throws IOException {
final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
frequencyAnalyzer.setWordFrequenciesToReturn(600);
frequencyAnalyzer.setMinWordLength(4);
frequencyAnalyzer.setStopWords(loadStopWords());
final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("text/new_york_positive.txt"));
final List<WordFrequency> wordFrequencies2 = frequencyAnalyzer.load(getInputStream("text/new_york_negative.txt"));
final Dimension dimension = new Dimension(990, 618);
final PolarWordCloud wordCloud = new PolarWordCloud(dimension, CollisionMode.PIXEL_PERFECT);
wordCloud.setPadding(2);
wordCloud.setBackgroundColor(Color.WHITE);
wordCloud.setBackground(new PixelBoundryBackground(getInputStream("backgrounds/whale.png")));
wordCloud.setFontScalar(new LinearFontScalar(15, 50));
final long startTime = System.currentTimeMillis();
wordCloud.build(wordFrequencies, wordFrequencies2);
LOGGER.info("Took " + (System.currentTimeMillis() - startTime) + "ms to build");
wordCloud.writeToFile("output/polar_newyork_whale_large_blur.png");
}
@Test
public void newyorkPolarCircle() throws IOException {
final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
frequencyAnalyzer.setWordFrequenciesToReturn(750);
frequencyAnalyzer.setMinWordLength(4);
frequencyAnalyzer.setStopWords(loadStopWords());
final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("text/new_york_positive.txt"));
final List<WordFrequency> wordFrequencies2 = frequencyAnalyzer.load(getInputStream("text/new_york_negative.txt"));
final Dimension dimension = new Dimension(600, 600);
final PolarWordCloud wordCloud = new PolarWordCloud(dimension, CollisionMode.PIXEL_PERFECT, PolarBlendMode.BLUR);
wordCloud.setPadding(2);
wordCloud.setBackground(new CircleBackground(300));
wordCloud.setFontScalar(new SqrtFontScalar(10, 40));
final long startTime = System.currentTimeMillis();
wordCloud.build(wordFrequencies, wordFrequencies2);
LOGGER.info("Took " + (System.currentTimeMillis() - startTime) + "ms to build");
wordCloud.writeToFile("output/polar_newyork_circle_blur_sqrt_font.png");
}
@Test
public void newyorkPolarRectangle() throws IOException {
final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
frequencyAnalyzer.setWordFrequenciesToReturn(750);
frequencyAnalyzer.setMinWordLength(4);
frequencyAnalyzer.setStopWords(loadStopWords());
final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("text/new_york_positive.txt"));
final List<WordFrequency> wordFrequencies2 = frequencyAnalyzer.load(getInputStream("text/new_york_negative.txt"));
final Dimension dimension = new Dimension(800, 600);
final PolarWordCloud wordCloud = new PolarWordCloud(dimension, CollisionMode.PIXEL_PERFECT, PolarBlendMode.BLUR);
wordCloud.setPadding(2);
wordCloud.setBackground(new RectangleBackground(dimension));
wordCloud.setFontScalar(new SqrtFontScalar(10, 40));
final long startTime = System.currentTimeMillis();
wordCloud.build(wordFrequencies, wordFrequencies2);
LOGGER.info("Took " + (System.currentTimeMillis() - startTime) + "ms to build");
wordCloud.writeToFile("output/polar_newyork_rectangle_blur.png");
}
@Test
public void chineseVsEnglishTideComments() throws IOException {
final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
frequencyAnalyzer.setWordFrequenciesToReturn(750);
frequencyAnalyzer.setMinWordLength(3);
frequencyAnalyzer.setStopWords(loadStopWords());
final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("text/english_tide.txt"));
final FrequencyAnalyzer chineseFrequencyAnalyzer = new FrequencyAnalyzer();
chineseFrequencyAnalyzer.setWordFrequenciesToReturn(750);
chineseFrequencyAnalyzer.setMinWordLength(2);
chineseFrequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());
final List<WordFrequency> wordFrequencies2 = chineseFrequencyAnalyzer.load(getInputStream("text/chinese_tide.txt"));
final Dimension dimension = new Dimension(800, 600);
final PolarWordCloud wordCloud = new PolarWordCloud(dimension, CollisionMode.PIXEL_PERFECT, PolarBlendMode.BLUR);
wordCloud.setPadding(2);
wordCloud.setBackground(new RectangleBackground(dimension));
wordCloud.setFontScalar(new SqrtFontScalar(10, 70));
final ColorPalette colorPalette = new ColorPalette(new Color(0xD5CFFA), new Color(0xBBB1FA), new Color(0x9A8CF5), new Color(0x806EF5));
final ColorPalette colorPalette2 = new ColorPalette(new Color(0xFA8E8E), new Color(0xF77979), new Color(0xF55F5F), new Color(0xF24949));
wordCloud.setColorPalette(colorPalette);
wordCloud.setColorPalette2(colorPalette2);
final long startTime = System.currentTimeMillis();
wordCloud.build(wordFrequencies, wordFrequencies2);
LOGGER.info("Took " + (System.currentTimeMillis() - startTime) + "ms to build");
wordCloud.writeToFile("output/polar_tide_chinese_vs_english2.png");
}
@Test
public void tidyCatLitter() throws IOException {
final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
frequencyAnalyzer.setWordFrequenciesToReturn(400);
frequencyAnalyzer.setMinWordLength(4);
frequencyAnalyzer.setStopWords(loadStopWords());
final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("text/tidy_cat_litter_positive.txt"));
final List<WordFrequency> wordFrequencies2 = frequencyAnalyzer.load(getInputStream("text/tidy_cat_litter_negative.txt"));
final Dimension dimension = new Dimension(600, 600);
final PolarWordCloud wordCloud = new PolarWordCloud(dimension, CollisionMode.PIXEL_PERFECT, PolarBlendMode.BLUR);
wordCloud.setPadding(2);
wordCloud.setKumoFont(new KumoFont("Cairo", FontWeight.BOLD));
wordCloud.setBackground(new PixelBoundryBackground(getInputStream("backgrounds/cat.bmp")));
wordCloud.setFontScalar(new SqrtFontScalar(10, 40));
final long startTime = System.currentTimeMillis();
wordCloud.build(wordFrequencies, wordFrequencies2);
LOGGER.info("Took " + (System.currentTimeMillis() - startTime) + "ms to build");
wordCloud.writeToFile("output/tidy_cat_litter_cat_shape3.png");
// horrible times, 400 words, total 800 words
// pixel perfect
// loading from png 1335661ms
// loading from bmp 359172ms
// rectangle
// loading from bmp 464401ms
// after optimization one
// pixel perfect
// loading from bmp 35213ms
// now, 18110ms
}
private static Set<String> loadStopWords() {
try {
final List<String> lines = IOUtils.readLines(getInputStream("text/stop_words.txt"));
return new HashSet<>(lines);
} catch (IOException e) {
LOGGER.error(e.getMessage(), e);
}
return Collections.emptySet();
}
private static InputStream getInputStream(String path) {
return Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
}
}