slant parse:

Using Machine Learning to Determine the Political Leanings of News Publications


Serena L Booth, Harvard College, Class of 2016

Joseph M Booth, Harvard College, Class of 2015

URL for accessing our scraped data: slantparse.com/data/slantparse_data.zip


Part 0: Overview and Motivation

Provide an overview of the project goals and the motivation for it. Consider that this will be read by people who did not see your project proposal.

Our original goal for this project was to train a classifier such that we were able to determine the unstated political leanings of satirical news organizations. This idea came up in casual conversation between the authors, and it was (and is) something we very much want to investigate. In drafting our project proposal and in meeting with our TF Olivia, it became apparant that for such a project to be relevant, we would need to provide a metric for determining the success of our classification. Given that the types of satirical news organizations we wanted to target certainly do not have a stated leaning, and nor have any or many lists of political leanings been created for these publications, such a metric couldn't be readily verified. For this reason, we decided to refine our project idea to determine the political leanings of news organizations in general.

Both of the authors of this project are very interested in text analysis and natural language processing; this interest was part of our motivation for studying classification of political leanings in texts. Additionally, we wanted to explore scraping and cleaning data from the web. We had a lot of fun with that aspect of this project, and we both felt extremely proud of how neatly our article-retrieved text came out of our scraper (post computational clean up, naturally).

The principal result of this work is a classifier which is trained on more than 600 articles scraped from five Liberal sources and five Conservative sources. This classifier vectorizes the words, considers the word frequencies, removes stop words (words like "the" or "again"), and successfully classifies the test data with approximately 75% accuracy. We look at the precision, the recall, and the F1-score for our classifier. We then provide some visualizations for interpreting our data and our feature evaluation.

Part 1: Related Work

Anything that inspired you, such as a paper, a web site, or something we discussed in class.

We, the authors of this project, were inspired to work with news data due to particular current events that were unfolding at the time of this project. These current events include ruling in the Ferguson case as well as the case of Eric Gardner, among many other interesting, complex, and deep news stories. We set out to learn about the reprentation of politics in natural language. Further, we are both very interested in natural language processing in general and saw this as an opportunity to explore that interest, as well as an opportunity to learn how to scrape and clean text data from the web.

The main reason the authors embarked on this endeavor was to see how politics is evident in writing. Is it restricted to phrases like "Obamacare" versus the "Affordable Care Act"? Or is it more subtle, affecting adjective choices and emotion words? Because we wanted to see how politics manifested itself in writing, we didn't want to restrict our classification scheme to a single subject (like Obamacare or Ferguson) -- we really wanted to see what features of politics were expressed across topics and across publications.

In short, as news junkies we wanted to work with news data, and as students we wanted to explore natural language processing and classification further.

Part 2: Initial Questions

What questions are you trying to answer? How did these questions evolve over the course of the project? What new questions did you consider in the course of your analysis?

Initially, we wanted to learn about the political slants of satirical news organizations. Over the course of this project, particularly after discussing the project with our TF, we realized that coming up with a valid metric for sites like 'The Onion', which has no official political leaning, was an unattainable goal. We wouldn't be able classify satirical news organizations with conviction, as we would have no proof of validity. For this reason, we refined our question to concern only those publications with a known political slant. Over the course of this project, this question became data-focused: we wanted to know if our classifier was successful, and if it was, what features caused it to be successful. We answer these questions in our visualizations, and we also channeled these questions into a feature of our website. On our website, we create a web tool which allows a guest to enter an article text, and we classify that article in real time.

Part 3: Metric

Our metric is relatively simple. We looked up lists of the best conservative and liberal news publications; we chose five well-ranked publications from either list and used these to train a classifier capable of determining the political leaning of each article from each publication.


In [1]:
GET_NEW_ARTICLES = False      #changing this to true will add new content to the dataset.

import urllib
import csv
from bs4 import BeautifulSoup
from sets import Set
from sgmllib import SGMLParser
import pickle 
from textstat.textstat import textstat as ts
from sklearn import svm
from sklearn import neighbors
from sklearn import tree
from sklearn import ensemble
from sklearn.feature_extraction import text
from sklearn import metrics
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline
from sklearn.linear_model import SGDClassifier
from sklearn.ensemble import GradientBoostingClassifier
import sklearn.linear_model
from os import path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import numpy as np


import csv, enchant, string, cPickle, re, time
from collections import Counter
import stop_words

%matplotlib inline

In [2]:
list_of_political_magazines = ['http://en.wikipedia.org/wiki/List_of_political_magazines', 'http://en.wikipedia.org/wiki/Category:Modern_liberal_American_magazines',
                               'http://en.wikipedia.org/wiki/Category:Conservative_American_magazines', 'http://usconservatives.about.com/od/gettinginvolved/tp/TopConservativeMagazines.htm',
                               'http://www.allyoucanread.com/top-10-political-magazines/', 'http://www.conservapedia.com/Conservative_media', 
                               'http://www.dailykos.com/story/2009/04/05/716698/-The-Compleat-Revised-Guide-to-Liberal-and-Progressive-News-and-Politics-on-the-Web',
                               'http://www.washingtonpost.com/blogs/the-fix/wp/2014/10/21/lets-rank-the-media-from-liberal-to-conservative-based-on-their-audiences/']

Part 4: Data

Source, scraping method, cleanup, etc.

We use the metric defined above (cross-referencing lists of political leanings) to determine 5 liberal sources and 5 conservative sources.

The 5 liberal sources:

- Mother Jones
- The Nation
- Slate
- The New Yorker
- The Washington Post

The 5 conservative sources:

- The Christian Science Monitor
- The Weekly Standard
- TownHall
- The American Conservative
- The American Spectator

We first visit the homepage of each of these publications. From the home page, we scrape all links and store these in a set. We then visit each such link, check if it is an article from the given publication, and then scrape that data into a csv called articles.csv. The format of articles.csv is: publication title, political leaning (C or L), article title, article text.


In [3]:
# cite: https://github.com/chungy/diveintopython/blob/master/py/urllister.py
class URLLister(SGMLParser):
    """
    Arguments: (implicit) SGMLParser 
    
    Extracts all 'href's from an html document. We store these links in a set, 
    and process them individually to retrieve content or additional links. 
    """
    def reset(self):
        SGMLParser.reset(self)
        self.urls = []

    def start_a(self, attrs):
        href = [v for k, v in attrs if k=='href']
        if href:
            self.urls.extend(href)

In [4]:
def process_url(url, url_mod, string_start, find_string, start_article_delim, end_article_delim, name, pol):
    """
    Arguments: string url, string url_mod, string find_string, string start_title_delim, 
    string end_title_delim, string start_article_delim, string end_article_delim, string name, string pol
    
    For each url passed to process_url, open the CSV file articles.csv which contains all data scraped.
    Process the article by retrieving the title, and by using BeautifulSoup to retrieve the article text.
    Store each article in the CSV as the publication name, the publication's political leaning (either 'L' or 'C'), article title, and article content.  
    """
        
    
    #with open('articles_scraped.pickle', 'a+') as handle:
    #    pickle.dump(set(), handle)
    
    # check url format
    if len(url) > 0 and ((str(url)[0] == '/' and string_start == "argument-not-used") or str(url).find(string_start) == 0) and str(url).find(find_string) != -1: 
        with open('articles.csv', 'a+') as csvfile:
            article_writer = csv.writer(csvfile, delimiter=',')
            
            tmp_url = url_mod + str(url)
            usock = urllib.urlopen(tmp_url)
            html = usock.read()
                        
            # use Beautiful Soup 
            soup_unprocessed = BeautifulSoup(html)
            
              
            # use try/except to catch cases in which articles do not conform to general standards
            # e.g. when an article does not have a title
            try:
                title = soup_unprocessed.title.string 
                title = title.encode("utf-8")
                
                 # If article is from a specific provider, modify it according to the following rules: 
                # e.g. in the case of Townhall, we only want html which has the full article rather than a paged version
                if name == "TownHall" and html.find("View Full Article") != -1:
                    process_url(url + '/page/full', url_mod, string_start, find_string, start_article_delim, end_article_delim, name, pol)
                    usock.close()
                    return
                elif name == "Slate" and html.find('<div class="single-page">') != -1: 
                    process_url(url[0:url.find('.html')] + '.single.html', url_mod, string_start, find_string, start_article_delim, end_article_delim, name, pol)
                    usock.close()
                    return
                elif name == "Mother Jones" and (title.find('Issue') != -1 or title.find('map') != -1):
                    print 'Content not text, or article not relevant.\n'
                    usock.close()
                    return
                elif name == "The American Conservative" and html.find('Author Archives') != -1 or title.find('Web Headlines') != -1 or title.find('Articles') != -1:
                    print 'Content not text, or article not relevant.\n'
                    usock.close()
                    return
                elif name == "The Christian Science Monitor" and (title.find('+video') != -1 or url.find('The-Culture') != -1 or title.find('Photos of the day') != -1 or title.find('How much do you know about') != -1):
                    print 'Content not text, or article not relevant.\n'
                    usock.close()
                    return 
                elif name == "The Blaze" and title.find('Video') != -1:
                    print 'Content not text, or article not relevant.\n'
                    usock.close()
                    return
                elif name == "Slate" and (url.find('video') != -1 or url.find('podcast') != -1): 
                    print 'Content not text, or article not relevant.\n'
                    usock.close()
                    return
                elif name == "The Washington Post" and (url.find('live') != -1 or html.find('posttv-video-template') != -1):
                    print 'Content not text, or article not relevant.\n'
                    usock.close()
                    return
                else: 
                    print title + '\n'
                    content = str(html)[str(html).find(start_article_delim) + len (start_article_delim):str(html).find(end_article_delim)]
                    soup = BeautifulSoup(content)
                    
                    # remove JS from html 
                    for script in soup(["script", "style"]):
                        script.extract() 
                        
                    mod_content = soup.get_text()
                
                # check if article has already been processed;
                with open('articles_scraped.pickle', 'rb') as handle:
                    article_list = pickle.load(handle)
                    if title in article_list: 
                        print '\n ALREADY IN SET \n'
                        return
                    else:
                        with open('articles_scraped.pickle', 'wb') as handle:
                            article_list.append(title)
                            pickle.dump(article_list, handle)
                
                mod_content = mod_content.encode("utf-8") 
                
                ascii_title = unicode(title, 'ascii', 'ignore')
                ascii_content = unicode(mod_content, 'ascii', 'ignore')

                article_writer.writerow([name, pol, ascii_title, ascii_content])
            except AttributeError: 
                print 'Attribute Error'
                
            usock.close()

