!7 static double zoom = 1.5; static volatile BufferedImage img, recognizedImage; static L texts; static ImageSurface is, isWord; static volatile int score; static volatile L posTexts, negTexts; static Set dontPrint; sbool scoreBox; static int coresToUse = 1; p-subst-autorestart { run(#1015409); ocr_recognizeMultiLine_scored_maxPixels = 20000; hideConsoleOnFirstFrame(); dontPrint = mechSetCI("Movie Review Cat | Negative/positive words don't print list"); thread "The Loop" { theLoop(); } noMainDone("Cat!"); } svoid theLoop { repeat with sleep 0 { temp tempSetCoresToUse(coresToUse); img = shootScreen2(); long recTime = sysNow(); assertEquals("Cores to use", coresToUse, coresToUse_fixed()); texts = ocr_recognizeMultiLine_scored(img); print(filledSimpleRecognizer_cached().cacheStats()); recTime = sysNow()-recTime; time "Post" { MultiSet multiSet = asCIMultiSet(words(lines(mapMethod('text, texts)))); Set positiveWords = mechSetCI("Movie Review Cat | Positive words"); Set negativeWords = mechSetCI("Movie Review Cat | Negative words"); final MultiSet plus = multiSetSetIntersection(multiSet, positiveWords); final MultiSet minus = multiSetSetIntersection(multiSet, negativeWords); score = l(plus)-l(minus); posTexts = [RecognizedText r : texts | containsOneOfTheWords(r.text(), setMinusSet(keys(plus), dontPrint))]; negTexts = [RecognizedText r : texts | containsOneOfTheWords(r.text(), setMinusSet(keys(minus), dontPrint))]; L popPlus = mostPopularEntriesFromMultiMap(3, plus); L popMinus = mostPopularEntriesFromMultiMap(3, minus); S text = "Score: " + score; if (scoreBox) { if (score >= 0 && nempty(popPlus)) text += "\n" + joinWithComma(popPlus); if (score <= 0 && nempty(popMinus)) text += "\n" + joinWithComma(popMinus); flatInfoBox(recTime + " ms | " + escapeNewLines(text)); } S imageID = minusZeroPlus(score, #1101254, #1101256, #1101255); recognizedImage = img; } bool first = is == null; is = showImage_hcentered(is, "Movie Review Cat!", loadImage2_cached(imageID)); if (first) { setDoubleBuffered(is, true); frameTitlePopupMenu(is, voidfunc(JPopupMenu menu) { menu.add(boolFieldMenuItem(mc(), 'scoreBox)); menu.add(intFieldMenuItem(mc(), 'coresToUse)); }); alwaysOnTopFrame(is); addToWindowWithMargin(is, jfullcenter(isWord = jImageSurface())); enlargeFrameLeftAndBottom(is, 50); isWord.setZoom(2); awtEvery(isWord, 333, f cycleWord); } } } svoid cycleWord { if (recognizedImage == null) ret; RecognizedText hilite = random(score > 0 ? posTexts : score < 0 ? negTexts : null); if (hilite != null) { BufferedImage clip = clipBufferedImage(recognizedImage, hilite.r); isWord.setImage(clip); showZoomedScreenClipInPlace(hilite.r, clip, zoom, 0.5); } else isWord.setImage(newBufferedImage(1, 1, Color.white)); }