In [5]:
def scrape(start_url, iterator, url_list, url_mod):      
    """
    Arguments: string start_url, int iterator, set url_list, string url_mod
    Returns: updated set url_list 
    
    For each start_url passed, this function opens that url and retrieves all hrefs from that page. 
    If iterator is smaller than the (constant) number of ITER_PAGES, scrape is called recursively 
    on the set of urls. 
    """
    
    # limit the number of articles retrieved by limiting page depth
    if iterator > ITER_PAGES: 
        return set()
    
    # call URLLister to retrieve all hrefs in the html read from the url 
    usock = urllib.urlopen(start_url)
    parser = URLLister()
    html = usock.read()
    parser.feed(html)
    usock.close()
    parser.close()
    
    url_list = url_list.union(parser.urls)
    
    # scrape each correctly formatted url
    for url in url_list: 
        if len(url) > 0 and str(url)[0] == '/': 
            tmp_url = url_mod + str(url)
            try: 
                tmp_set = scrape(tmp_url, iterator + 1, url_list, url_mod)
                url_list = url_list.union(tmp_set) 
            except IOError: 
                print "Couldn't Open"
    return url_list

In [6]:
ITER_PAGES = 1

# pickle setup
articles_to_pickle = []
try:
    with open('articles_scraped.pickle', 'rb') as handle:
        articles_to_pickle = pickle.load(handle)
except IOError: 
    with open('articles_scraped.pickle', 'wb') as handle:
        pickle.dump(articles_to_pickle, handle)

# call the function
url_list = set()  
american_conservative_list = scrape('http://www.theamericanconservative.com/', 1, url_list, '')
townhall_list = scrape('http://www.townhall.com/', 1, url_list, 'http://www.townhall.com')
csmonitor_list = scrape('http://www.csmonitor.com/', 1, url_list, 'http://www.csmonitor.com/')
weekly_std_list = scrape('http://www.weeklystandard.com/', 1, url_list, 'http://www.weeklystandard.com/')
spectator_list = scrape('http://spectator.org/', 1, url_list, 'http://spectator.org/')

mother_jones_list = scrape('http://www.motherjones.com/', 1, url_list, 'http://www.motherjones.com')
nation_list = scrape('http://www.thenation.com/', 1, url_list, 'http://www.thenation.com/')
slate_list = scrape('http://www.slate.com/', 1, url_list, '')
newyorker_list = scrape('http://www.newyorker.com/', 1, url_list, '')
wp_list = scrape('http://www.washingtonpost.com/', 1, url_list, '')

# Set this flag to "true" above if you want to add to the content!
if GET_NEW_ARTICLES:
    # conservative 1
    for url in american_conservative_list: 
        process_url(url, '', 'http://www.theamericanconservative.com/', 'theamericanconservative', '<div class="post-content">', '<footer id="articlefooter">', 'The American Conservative', 'C')

    # conservative 2
    for url in townhall_list:
        process_url(url, 'http://www.townhall.com', 'argument-not-used', '2014' , '<ul class="breadcrumb">', '<hr class="article-divider"', 'TownHall', 'C')

    # conservative 3
    for url in csmonitor_list:
        process_url(url, 'http://www.csmonitor.com/', 'argument-not-used', '2014/', '<div id="story-body"', '<span id="end-of-story"', 'The Christian Science Monitor', 'C')

    # conservative 4
    for url in weekly_std_list: 
        process_url(url, 'http://www.weeklystandard.com/', 'argument-not-used', '/articles/', '  <div class="all_article">', '<div class="article-footer">', 'The Weekly Standard', 'C')

    # conservative 5
    for url in spectator_list:
        process_url(url, 'http://spectator.org/', 'argument-not-used', '/articles/', 'target="_blank" rel="nofollow">', '</iframe></div><div class="field-item even"><p class="label">', 'The American Spectator', 'C')

    # liberal 1 
    for url in mother_jones_list:
        process_url(url, 'http://www.motherjones.com', 'argument-not-used', '2014' , '<div id="node-header" class="clear-block">', '<div id="node-footer" class="clear-block">', 'Mother Jones', 'L')

    # liberal 2
    for url in nation_list:
        process_url(url, 'http://www.thenation.com/', 'argument-not-used', '/article/', '<div class="field field-type-text field-field-image-caption">', '</p></div><div class="views-field-value byline">', 'The Nation', 'L')

    # liberal 3
    for url in slate_list:
        process_url(url, '', 'http://www.slate.com/', '/2014/', '<div class="text text-1 parbase section">', '<section class="about-the-author', 'Slate', 'L')

    # liberal 4 - slightly more complex 
    for url in newyorker_list:
        if url.find('//') == 0 or len(url) < 45:
            print 'URL badly formatted'
            # do nothing for this url
        else:
            process_url(url, '', 'http://www.newyorker.com/', 'news', '<div itemprop="articleBody" class="articleBody" id="articleBody">', '<span class="dingbat">', 'The New Yorker', 'L')
            process_url(url, '', 'http://www.newyorker.com/', 'magazine/2014', '<div itemprop="articleBody" class="articleBody" id="articleBody">', '<span class="dingbat">', 'The New Yorker', 'L')

    # liberal 5
    for url in wp_list:
        process_url(url, '', 'http://www.washingtonpost.com/', '/2014/', '<div id="article-body" class="article-body">', '</article>', 'The Washington Post', 'L')

In [7]:
CHAR_LEN_BOUND = 1500

fd = open('articles.csv', 'rb')
raw_rows = []

reader = csv.reader(fd, delimiter=',')
for reading in reader:
    raw_rows.append(reading)

def basic_strip(article):
    """
    Arguments: string article
    Returns: string
    
    When passed article text, this function looks for words which are on its 'exclude' list; these
    words include those which ask users to share articles on social media. All words are converted to lower case. 
    Only the sentences which do not include words from the 'exclude' list are returned in the cleaned string. 
    """
    exclude = ["facebook", "digg", "tagged", "recommended", "stumbleupon", "share", "blogs", "user agreement", "subscription", "login", "twitter", "topics", "excel", "accessed", "check out", "tweet", "|", "see also", "e-mail", "strongbox",
               "ad choices", "photograph", "about us", "faq", "careers", "view all", "app", "sign in", "contact us", "comment", "follow", "@", "http", "posted", "update", "staff writer", "editor", "advertisement", "clearfix", "eza"]
    article = re.sub('[ \t\n]+' , ' ', article)
    sentences = article.split('.')
    new_sentences = []
    for sen in sentences:
        clean = True
        for word in exclude:
            if word in sen.lower():
                clean = False

        if clean:
            new_sentences.append(sen)

    outstr = ""
    for sen in new_sentences:
        if len(sen) > 5:
            outstr += sen.strip() + '. '
    return outstr

rows = []

for i in range(0, len(raw_rows)):
    article_text = basic_strip(raw_rows[i][3])
    if len(article_text) > CHAR_LEN_BOUND:
        rows.append([raw_rows[i][0], raw_rows[i][1], raw_rows[i][2], article_text])
        
print 'Finished applying the basic_strip function to text.'


Finished applying the basic_strip function to text.

Part 5: Feature Vector Creation, Classification

For this part of the project, we analyzed several different types of classifiers. We considered using random forest classifiers, a Bayesian multinomial classifier, a traditional svm. We finally decided to use a gradient boosting classifier. We did so for several reasons; first and foremost, this type of classifier is robust to overfitting, which we control by selecting a random sample of articles as the training set, leaving the remaining articles we scraped as test data.


In [8]:
Xtrain, Ytrain = [],[]
Xtest, Ytest = [],[]

# function for converting format of CountVectorizer output to be used for classification
def csr_2_list(csr):
    ints = [csr[0,i] for i in range(0, csr.shape[1]) ]
    return ints

num_libarticles, num_consarticles = 0, 0

for row in rows:
    if row[1] == 'C':
        num_consarticles += 1
    else:
        num_libarticles += 1
       
        
print "***VECTORIZING DOCUMENTS***"


test_rows = rows[::2]
train_rows = rows[1::2]

stop_words = text.ENGLISH_STOP_WORDS.union(['said'])

# construct a CountVectorizer and give it training data
tk_train = text.CountVectorizer(max_features=2400, stop_words=stop_words)
text_doc_matrix_train = tk_train.fit_transform([row[3] for row in train_rows])

# construct another CountVectorizer with vocabulary based on training set's vocab
tk_test = text.CountVectorizer(max_features=2400, stop_words=stop_words, vocabulary = tk_train.vocabulary_)
text_doc_matrix_test = tk_test.fit_transform([row[3] for row in test_rows])

for i in range(0, text_doc_matrix_train.shape[0]):
    Xtrain.append(csr_2_list(text_doc_matrix_train[i]))
    Ytrain.append(train_rows[i][1])

for i in range(0, text_doc_matrix_test.shape[0]):
    Xtest.append(csr_2_list(text_doc_matrix_test[i]))
    Ytest.append(test_rows[i][1])

print ">>>DONE VECTORIZING DOCUMENTS<<<\n"

print "***TRAINING CLASSIFIER***"

# define the classifier

clf = GradientBoostingClassifier(n_estimators = 800, max_depth = 5)
clf.fit(Xtrain, Ytrain)

print ">>>DONE TRAINING CLASSIFIER<<<\n"

print "***DUMPING CLASSIFIER***"

fd = open('./web/classifier', 'wb')
cPickle.dump(clf, fd, cPickle.HIGHEST_PROTOCOL)
fd.close()

fd = open('./web/vocab', 'wb')
cPickle.dump(tk_train.vocabulary_, fd, cPickle.HIGHEST_PROTOCOL)
fd.close()

print ">>>DONE DUMPING CLASSIFIER<<<\n"


***VECTORIZING DOCUMENTS***
>>>DONE VECTORIZING DOCUMENTS<<<

***TRAINING CLASSIFIER***
>>>DONE TRAINING CLASSIFIER<<<

***DUMPING CLASSIFIER***
>>>DONE DUMPING CLASSIFIER<<<

Part 6: Exploratory Analysis

What visualizations did you use to look at your data in different ways? What are the different statistical methods you considered? Justify the decisions you made, and show any major changes to your ideas. How did you reach these conclusions?

We first look at all of our test data and see how the classifier ranks the article's political slant relative to its publisher's political slant.

After looking at the classification directly, we then look at the precision, recall, and F1-score for our classifier. All of these values tend to be around 80%.

Having looked at the precision, recall, and F1-scores for our classifier, we then consider the data we scraped from the ten liberal and conservative sources. We visualize this data by creating a word cloud of all of the words (not including stop words) from all of the articles. We then create another word cloud, this time looking at the most important features to the classifier.


In [9]:
successes,trials = 0,0

predicted = clf.predict(Xtest)

for i in range(0, len(Xtest)):
    print "FOR: " + test_rows[i][2] + "\n CLF SAID: " + clf.predict(Xtest[i])[0] + " ACTUALLY: " + Ytest[i]
    if Ytest[i] == clf.predict(Xtest[i])[0]:
        successes += 1
    trials+=1

print "\n The classifier was %.2f%% accurate." % (float(successes)/trials*100)
print "\n %d liberal articles, %d conservative articles." % (num_libarticles, num_consarticles) 
print "\n"


FOR: What Not to Do on Iran | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: Channing Tatum. Wrestling Picture. Whadaya Need  A Road Map? | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: Double Feature Feature: 10,000 Hours Edition | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: About Us | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: A Fraternity of Rape | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: Bringing Back Husbandry | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: The Moral Path to Peace | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: SWPLs & Eric Garner | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: The Uses and Abuses of Historical Analogies | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: Federalism Can Still Save Religious Liberty | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: Against the Mob | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: Ferguson Is Not Palestine | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: The Greatly Overrated Rubio | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: A Chuck Hagel Postmortem | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: Galloping Toward Gomorrah | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: Considering Thankfulness | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: Thanksgiving Doorbusters Backfire on Big Retail | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: Cotton and the Iran Hawks Loathing of Diplomacy | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: At Gitmo, a Tough Policy To Swallow - Steve Chapman -  Page full
 CLF SAID: L ACTUALLY: C
FOR: Why Conservatives Should Get to Know Bitcoin - Townhall Magazine 
 CLF SAID: L ACTUALLY: C
FOR: Europe Is Way Behind the United States... And Here's Why - Daniel J. Mitchell - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Report: Prominent Ex-Governor Making Inquiries Into NH... - Daniel Doherty 
 CLF SAID: L ACTUALLY: C
FOR: The Willfully Ignorant - Derek Hunter -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Black People The Media Hate (And Rand Paul Isn't Wild About) - Ann Coulter -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Diplomacy Failed in Iran: Fund Missile Defense - George Landrith -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Something Weird in the U.S. New Home Market - Political  Calculations - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: L ACTUALLY: C
FOR: Ferguson: Inconvenient Facts About the Encounter - Larry Elder -  Page full
 CLF SAID: L ACTUALLY: C
FOR: Where's the Fire, Buddy?  - Rich Galen -  Page full
 CLF SAID: C ACTUALLY: C
FOR: The Weird United Nations Rule That Makes It Cheaper To Buy From Foreign Companies - Kevin Glass 
 CLF SAID: C ACTUALLY: C
FOR: "The Advent of Controversy" - Jerry Newcombe -  Page full
 CLF SAID: C ACTUALLY: C
FOR: GOP Poll: Perhaps Landrieu Should Start Packing Her Bags... - Daniel Doherty 
 CLF SAID: C ACTUALLY: C
FOR: Facebook Journalism: Is It Such Big News? - Debra J. Saunders -  Page full
 CLF SAID: C ACTUALLY: C
FOR: After He, Racism - John Ransom - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Socialist Party Caught "Underpaying" Minimum Wage Activists   - Michael Schaus - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: L ACTUALLY: C
FOR: How Washington should think about the Internet of Things - CSMonitor.com
 CLF SAID: L ACTUALLY: C
FOR: Possibility unbound: 25 years of progress for those with disability - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Constant cycle of violence in Israel, regulating working hours in Japan, Bangladeshs quiet mobile revolution, Kenya standing against terrorist at... - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Is Obama favoring donors in ambassador appointments? That's nothing new. - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: With fewer young people gambling, time for a government rethink - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: From Egyptian judges: conspiracy theories, mass death sentences, and freedom for Mubarak - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Sarah Palin weighs in on Ferguson. Was it funny or offensive? - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Amid anger over Eric Garner, a unique moment for change in NYPD - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Inventor hopes to clean the air with giant purifiers - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Could you pass a citizenship test? States may make it graduation requirement. - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Prospector Theater helps the disabled entertain new prospects - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Why 20 year drop in crime is more impressive than it seems - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Taking a cue from nightclubs, 24-hour bookstores boom in Taiwan: Could they work in the US? - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: British police arrest seven in latest anti-jihadi sweep - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: The Benghazi Whitewash | The Weekly Standard
 CLF SAID: L ACTUALLY: C
FOR: Uncommon Ancestor  | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: The Laughs on Us  | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: Outer Borough Tales    | The Weekly Standard
 CLF SAID: L ACTUALLY: C
FOR: The Reacher File   | The Weekly Standard
 CLF SAID: L ACTUALLY: C
FOR: Voice of Experience | The Weekly Standard
 CLF SAID: L ACTUALLY: C
FOR: French Curtains | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: Comte Franaise    | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: No Deal | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: Hartache | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: The Bitter End | The Weekly Standard
 CLF SAID: L ACTUALLY: C
FOR: Crpes Suzette or Pie? | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: A Solution for Cities on the Brink of Bankruptcy | The American Spectator
 CLF SAID: C ACTUALLY: C
FOR: Dad & Dylan | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: The Gift Shop of the Dead | The American Spectator
 CLF SAID: C ACTUALLY: C
FOR: FDA: More Nutrition Information Will Make Americans Healthier  Oh, Really? | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: Do What the Cops Tell You: It Isn't Rocket Science | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: The Sins of Elizabeth Lauten | The American Spectator
 CLF SAID: C ACTUALLY: C
FOR: It Cant Rain Hard Enough | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: Opinions Versus Facts | The American Spectator
 CLF SAID: C ACTUALLY: C
FOR: Rainy Day Rage | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: What? Another Conversation About Race? | The American Spectator
 CLF SAID: C ACTUALLY: C
FOR: The US Government Deported 438,000 People in 2013. 83 Percent Never Got a Hearing. | Mother Jones
 CLF SAID: C ACTUALLY: L
FOR: I Told a Grand Jury I Saw a Cop Shoot and Kill an Unarmed Man. It Didn't Indict. | Mother Jones
 CLF SAID: C ACTUALLY: L
FOR: The Problem With the Ferguson, Ray Rice, and UVA Rape Stories | Mother Jones
 CLF SAID: L ACTUALLY: L
FOR: Thurgood Marshall Blasted Police for Killing Black Men With Chokeholds | Mother Jones
 CLF SAID: L ACTUALLY: L
FOR: An Open Letter To Charles Barkley | The Nation
 CLF SAID: L ACTUALLY: L
FOR: Plugged Into the Socket of Life | The Nation
 CLF SAID: L ACTUALLY: L
FOR: Our Words, Our Selves | The Nation
 CLF SAID: L ACTUALLY: L
FOR: Why Hagels Departure Is a Victory For War Hawks  | The Nation
 CLF SAID: C ACTUALLY: L
FOR: In Egypts Growing Insurgency, Civilians Pay the Highest Price | The Nation
 CLF SAID: L ACTUALLY: L
FOR: The UN Backs Down a Little, Adds More Women to Its Peacekeeping Panel | The Nation
 CLF SAID: L ACTUALLY: L
FOR: Why Its Impossible to Indict a Cop | The Nation
 CLF SAID: L ACTUALLY: L
FOR: Uber raises $1.2 billion: New funding gives Travis Kalanick's ride service a $40 billion valuation.
 CLF SAID: L ACTUALLY: L
FOR: Running calculator: Introducing Slates marathon time predictor, a better way to calculate how fast youll run.
 CLF SAID: L ACTUALLY: L
FOR: Ferguson grand jury investigation: A shadow trial violates the publics right to access.
 CLF SAID: C ACTUALLY: L
FOR: Adam Voorhes photographs a rare collection of brains in his book, Malformed: Forgotten Brains of the Texas State Mental Hospital, with Alex Hannaford.
 CLF SAID: L ACTUALLY: L
FOR: Hawaiian "Mele Kalikimaka," Greek "khristos," Xmas, and why not "Hristmas": Sound changes in Christmas vocabulary.
 CLF SAID: C ACTUALLY: L
FOR: Sabrina Rubin Erdely, UVA: Why didnt a Rolling Stone writer talk to the alleged perpetrators of a gang rape?
 CLF SAID: L ACTUALLY: L
FOR: New York City protests over Eric Garner grand jury decision.
 CLF SAID: L ACTUALLY: L
FOR: Stephanie Diani: Live Audience! Looks at the people who attend multiple television tapings (PHOTOS).
 CLF SAID: L ACTUALLY: L
FOR: Ball Aerospace: A company known for mason jars helped with NASA's Orion capsule.
 CLF SAID: L ACTUALLY: L
FOR: Whole Foods Detroit: Can a grocery store really fight elitism, racism, and obesity?
 CLF SAID: L ACTUALLY: L
FOR: Top skyscrapers around the world that were stalled, stunted, stopped midconstruction, or never built. 
 CLF SAID: L ACTUALLY: L
FOR: Patrick Morarescu photographs performance artists.
 CLF SAID: L ACTUALLY: L
FOR: Edie Bresler: We Sold a Winner looks at the stores that sold winning lottery tickets around the country (PHOTOS).
 CLF SAID: L ACTUALLY: L
FOR: The new seven wonders: Defining the top technological marvels of the contemporary age.
 CLF SAID: L ACTUALLY: L
FOR: Katrina Arnold photographs New Orleans Ladies Arm Wrestling tournaments.  
 CLF SAID: L ACTUALLY: L
FOR: Pink slugs, drunken parrots, giant earthworms, and tree lobsters of Australia.
 CLF SAID: L ACTUALLY: L
FOR: Best books of 2014: Slate Book Review editor picks.
 CLF SAID: C ACTUALLY: L
FOR: U.S. Department of Education comes out in support of transgender students' rights.
 CLF SAID: C ACTUALLY: L
FOR: Cosby lawsuit claims extortion by Judy Huth.
 CLF SAID: L ACTUALLY: L
FOR: Dear Prudence: My husband is a bad gift-giver.
 CLF SAID: L ACTUALLY: L
FOR: Dear Prudence: I was fat-shamed by my cousin at Thanksgiving.
 CLF SAID: L ACTUALLY: L
FOR: M83: New composite shows incredible detail.
 CLF SAID: L ACTUALLY: L
FOR: Tension between Germany and other eurozone countries over stimulus is hurting the economy.
 CLF SAID: C ACTUALLY: L
FOR: Why female Jacana birds do all the fighting while the males stay home and watch the kids. 
 CLF SAID: L ACTUALLY: L
FOR: Ridley Scotts Exodus: Were ancient Egyptians white, black, or brown?
 CLF SAID: L ACTUALLY: L
FOR: Dress codes: Smart casual, dress to impress, cocktail attire, tropical chic, explained.
 CLF SAID: C ACTUALLY: L
FOR: Sheldon Adelson may have spent too much fighting Internet gambling: The Las Vegas billionaire shouldnt have made himself part of the story.
 CLF SAID: C ACTUALLY: L
FOR: Chicago minimum wage vote: $13 by 2019, including for domestic workers. 
 CLF SAID: L ACTUALLY: L
FOR: The U.K.s Mr. Austerity Doubles Down - The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: Rohan Marleys Marijuana Venture
 CLF SAID: L ACTUALLY: L
FOR: What the Eric Garner Grand Jury Didnt See - The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: ISIS at the Border
 CLF SAID: L ACTUALLY: L
FOR: Can Chris Rock Make the Leap to Leading Man?
 CLF SAID: L ACTUALLY: L
FOR: New Yorks Verdict: We Cant Breathe - The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: The Carnival Logic of American Horror Story: Freak Show
 CLF SAID: L ACTUALLY: L
FOR: The View from a Bridge
 CLF SAID: L ACTUALLY: L
FOR: An Alaskan Poets Lyrics of Sex and Power
 CLF SAID: L ACTUALLY: L
FOR: The Wu-Tang Clans A Better Tomorrow
 CLF SAID: C ACTUALLY: L
FOR: Police union: We dont believe its an issue of race. We believe its an issue of poverty - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: I honestly dont know what to say; Jon Stewart gets serious on Eric Garner - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The big winner of the holiday season so far: mobile shopping - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Does this postal chairmans lobbying history pose a conflict of interest? - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Arab autocrats are not going back to the future - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The problem with the U.S. policy of no ransoms? Hostage rescues are very, very difficult. - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Residents of Prince Georges have waited too long for improved medical facilities - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: DARRIN BELL: From Ferguson to New York cases, Candorville cartoonist draws deeply from the personal [Q&A] - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: PM Update: Rain moves in this evening; Fallstreak clouds over D.C. - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: This flu season could be a bad one, CDC says - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: New York Mayor, police union officials clash after grand jury decision in Eric Garners death - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Plunging oil prices spell trouble for Alaska, Americas own petro-state - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Washington state man accused of making threats against Darren Wilson, ex-Ferguson cop who shot Michael Brown - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Katie Zezima - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Winona State gymnast Brooke Baures dies following accident in food-service elevator - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Fixing the conflict of interest at the core of police brutality cases - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Are you smart enough to retire? - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: I refuse to post a single picture of my baby on Facebook - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: The glaring problem with #CrimingWhileWhite - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Black males and the cops who kill them - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Dangerous Super Typhoon Hagupit on collision course with Philippines - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Knox County cop fired immediately after photos show brutal choking of student - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: In the global struggle for Internet freedom, the Internet is losing, report finds - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Scott Allen - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Catherine Rampell: Men want women to be equal, but the system defeats them - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: The Eric Garner cases sickening outcome - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Could Barry sue Lena Dunham over her memoirs? - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Star Wars, Episode VII: Please, for the love of God, as little politics as possible - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Capitals at Hurricanes: Game 25 discussion thread - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The rules of engagement: How militarized police units enforce the law around the world - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Fidelis Ad Mortem? | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: The Catos of Old Media | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: Racist Copsor Liberal Slander? | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: Canadas Patriot Act Moment | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: Rapping at the Supreme Court - Suzanne Fields -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Declining Affordability in the Sales Mix of New Homes - Political  Calculations - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Requiring Calorie Counts on Menu Probably Won't Make People Healthier - Christine Rousselle 
 CLF SAID: L ACTUALLY: C
FOR: Obama Sues Companies for Complying with Obamacare - Michael Schaus - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: L ACTUALLY: C
FOR: Hollywood Hypocrites - Brent Bozell -  Page full
 CLF SAID: L ACTUALLY: C
FOR: The Legacy of Michael Brown and the Future of Young Black Men - Charlotte Hays -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Holiday Online Shopping Leads to Big Wins - Chris Versace - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: L ACTUALLY: C
FOR: Congress Must Fight Back Against Obama's Lawlessness - David Limbaugh -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Ferguson Vs. New York City - Linda Chavez -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Benghazi Baloney  - D.W. Wilber -  Page full
 CLF SAID: L ACTUALLY: C
FOR: S.E. Cupp: The Death of a Meme - Townhall Magazine 
 CLF SAID: C ACTUALLY: C
FOR:  The "Eric Garner" Decision: Truth vs. Ideology - Jack Kerwick -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Russell Brand and Che Guevara Have Much in Common  - Humberto Fontova -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Landrieu is French Toast - Arthur  Schaper  -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Even Advocates of Past Governments Shutdowns Advise Extreme Caution This Time - Matt Towery -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Clinton's Stock Declining in Futures Market - Michael Barone -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Exoneration: Democrat-Led 'Bridgegate' Investigation Clears Christie of Wrongdoing - Guy Benson 
 CLF SAID: C ACTUALLY: C
FOR: Biogens Alzheimer Surprise  - Bill Gunderson -  Page full
 CLF SAID: L ACTUALLY: C
FOR: Why it's harder than ever to remain anonymous on the Web - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Taking lessons from Typhoon Haiyan, Philippines moves fast on new storm - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: US 'terrorism?' What's not being said about Kansas City, Austin attacks. - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Kenyan raid exposes hive of cybercrime - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Cybersecurity unit drives Israeli Internet economy - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Arabs, Europeans move to fill US void on Israeli-Palestinian conflict - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Stasi-linked party is back in power. Is Germany ready? - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Rolling Stone backs off story of alleged fraternity rape at UVA - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: With death of unarmed Phoenix man, has national debate reached critical mass? - CSMonitor.com
 CLF SAID: L ACTUALLY: C
FOR: Landrieus last stand: why Deep South white Democrats are vanishing - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: No Justification | The Weekly Standard
 CLF SAID: L ACTUALLY: C
FOR: Beyond the Barricades  | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: Menendez vs. the White House | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: The Benghazi Report | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: Mistress of Murder    | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: Strait Man | The Weekly Standard
 CLF SAID: L ACTUALLY: C
FOR: Wrestlers and Brothers  | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: Kevorkians Vision | The Weekly Standard
 CLF SAID: C ACTUALLY: C
FOR: Stormin Norman   | The Weekly Standard
 CLF SAID: L ACTUALLY: C
FOR: Ferguson in Black and White | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: The Cautionary Tale of Elizabeth Lauten | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: Don't Let the Rolling Stone Controversy Distract You From the Campus Rape Epidemic | Mother Jones
 CLF SAID: L ACTUALLY: L
FOR: We Dont Just Need Nicer Cops. We Need Fewer Cops. | The Nation
 CLF SAID: L ACTUALLY: L
FOR: Ava DuVernay profile: The Selma director on her MLK drama and being a black female director in Hollywood.
 CLF SAID: L ACTUALLY: L
FOR: History of spycraft: Manual for British spies during WWII. 
 CLF SAID: L ACTUALLY: L
FOR: Cult film slang: Words first cited in the OED from Heathers, Pulp Fiction, Withnail and I, Ghostbusters, Blade Runner, Spinal Tap
 CLF SAID: L ACTUALLY: L
FOR: The New Republics demise: The magazines heterodox liberalism is what made it unique.
 CLF SAID: L ACTUALLY: L
FOR: Mongolian nomads: Ambitious program uses solar panels to connect regions 800,000 nomads to the grid.
 CLF SAID: L ACTUALLY: L
FOR: Why does Gandalf the White fight with a sword instead of casting spells?
 CLF SAID: L ACTUALLY: L
FOR: Family Life by Akhil Sharma: Slate Whiting Second Novel List title.
 CLF SAID: L ACTUALLY: L
FOR: Grammy nominees 2015: Beyonc, Iggy Azalea, Sia, and Sam Smith lead the nominations.
 CLF SAID: C ACTUALLY: L
FOR: Fraternity sexual assault and criminal activities: States should use gang laws to seize their assets.
 CLF SAID: L ACTUALLY: L
FOR: New Republic turnover and breaking shit: A history of silicon valley's favorite phrase. 
 CLF SAID: L ACTUALLY: L
FOR: Still Alice review: Julianne Moore in an Alzheimers movie based on the Lisa Genova book.
 CLF SAID: L ACTUALLY: L
FOR: Peter Pan Live! on NBC, starring Allison Williams and Christopher Walken, reviewed.
 CLF SAID: L ACTUALLY: L
FOR: Amazing libraries from around the world in the book, Reflections: Libraries.
 CLF SAID: L ACTUALLY: L
FOR: Best novels, childrens books, and comics of 2014: Dan Kois picks his 15 favorites.
 CLF SAID: L ACTUALLY: L
FOR: Aquaculture: Farmed fish could be better for the environment.
 CLF SAID: C ACTUALLY: L
FOR: Republicans divided on immigration: Ted Cruz accuses Republicans of breaking campaign promises
 CLF SAID: L ACTUALLY: L
FOR: In and Out of Time in Iraq - The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: The Trouble With Cheap Oil - The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: The Real Threat to Obamacare
 CLF SAID: L ACTUALLY: L
FOR: Key elements of Rolling Stones U-Va. gang rape allegations in doubt - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: New line of upscale Starbucks stores to take coffee to luxurious heights - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Mike Green to miss sixth straight, sets mindframe on returning Tuesday - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: 7 things you didnt read today (but should have) - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Alyssa Rosenberg - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Venezuelas Maduro indicts opposition leader as economic forces conspire against him - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: New U.S. military command established for Iraq and Syria operations - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: What was fake on the Internet this week: Dog whisperer death and the Zodiac Killer - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Rolling Stone fiasco hurts rape victims and journalists - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Historic White House shovel stole the spotlight of Kennedy Center ceremony - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: In budget talks, District autonomy remains under fire - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Painting Ted Turners legacy - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Rolling Stone needs to come clean about its campus rape story - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Ubers not a $40 billion start-up. Its a mid-sized car company. - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Challenging the justice system - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The best way to respect sexual assault survivors is to get their stories right - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Hosni Mubarak celebrates his acquittal while others face repression in Egypt - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Grammy nominations: Beyonc, Sam Smith, Taylor Swift, Iggy Azalea and more - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: What would happen if the government shut down  and never reopened? - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Rollicking funeral procession a fitting coda for former D.C. mayor Marion Barry - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Children who are prostituted arent criminals. So why do we keep putting them in jail? - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: U.S. economy added 321,000 jobs in November; unemployment rate holds at 5.8% - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Rolling Stones disastrous U-Va. story: A case of real media bias - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Wizards see double in easy win over Nuggets - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Five myths about Americas police - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: EEOC Has Become The Problem, Not The Solution - Star Parker -  Page 1
 CLF SAID: C ACTUALLY: C
FOR: Jobs Jump in November but Outlook Remains Guarded - Peter Morici - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Egg Freezing and the Indentured Woman - Arina  Grossu -  Page full
 CLF SAID: L ACTUALLY: C
FOR: Obamas Climate Education and Literacy Initiative: How Do You Spell I-N-D-O-C-T-R-I-N-A-T-I-O-N? - Calvin Beisner -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Tax Hikes 'For The Children' Don't Work - Casey Given -  Page full
 CLF SAID: C ACTUALLY: C
FOR: What the Numbers Say on Police Use of Force - Steven Malanga -  Page full
 CLF SAID: L ACTUALLY: C
FOR: Why Gasoline Prices Are Down -- And How to Keep It That Way - Ed Feulner -  Page full
 CLF SAID: L ACTUALLY: C
FOR: Obama's War On Cops - John Nantz -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Mission Impossible: Making a Smart Choice in the ObamaCare Exchange - John C. Goodman -  Page full
 CLF SAID: L ACTUALLY: C
FOR: What Schumer Wants to Embrace - Jonah Goldberg -  Page full
 CLF SAID: C ACTUALLY: C
FOR: The problem with The Paris Wife, Loving Frank, and historical novels about famous mens wives.
 CLF SAID: L ACTUALLY: L
FOR: Yesterdays News - The New Yorker
 CLF SAID: C ACTUALLY: L
FOR: New technologies encourage women, but not poor people, to participate in politics - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Protesters of chokehold death rally for 3rd day - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: In Germany, a Christmas market of a different sort - CSMonitor.com
 CLF SAID: L ACTUALLY: C
FOR: In wake of Eric Garner case, should grand jury system be reformed? - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Gap sales down 4 percent after Dress Normal campaign failure.
 CLF SAID: L ACTUALLY: L
FOR: Dawn sees Ceres: Spacecraft's first picture of asteroid target.
 CLF SAID: L ACTUALLY: L
FOR: Hagel: U.S. hostage murdered in Yemen - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: D.C. area forecast: A soggy Saturday, then sparkling but breezy on Sunday - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Libel law and the Rolling Stone / UVA alleged gang rape story - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Thanks Michelle Obama: GOP Pushes For School Lunch Exemptions - Kevin Glass 
 CLF SAID: L ACTUALLY: C
FOR: Photos of the weekend - The Christian Science Monitor - CSMonitor.com
 CLF SAID: L ACTUALLY: C
FOR: Will Japan run out of rice? - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Obama justifies failed rescue of American Luke Somers in Yemen - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Rolling Stone UVA rape story continues to unravel. Jackie's friend "Andy" speaks out. 
 CLF SAID: L ACTUALLY: L
FOR: Cisco Sues Arista, a Rival Run by Former Cisco Employees, for copyright infringement. 
 CLF SAID: L ACTUALLY: L
FOR: Capitals at Devils: Game 26 discussion thread - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Eric Garners family thanks protesters as nationwide demonstrations continue - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Powerful typhoon slams into eastern Philippines - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Why the world missed the oil price crash - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: U-Va. remains resolved to address sexual violence as Rolling Stone account unravels - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Best state in America: Texas, where both crime and incarceration rates are falling - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Predicting epileptic seizures with 82 percent accuracy - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Mommy, why are police officers so bad? - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Santa, is that you? But wheres your white beard? - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Failure porn: Theres too much celebration of failure and too little fear - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Todays CIA critics once urged the agency to do anything to fight al-Qaeda - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Democratic Party Disappears in South | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: Empathize With Our Enemies?" - D.W. Wilber -  Page 1
 CLF SAID: L ACTUALLY: C
FOR: AirBnB.Com, Uber.Com: Will State And Local Governments Shutdown The New Generation Of Small Business Owners? - Austin Hill -  Page full
 CLF SAID: L ACTUALLY: C
FOR: The Liberal Policies that are Killing A Gun Company  - Michael Schaus - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Obama Giveth, Obama Gets Crushed  - John Ransom - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Second Amendment Warriors - Leah Barkoukis 
 CLF SAID: L ACTUALLY: C
FOR: Progressivism Claims Another Life - Derek Hunter -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Christmas 2014: All I Want Is Peace On Earth, Goodwill Towards Man And A Machine Gun - Doug Giles -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Russias Putin Is Erecting Economic Barriers with the West - Paul Dykewicz -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Gross Output and Gross Domestic Product Show State of Economy - Mark Skousen - Townhall Finance Conservative Columnists and Financial Commentary - Page 1
 CLF SAID: L ACTUALLY: C
FOR: The new ethics of eating - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Mary Landrieu defeat widens party, racial divide in the South - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Effort to improve farm-animal treatment expands globally - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Why impact of Eric Garner case might be much bigger than Ferguson - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Six Guantanamo detainees arrive in Uruguay.
 CLF SAID: L ACTUALLY: L
FOR: Poaching rhinos, elephants: What is it like to work an anti-poaching operation?
 CLF SAID: L ACTUALLY: L
FOR: After the Eric Garner Decision | The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: Adam Brodys Early-Bird Special
 CLF SAID: L ACTUALLY: L
FOR: Distinguished pol of the week - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: James Bond finally falls for a woman his own age - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Police officers injured, businesses vandalized as protests in Berkeley turn violent - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: How different are Russians and Americans, anyway? - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Hillary Clinton whiffs on Iran, embraces Obamas policy - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: How to reduce partisan gridlock - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: D.C. area forecast: A breezy but brighter Sunday; increasing clouds and rain chances not too far behind - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Crafting a win-win-win for Russia, Ukraine and the West - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Women in the elite forces: Cracking the camouflage ceiling. Or not. | The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: 4 Pearl Harbor survivors vow reunion wont be last - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: After apology, Rolling Stone changes its story once more - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The Localist Manifesto | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: The Sloppy Thinking Behind Credibility Arguments | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: U.S. Public Opinion and Israel/Palestine | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: Will The GOP Lose To Hillary In 2016 By Nominating A Loser Like Jeb? - Kurt  Schlichter -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Little Pressure on Fed to Raise Rates Soon - Peter Morici - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Ukraine Needs Second Bailout, Currency Reserves Drop to Critical Level - Mike Shedlock - Townhall Finance Conservative Columnists and Financial Commentary - Page 1
 CLF SAID: C ACTUALLY: C
FOR: Next Time, Try Rogaine - Katie Kieffer -  Page full
 CLF SAID: L ACTUALLY: C
FOR: EEOC Has Become the Problem, Not the Solution - Star Parker -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Enough of the Open Season on Police - D.W. Wilber -  Page full
 CLF SAID: L ACTUALLY: C
FOR: Rolling Stone Recants, but PBS Cant Let Go - Shawn Mitchell - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Do you understand the Syria conflict? Take the quiz. - Muslim Brotherhood - CSMonitor.com
 CLF SAID: L ACTUALLY: C
FOR: Mad Sounding Meds: Is This Any Way to Treat a Condition? | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: Something Sick Is Happening | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: In Defense of Religious Mediocrity | The American Spectator
 CLF SAID: C ACTUALLY: C
FOR: Thanks, Hirohito, We Needed That | The American Spectator
 CLF SAID: L ACTUALLY: C
FOR: The Glory of the Old Days | The American Spectator
 CLF SAID: C ACTUALLY: C
FOR: The Freedom Tower Was Supposed To Be the Greenest Building in America. So What Went Wrong? | Mother Jones
 CLF SAID: L ACTUALLY: L
FOR: Bush Aide: Twitter Should Change Everything to Suit My Opinion About How to Fight ISIS | Mother Jones
 CLF SAID: L ACTUALLY: L
FOR: Pierre Korkie: South African hostage killed in Yemen hours before release.
 CLF SAID: L ACTUALLY: L
FOR: Holiday shopping: Gift ideas for minimalists, homebodies, foodies, and kids.
 CLF SAID: L ACTUALLY: L
FOR: Movie intermissions are necessary in the age of long movies like Interstellar.
 CLF SAID: C ACTUALLY: L
FOR: The Cooper Hewitt Re-Opens | The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: The Astonishing Rise of Angela Merkel
 CLF SAID: C ACTUALLY: L
FOR: One Womans Drive to Revolutionize Medical Testing | The New Yorker
 CLF SAID: C ACTUALLY: L
FOR: Abby Phillip - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: How Rolling Stones campus rape story could discourage victims from speaking out - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Why Congress cant stop a federal hiring blitz tied to Obamas immigration actions - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: With 13 Hours in Islamabad, Homeland is almost great again - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: This is the best way to save for college. And hardly anyone uses it - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Technology is ruining our memory. Heres why that doesnt matter. - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Does Obama have the worst record of any president on the national debt? - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: READ IN: Best Week Ever Edition - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Kevin Durant, Oklahoma City in foreign land but not seeking any sympathy - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The Redskins are bad, from top to bottom - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: College Football Playoff field set but controversy lingers with Ohio State in, TCU snubbed - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The last remnants of the old New Republic have been swept away - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Why Eric Garner is the turning point Ferguson never was - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The happiness curve - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: The epic Rolling Stone gang-rape fallout  and how major publications get it wrong - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Conservatives say Rolling Stone U-Va. rape story exposes the liberal narrative - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: People have lost faith with companies and governments - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Nationals to make another effort re-sign Jordan Zimmermann long-term - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Heres how irrational flu vaccine deniers are - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Kennedy Center Honors kicks off with a star-studded red carpet - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Morning Plum: Hey Democrats, whats your Plan B? - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: The overlooked audiotape of the Michael Brown shooting - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: North Korea denies hacking Sony but calls the breach a righteous deed - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Witnessing Ferguson: Variation in witness statements driven more by systematic bias than uncertainty - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Learning the Lessons of the 1930s Forever | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: Enlightenment or Endarkenment? | The American Conservative
 CLF SAID: L ACTUALLY: C
FOR: North Korea: It's a "False Rumor" We Hacked Sony, Okay? - Daniel Doherty 
 CLF SAID: C ACTUALLY: C
FOR: Mid-Terms 2014 - RIP - Rich Galen -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Obamacare's Destruction of Primary Care Doctors Continues  - Katie Pavlich 
 CLF SAID: L ACTUALLY: C
FOR: Americans Hate a Loser, GOP - John Ransom - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Coming Soon: Barbara Boxer's Retirement Announcement? - Guy Benson 
 CLF SAID: C ACTUALLY: C
FOR: Will a Divided Government Work for Millennials? - Corie  Stephens -  Page full
 CLF SAID: C ACTUALLY: C
FOR: House Chooses New Cold War With Russia - Ron Paul -  Page full
 CLF SAID: C ACTUALLY: C
FOR: What China's Army-issue underwear reveals - CSMonitor.com
 CLF SAID: L ACTUALLY: C
FOR: Despite failed raid, US likely to stand by its no-ransom policy for hostages - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Symbolic 'end' to Afghanistan war overshadowed by new Obama plans - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Russian scientist spies mountain-sized asteroid heading our way - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Failed hostage raid in Yemen: why there'll be more rescues to come - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: 'Historic' Los Angeles fire engulfs city block - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: A light on Iran's dark powers - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Amid Rolling Stone fallout, will college women be reluctant to report rape? - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: Supreme Court declines dispute about BP oil spill compensation fund - CSMonitor.com
 CLF SAID: C ACTUALLY: C
FOR: The Freedom Tower Was Supposed to Be the Greenest Building in America. So What Went Wrong? | Mother Jones
 CLF SAID: L ACTUALLY: L
FOR: American Lives Will Be Saved, Not Lost, If We Release the Senate Torture Report | Mother Jones
 CLF SAID: C ACTUALLY: L
FOR: No Exit in Gaza  | The Nation
 CLF SAID: L ACTUALLY: L
FOR: Dear Prudence: Grandma never puts work into gift-buying. I do it instead.
 CLF SAID: L ACTUALLY: L
FOR: Mark Pryor's farewell is everything that's wrong with politics.
 CLF SAID: C ACTUALLY: L
FOR: Broke millennials: The decline of young adult incomes since the recession.
 CLF SAID: L ACTUALLY: L
FOR: Olympic reforms: Co-hosting could be allowed.
 CLF SAID: L ACTUALLY: L
FOR: Math versus maths: How Americans and Brits deploy the collective noun.
 CLF SAID: L ACTUALLY: L
FOR: What Grumpy Cat is worth: Did Tabatha Bundesen's pet really earn $100 million?
 CLF SAID: L ACTUALLY: L
FOR: Marsala: Pantone announces its 2015 Color of the Year. 
 CLF SAID: L ACTUALLY: L
FOR: Republican attorney general cooperation: Scott Pruitt, Devon Energy work hand in hand.
 CLF SAID: L ACTUALLY: L
FOR: Daniel Pantaleo Staten Island grand jury: Why did it refuse to indict Eric Garners killer?
 CLF SAID: L ACTUALLY: L
FOR: Discovery Channel Eaten Alive documentary was disappointing because educational television is becoming clickbait.
 CLF SAID: L ACTUALLY: L
FOR: Where the Streets Have a Name: Seven Addresses that Defined the News in 2014 - The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: Inherent Vice Review | The New Yorker
 CLF SAID: C ACTUALLY: L
FOR: Should the Democrats Give Up on the South? - The New Yorker
 CLF SAID: C ACTUALLY: L
FOR: VIDEO GAME REVIEW: This War of Mine deals with the horrors of war without the gore - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Massive Los Angeles fire destroyed apartment building, snarled traffic on two freeways - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Arguing with anti-vaxers: Maybe not a good idea - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Judge-found facts are a questionable foundation, says the Tenth Circuit - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Obama says law enforcement complaints personal for me because of who I am - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: 5 questions about the CIA detention and interrogation report you wish you didnt have to ask - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: No, really: There is a scientific explanation for the parting of the Red Sea in Exodus - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: As Andre Burakovsky navigates a valley in rookie year, Caps unsure of his World Juniors status - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Free & Easy: Winternational, Santarchy and holidays at the White House - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The insane narrative you are supposed to believe about the torture report - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Virginias licensing requirements hurt a Loudoun County charter school - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Administration tries to hide Irans alleged cheating - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Typhoon Hagupit inundates Philippines with third day of flooding rain - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Adam Goldman - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: When unrecognizable is a compliment - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: PM Update: Rain arrives overnight, persists into Tuesday; Some ice risk north and west - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Wizards squander second-half lead before beating Celtics in double overtime - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Korean Air executive goes nuts over service, delays plane - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Challenge for protesters in wake of police killings: Turning anger, grief into action - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Americans are not lovin McDonaldsand havent been for years - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Video game designer Ralph Baer invented your childhood. Here are five things you can learn from his extraordinary life. - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Woman walks her dog while dressed as the abominable snowman, makes winter less awful - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Obamas acid reflux may help others receive proper diagnosis and treatment - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: LeBron James wore an I cant breathe warmup shirt tonight. Thats a very big deal. - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Amazon threatens to move its drone research overseas - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The meaning of Mary Landrieus loss, by the numbers - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: A German political party wants immigrants to stop speaking foreign languageseven at home - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: In The Imitation Game, a portrait of what bias cost England - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: The familiar cycle of the taxi industry wars - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: Montana governor wants a little more Mountain West in the Democratic Party - The Washington Post
 CLF SAID: C ACTUALLY: L
FOR: Dont Risk War With Russia | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: A Foreign Policy of Russophobia | The American Conservative
 CLF SAID: C ACTUALLY: C
FOR: A Reply to Rush Limbaugh - Mona Charen -  Page full
 CLF SAID: C ACTUALLY: C
FOR: You Don't Have to Love Your Parents: The Case for the Ten Commandments - Dennis Prager -  Page full
 CLF SAID: C ACTUALLY: C
FOR: Standard Practice - Bill Murchison -  Page full
 CLF SAID: C ACTUALLY: C
FOR: The Tree of National Socialism  - Bill Tatro - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Don't Look for Much Emphasis on Abortion in the 2016 Campaign - Michael Barone -  Page full
 CLF SAID: C ACTUALLY: C
FOR: The War Between Disparate Impact and Equal Protection Continues - Ilya Shapiro -  Page full
 CLF SAID: C ACTUALLY: C
FOR: December 7, 2014: Hillarys Day of Infamy - Ken Blackwell -  Page full
 CLF SAID: C ACTUALLY: C
FOR: The High Cost of Fast Track - Phyllis Schlafly -  Page full
 CLF SAID: C ACTUALLY: C
FOR: 11 Law Enforcement Officers Killed - Chuck Norris -  Page full
 CLF SAID: C ACTUALLY: C
FOR: The Truth Behind The Swiss Gold Referendum  - Ralph Benko - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: L ACTUALLY: C
FOR: Liberal Politico asks: Will Jonathan Gruber Topple Obamacare?  - Nick Sorrentino - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: C ACTUALLY: C
FOR: Iran to the Rescue  - Night Watch - Townhall Finance Conservative Columnists and Financial Commentary - Page full
 CLF SAID: L ACTUALLY: C
FOR: Wild: Reese Witherspoon movie has a lot in common with 10 Hours of Walking in NYC as a Woman (VIDEO).
 CLF SAID: C ACTUALLY: L
FOR: Uber Reviews for Charon, Boatman of Hades | The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: The School of American Ballet on PBS | The New Yorker
 CLF SAID: L ACTUALLY: L
FOR: Federal workers morale is at lowest point in years - The Washington Post
 CLF SAID: L ACTUALLY: L
FOR: John Wall, Nicki Minaj and Miyah - The Washington Post
 CLF SAID: L ACTUALLY: L

 The classifier was 75.00% accurate.

 491 liberal articles, 380 conservative articles.



In [10]:
print (metrics.classification_report(Ytest, predicted))


             precision    recall  f1-score   support

          C       0.73      0.68      0.70       191
          L       0.76      0.80      0.78       245

avg / total       0.75      0.75      0.75       436


In [11]:
from wordcloud import STOPWORDS
# cite: https://github.com/amueller/word_cloud
mywcstr = ""

for row in test_rows:
    mywcstr += row[3] + ' '
for row in train_rows:
    mywcstr += row[3] + ' '
    
our_stopword_list = ('one', 'said', 'year', 'will', 'take', 'new', 'say')
    
our_stopwords = STOPWORDS.union(our_stopword_list)
    
wordcloud = WordCloud(background_color="white", max_words=100, stopwords=our_stopwords).generate(mywcstr)

plt.figure(figsize = (14,16))
plt.title("What's in the news? \n Words by Frequency", fontsize = 20)
plt.imshow(wordcloud, )
plt.axis("off")
plt.show()



In [12]:
# word cloud of SVM features
features = clf.feature_importances_
vocab = tk_train.vocabulary_
vocabInvDict = {v: k for k, v in vocab.items()}

outstr = ""
for i in range(0,len(features)):
    # lookup feature i in vocabulary
    for _ in range(0,int(4000*features[i])):
        outstr += ' ' + vocabInvDict[i] + ' '
    # multiply value of feature i * word, add to out string
        
wordcloud = WordCloud(background_color="black", max_words=100, stopwords=['said','advertisement', 'photo']).generate(outstr)

plt.figure(figsize = (14,16))
plt.title("Most Useful Features For Classification of News Articles", fontsize = 20)
plt.imshow(wordcloud, )
plt.axis("off")
plt.show()

print "In the word cloud above, the larger the word, the more important the feature."


In the word cloud above, the larger the word, the more important the feature.

In [13]:
freqs, feats = [],[]
for i in range(0,len(features)):
    # lookup feature i in vocabulary
    freqs.append(features[i])
    feats.append(str(vocabInvDict[i]))
    
pairs = zip(feats, freqs)

pairs.sort(key = lambda elem : elem[1], reverse = True)

top_10_features = pairs[:10]
_ = plt.figure(figsize=(10,10))

graph = plt.bar(range(0,len(top_10_features)), [elt[1] for elt in top_10_features], color = "green")
_ = plt.title('Feature versus Level of Importance', fontsize=15)
_ = plt.ylabel('Feature Level of Importance')
_ = plt.xlabel('Feature')
_ = plt.xticks(np.arange(0.5, 10.5, 1), [elt[0] for elt in top_10_features], rotation=30)



In [14]:
import random

# cite: PS5 distribution code
def plot_decision_surface(clf, X_train, Y_train, title, y_l, x_l, os1, os2):
    plot_step=0.1
    
    if X_train.shape[1] != 2:
        raise ValueError("X_train should have exactly 2 columnns!")
    
    x_min, x_max = X_train[:, 0].min() - plot_step, X_train[:, 0].max() + plot_step
    y_min, y_max = X_train[:, 1].min() - plot_step, X_train[:, 1].max() + plot_step
    xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                         np.arange(y_min, y_max, plot_step))

    clf.fit(X_train,Y_train)
    if hasattr(clf, 'predict_proba'):
        Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:,1]
    else:
        Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])    
    Z = Z.reshape(xx.shape)
    cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Reds)
    
    def offset(f):
        return (random.random() * f - f/2)
    
    plt.scatter([x + offset(os1) for x in X_train[:,0]],[x + offset(os2) for x in X_train[:,1]],c=Y_train,cmap=plt.cm.Paired)
    #labelling functionality
    _ = plt.title(title, fontsize = 20)
    _ = plt.xlabel(x_l, fontsize = 16)
    _ = plt.ylabel(y_l, fontsize = 16)
    plt.show()

In [19]:
best_col = [row[vocab[top_10_features[0][0]]] for row in Xtrain]
second_best_col = [row[vocab[top_10_features[1][0]]] for row in Xtrain]

third_best_col = [row[vocab[top_10_features[2][0]]] for row in Xtrain]
fourth_best_col = [row[vocab[top_10_features[3][0]]] for row in Xtrain]

clf_new = GradientBoostingClassifier(n_estimators = 800, max_depth = 5)
clf_new_ = GradientBoostingClassifier(n_estimators = 800, max_depth = 5)

best_feats_Xtrain = np.matrix([best_col, second_best_col]).transpose()
good_feats_Xtrain = np.matrix([third_best_col, fourth_best_col]).transpose()

Ytrain2 = []

for elt in Ytrain:
    if elt == 'L':
        Ytrain2.append("Blue")
    elif elt == 'C':
        Ytrain2.append("Red")
        
_ = plt.figure(figsize = (10,8))

def ft(s):
    return "Occurrences of feature " + "'" + s + "'"

plot_decision_surface(clf_new, best_feats_Xtrain, Ytrain2, "Decision Surface For Top 2 Features", 
                      ft(top_10_features[0][0]), ft(top_10_features[1][0]), .1, 0)

_ = plt.figure(figsize = (10,8))

plot_decision_surface(clf_new, good_feats_Xtrain, Ytrain2, "Decision Surface For 2nd Best Feature Pair", 
                      ft(top_10_features[2][0]), ft(top_10_features[3][0]), .33, 0)


Here we've looked at the decision surfaces that result from plotting the probabilistic results generated from the first and second best pairs of features from our feature vectors, as determined by the feature_importances attribute of the Gradient Boosting Classifier we used to separate liberal from conservative articles. Red areas in the above graphs are conservative prediction regions, while lighter colored regions in the above graphs are liberal. We see some interesting triends here, ranging from the unsurprising (repeated usage of the word "foreign" is correlated with conservatism) to the more subtle, with "time" appearing more frequently in conservative articles for example. Since our vectors have integer components, a small random horizontal offset was added to point values in both graphs. These allow the viewer to interpret the quantity of articles at a particular point, as well as to get an idea of the distribution of liberal articles vs conservative articles that appear at that point.

Part 7: Web Tool Creation

On the website which corresponds to this project, we will have a textbox whereby a user can enter article text and we will classify it for them on the spot. The code to do this on-demand classification is included here. The code is commented out as this script cannot be called from within the IP[y] Notebook.


In [16]:
_ = """

from sklearn.feature_extraction import text
import sys, pickle, cPickle

article_to_classify = ""

if __name__ == "__main__":
    for line in sys.stdin:
        article_to_classify += line

try:
    fd = open('classifier', 'rb')
except:
    print "classifier failed to load"
    sys.exit()

clf = cPickle.load(fd)
fd.close()

try:
    vfd = open('vocab', 'rb')
except:
    print "vocab failed to load"
    sys.exit()

vocab = cPickle.load(vfd)
vfd.close()

tk = text.CountVectorizer(max_features=2400, stop_words='english', vocabulary = vocab)
my_row = tk.fit_transform([article_to_classify])

def csr_2_list(csr):
    ints = [csr[0,i] for i in range(0, csr.shape[1]) ]
    return ints



print clf.predict(csr_2_list(my_row))

"""

Part 8: Final Analysis

What did you learn about the data? How did you answer the questions? How can you justify your answers?

In analyzing our data, we saw a lot of really interesting results with regard to the type of language used by Conservative or Liberal publications.

In order to learn about our data, we first took a look at the most frequently used words across all publications, Conservative or Liberal. We ignored stop-words, or words that otherwise weren't meaningful to the reader. We saw words like "people", "time", "police", "government", "American", "black". These results are expected, as they define the current movement of protests in response to grand jury decisions in the recent Ferguson and Eric Gardner cases.

Having looked at the most frequently used words across all news, we created a classifier for determining the political slant of news publications, and then we analyzed the text data that classifier used as features. We created another word cloud of these features, where the features of highest importance are largest in the word cloud. In this cloud, we see words like "photos", "stocks", "time", "guilty", "voters", "foreign", "control", "obama", "income", "taxes", and "god". These are, as expected, charged and emotional in most cases, but only in a few of them (e.g. "obama") would it be immediately clear that a trend should be expected.

After creating these two word clouds, we plotted the relative frequency of the ten most important features. This plot is represented as a bar chart. The most notable feature represented on that chart is the word "Mr.". It's an oddly simple word, and yet it seems as if it's used in an effort to be respectful which is characteristic of a political leaning.

Finally, we looked at some decision surfaces for our classifier. These are explained in detail below the graphs, but the fundamental idea is that each red dot represents a Conservative article in our training set, and each blue dot a Liberal article. These are then scattered atop a color contour map which is based on the decision the classifier would make for the given feature specifications. The redder the map, the more strictly conservative the intersection of those two plotted features.