commit 6fe900b053795d7cfc2477e1133373c085095987 Author: Carlos Solís Date: Mon Aug 14 12:13:59 2017 -0600 Reimporting GIT repository diff --git a/Léame.odt b/Léame.odt new file mode 100644 index 0000000..5adeefb Binary files /dev/null and b/Léame.odt differ diff --git a/neg/resena01.txt b/neg/resena01.txt new file mode 100644 index 0000000..b3e238c --- /dev/null +++ b/neg/resena01.txt @@ -0,0 +1 @@ +La película sufre por el pobre desarrollo de la trama, en particular por su excesivo afán de desasociarse de la serie en que se basa. El resultado es un filme que traiciona a los fanáticos de la saga original, y deja a quienes no conocían la misma con un mal regusto. diff --git a/neg/resena02.txt b/neg/resena02.txt new file mode 100644 index 0000000..aa02608 --- /dev/null +++ b/neg/resena02.txt @@ -0,0 +1 @@ +Aunque la película tiene buenos efectos especiales, la forma en que trataron la trama original y las ridículas actuaciones hace que el filme no pase a más. \ No newline at end of file diff --git a/neg/resena03.txt b/neg/resena03.txt new file mode 100644 index 0000000..70e1d98 --- /dev/null +++ b/neg/resena03.txt @@ -0,0 +1 @@ +A pesar de las buenas intenciones y un protagonista mundialmente amado, la ridícula trama y las pobres actuaciones no salvan a esta película. \ No newline at end of file diff --git a/neg/resena04.txt b/neg/resena04.txt new file mode 100644 index 0000000..06efe20 --- /dev/null +++ b/neg/resena04.txt @@ -0,0 +1 @@ +La trama es poco creíble, y el guión inconsistente como resultado. La dependencia de los efectos especiales hace a la película todavía más artificial. \ No newline at end of file diff --git a/neg/resena05.txt b/neg/resena05.txt new file mode 100644 index 0000000..e956bd9 --- /dev/null +++ b/neg/resena05.txt @@ -0,0 +1 @@ +Esta película no pudo haber salido en un peor momento: poco antes de su salida, los dirigentes cuya historia es celebrada en este filme fueron arrestados. Como resultado, esta resulta ser una película hipócrita, y la pobre taquilla parece estar de acuerdo con esta opinión. \ No newline at end of file diff --git a/neg/resena06.txt b/neg/resena06.txt new file mode 100644 index 0000000..5f308a9 --- /dev/null +++ b/neg/resena06.txt @@ -0,0 +1 @@ +Esta es una película que no se toma en serio, y está muy al tanto de su baja calidad y su escasa originalidad. Y siendo una sátira de una vasta cantidad de películas de acción, tiene que serlo. \ No newline at end of file diff --git a/neg/resena07.txt b/neg/resena07.txt new file mode 100644 index 0000000..1c01583 --- /dev/null +++ b/neg/resena07.txt @@ -0,0 +1 @@ +La secuela de una película con una premisa risible. Si la encarnación del caos y las bromas de mal gusto era un mal protagonista para la película original, en la secuela su hijo bebé hereda sus poderes, con resultados incluso más desastrosos. \ No newline at end of file diff --git a/neg/resena08.txt b/neg/resena08.txt new file mode 100644 index 0000000..0e46e6f --- /dev/null +++ b/neg/resena08.txt @@ -0,0 +1 @@ +Una película de clase B que por su abismalmente baja calidad se volvió un clásico de culto. \ No newline at end of file diff --git a/neg/resena09.txt b/neg/resena09.txt new file mode 100644 index 0000000..7ac6542 --- /dev/null +++ b/neg/resena09.txt @@ -0,0 +1 @@ +Una de esas gemas de culto del cine mexicano de luchadores. La trama es una excusa, la producción es pobre, los actores nada profesionales, la acción evidentemente falsa, pero hay quienes aman esta película precisamente por su sinceridad. \ No newline at end of file diff --git a/neg/resena10.txt b/neg/resena10.txt new file mode 100644 index 0000000..822d5e6 --- /dev/null +++ b/neg/resena10.txt @@ -0,0 +1 @@ +Otro clásico de culto, repleto de violencia gratuita, mala producción y actores nada profesionales. \ No newline at end of file diff --git a/neg/resena11.txt b/neg/resena11.txt new file mode 100644 index 0000000..1ab93ca --- /dev/null +++ b/neg/resena11.txt @@ -0,0 +1 @@ +La secuela a una película poco creíble, ahora con tintes de conspiración agregados sin razón aparente. \ No newline at end of file diff --git a/neg/resena12.txt b/neg/resena12.txt new file mode 100644 index 0000000..9d9a80e --- /dev/null +++ b/neg/resena12.txt @@ -0,0 +1 @@ +La biografía liberalmente embellecida de Mariah Carey, mal recibida por la crítica por su guión autocelebratorio. \ No newline at end of file diff --git a/neg/resena13.txt b/neg/resena13.txt new file mode 100644 index 0000000..2dd0041 --- /dev/null +++ b/neg/resena13.txt @@ -0,0 +1 @@ +Una horrible película 3D, con una trama compuesta al parecer para promocionar a la mayor cantidad de marcas comerciales posibles, convirtiéndolas en personajes antropomórficos que viven en una dimensión paralela en un supermercado. Los actores de alto presupuesto no logran salvar a la película de su terrible guión. \ No newline at end of file diff --git a/neg/resena14.txt b/neg/resena14.txt new file mode 100644 index 0000000..b4bce0a --- /dev/null +++ b/neg/resena14.txt @@ -0,0 +1 @@ +La película no triunfó debido a su tremendo parecido con otra película de Alfred Hitchcock, y al hecho de que no se compara ni cerca con la misma en la trama, a pesar de sus efectos especiales superiores. \ No newline at end of file diff --git a/neg/resena15.txt b/neg/resena15.txt new file mode 100644 index 0000000..4092977 --- /dev/null +++ b/neg/resena15.txt @@ -0,0 +1 @@ +Una película con pésima trama, cuyo éxito recayó totalmente en su protagonista, y fracasó estrepitosamente en ese respecto. \ No newline at end of file diff --git a/neg/resena16.txt b/neg/resena16.txt new file mode 100644 index 0000000..9acee9d --- /dev/null +++ b/neg/resena16.txt @@ -0,0 +1 @@ +Otra de tantas parodias de películas populares, esta vez basada en una saga para adolescentes popularmente odiada. El resultado puede ser peor o mejor que el original, dependiendo de a quién se le pregunte. \ No newline at end of file diff --git a/neg/resena17.txt b/neg/resena17.txt new file mode 100644 index 0000000..7059f56 --- /dev/null +++ b/neg/resena17.txt @@ -0,0 +1 @@ +Esta película trató de crear un deporte ficticio lo más violento y mediático posible, y nadie le compró la idea. \ No newline at end of file diff --git a/neg/resena18.txt b/neg/resena18.txt new file mode 100644 index 0000000..47d65d7 --- /dev/null +++ b/neg/resena18.txt @@ -0,0 +1 @@ +Una película intencionalmente ofensiva, acerca de una mujer cuyo excesivo sobrepeso es tomado como base para la comedia negra. \ No newline at end of file diff --git a/neg/resena19.txt b/neg/resena19.txt new file mode 100644 index 0000000..e0e9bed --- /dev/null +++ b/neg/resena19.txt @@ -0,0 +1 @@ +Otra película con una trama ridícula, en que para luchar contra un tiburón gigante destructor de ciudades, el gobierno construye una copia mecánica con igual o peor potencial de destrucción masiva. \ No newline at end of file diff --git a/neg/resena20.txt b/neg/resena20.txt new file mode 100644 index 0000000..5f8b182 --- /dev/null +++ b/neg/resena20.txt @@ -0,0 +1 @@ +Una película forzada, basada en una popular colección de juguetes intencionalmente malolientes, y que resulta ser tan desagradable como su fuente original. \ No newline at end of file diff --git a/pos/resena01.txt b/pos/resena01.txt new file mode 100644 index 0000000..ec70926 --- /dev/null +++ b/pos/resena01.txt @@ -0,0 +1 @@ +La película trata sobre la vida de John Nash, un matemático que a pesar de sus problemas mentales logró desarrollar importantes logros en el área de la economía, por las cuales obtuvo el premio Nobel. El guión logra capturar las vicisitudes de Nash, sin ridiculizarlo. diff --git a/pos/resena02.txt b/pos/resena02.txt new file mode 100644 index 0000000..aaba060 --- /dev/null +++ b/pos/resena02.txt @@ -0,0 +1 @@ +Una buena película, con un actor flexible en el papel de un robot que se acerca poco a poco a la condición de la humanidad. La trama hace cuestionarse el concepto de ser humano, del amor y de la fidelidad. \ No newline at end of file diff --git a/pos/resena03.txt b/pos/resena03.txt new file mode 100644 index 0000000..a8ff73e --- /dev/null +++ b/pos/resena03.txt @@ -0,0 +1 @@ +Una saga de películas que ilustra con gran detalle la vida de una familia de miembros de la mafia, detallando la forma en que manejan sus negocios ilícitos y cómo los combinan con sus relaciones de familia. \ No newline at end of file diff --git a/pos/resena04.txt b/pos/resena04.txt new file mode 100644 index 0000000..fecfb61 --- /dev/null +++ b/pos/resena04.txt @@ -0,0 +1 @@ +Una película que muestra sin tapujos, pero con tacto, el desastre y las consecuencias del holocausto. \ No newline at end of file diff --git a/pos/resena05.txt b/pos/resena05.txt new file mode 100644 index 0000000..216a335 --- /dev/null +++ b/pos/resena05.txt @@ -0,0 +1 @@ +El clásico por excelencia del cine de vaqueros, con grandes dosis de acción, intriga, y un trío de personajes principales que deben colaborar entre sí mientras desconfían de las intenciones de cada uno. \ No newline at end of file diff --git a/pos/resena06.txt b/pos/resena06.txt new file mode 100644 index 0000000..292c2e8 --- /dev/null +++ b/pos/resena06.txt @@ -0,0 +1 @@ +La épica saga de ciencia-ficción espacial, con una gran cantidad de personajes memorables, acción, intriga, y giros de trama inesperados. \ No newline at end of file diff --git a/pos/resena07.txt b/pos/resena07.txt new file mode 100644 index 0000000..a1cc2cc --- /dev/null +++ b/pos/resena07.txt @@ -0,0 +1 @@ +A pesar de su longitud, esta serie de películas ilustra en forma muy fiel los libros en que se basa. Una larga aventura de fantasía, donde una lucha entre el bien y el mal en un mundo con dragones, magos y elfos recae en las manos de un humilde bando de enanos. \ No newline at end of file diff --git a/pos/resena08.txt b/pos/resena08.txt new file mode 100644 index 0000000..54040e9 --- /dev/null +++ b/pos/resena08.txt @@ -0,0 +1 @@ +Pocas películas manejan con tacto a los personajes con problemas mentales. Esta película no solamente logra tener uno como personaje principal y hacerlo un personaje empatizable sin ser forzado, sino que también lo meten en varias situaciones interesantes, algunas hermosas, muchas dolorosas, pero en las cuales siempre sale a relucir su inocencia. \ No newline at end of file diff --git a/pos/resena09.txt b/pos/resena09.txt new file mode 100644 index 0000000..65bd904 --- /dev/null +++ b/pos/resena09.txt @@ -0,0 +1 @@ +La película más notoria de la época en que Hollywood estaba obsesionado con la realidad virtual. La primera de la serie fue aclamada por la crítica, tanto por su concepto como por sus efectos especiales, pero sus secuelas fueron recibidas con mucho menos entusiasmo. \ No newline at end of file diff --git a/pos/resena10.txt b/pos/resena10.txt new file mode 100644 index 0000000..6654c6a --- /dev/null +++ b/pos/resena10.txt @@ -0,0 +1 @@ +La famosa historia de siete guerreros que salvan a una villa de los bandidos que la mantienen en la pobreza, fue eventualmente adaptada de una película de samuráis a una película de vaqueros. \ No newline at end of file diff --git a/pos/resena11.txt b/pos/resena11.txt new file mode 100644 index 0000000..3325f59 --- /dev/null +++ b/pos/resena11.txt @@ -0,0 +1 @@ +Este filme fue particularmente innovador debido a su villano principal, casi un personaje principal, refinado pero despiadado, capaz de despellejar a una persona y luego devorarla con vino fino y música clásica. La relación de amor-odio que desarrollaba en los espectadores fue imitada pero nunca igualada por varios otros filmes. \ No newline at end of file diff --git a/pos/resena12.txt b/pos/resena12.txt new file mode 100644 index 0000000..23bb430 --- /dev/null +++ b/pos/resena12.txt @@ -0,0 +1 @@ +Esta película destaca por su realismo y sinceridad. En ella se expone la violencia de Río de Janeiro desde la perspectiva de sus habitantes, al punto en que sus actores principales son nativos de dicha ciudad sin experiencia previa en actuación. \ No newline at end of file diff --git a/pos/resena13.txt b/pos/resena13.txt new file mode 100644 index 0000000..a2b4be1 --- /dev/null +++ b/pos/resena13.txt @@ -0,0 +1 @@ +Muchas películas han expuesto los eventos del holocausto, pocas han tratado de visualizarla desde los ojos de los niños. La historia de un niño y sus padres judíos, que tratan en la medida de lo posible de evitar que perciba los horrores a su alrededor. \ No newline at end of file diff --git a/pos/resena14.txt b/pos/resena14.txt new file mode 100644 index 0000000..1dda617 --- /dev/null +++ b/pos/resena14.txt @@ -0,0 +1 @@ +Esta película de la segunda guerra mundial ha sido aclamada por la crítica por el extremo realismo de sus escenas. \ No newline at end of file diff --git a/pos/resena15.txt b/pos/resena15.txt new file mode 100644 index 0000000..3e98ea7 --- /dev/null +++ b/pos/resena15.txt @@ -0,0 +1 @@ +Esta saga de películas tiene uno de los protagonistas más icónicos e inesperados de su época, un arqueólogo aventurero que viaja por el mundo buscando tesoros y arriesgándose ante el peligro. \ No newline at end of file diff --git a/pos/resena16.txt b/pos/resena16.txt new file mode 100644 index 0000000..d809f28 --- /dev/null +++ b/pos/resena16.txt @@ -0,0 +1 @@ +Nadie esperaba que el cómico Charles Chaplin pudiera hacer una crítica del sistema nazi, pero lo hizo, y nada menos que en su primera película hablada. Como amo de la comedia, por supuesto, la película está basada plenamente en la sátira, y el discurso final que realiza su personaje, a quien habían confundido con el líder de cierto país ficticio que es clara parodia de Alemania, es uno de los más memorables de la historia del cine. \ No newline at end of file diff --git a/pos/resena17.txt b/pos/resena17.txt new file mode 100644 index 0000000..db3543e --- /dev/null +++ b/pos/resena17.txt @@ -0,0 +1 @@ +Es sorprendente que una película de Disney haya logrado dar un mensaje tan contundente respecto a la cultura del consumismo, pero lo logró. El personaje principal, un robot compactador que se comunica principalmente a través de ruidos, es bastante reminiscente del cine mudo. \ No newline at end of file diff --git a/pos/resena18.txt b/pos/resena18.txt new file mode 100644 index 0000000..2c562a9 --- /dev/null +++ b/pos/resena18.txt @@ -0,0 +1 @@ +Una película que hace cuestionarnos el significado de ser humano, con robots humanoides que son perseguidos por ser demasiado humanos. \ No newline at end of file diff --git a/pos/resena19.txt b/pos/resena19.txt new file mode 100644 index 0000000..db6d66e --- /dev/null +++ b/pos/resena19.txt @@ -0,0 +1 @@ +Cuando la gente habla de giros inesperados en las películas, este es uno de los principales ejemplos. Un psicólogo se dedica a tratar a un niño que proclama ver a los muertos, solamente para enterarse de que él mismo había fallecido desde el principio de la película. \ No newline at end of file diff --git a/pos/resena20.txt b/pos/resena20.txt new file mode 100644 index 0000000..ec5fdf6 --- /dev/null +++ b/pos/resena20.txt @@ -0,0 +1 @@ +La primera película en 3D que caló en la cultura popular. Una gran apuesta técnica para su tiempo, el filme trata sobre la vida secreta de los juguetes cuando los humanos no los están viendo. \ No newline at end of file diff --git a/sentiment.py b/sentiment.py new file mode 100644 index 0000000..fb2c30a --- /dev/null +++ b/sentiment.py @@ -0,0 +1,88 @@ +''' +Dependencies: Python 3, NLTK, Flask. The last two can be installed from Python's PIP. + +Bibliography: +[1] Perkins, Jacob. Text Classification for Sentiment Analysis – Naive Bayes Classifier, 2010. Retrieved June 30, 2015 from http://streamhacker.com/2010/05/10/text-classification-sentiment-analysis-naive-bayes-classifier/ . +[2] Perkins, Jacob. Python 3 Text Processing with NLTK 3 Cookbook, 2nd edition. Packt Publishing, Birmingham, UK, 2014. +[3] NLTK Project nltk.tokenize package, 2015 Retrieved June 30, 2015 from http://www.nltk.org/api/nltk.tokenize.html . +''' + +# Assorted imports required below. +from nltk.corpus.reader import CategorizedPlaintextCorpusReader as corpusreader +from nltk.classify import util, NaiveBayesClassifier +from nltk.tokenize import RegexpTokenizer as tokenizer +from math import floor +from flask import Flask, request, url_for, render_template + +# def sentimentprepare(): +# The "definition" below runs once when the program starts, and defines the corpus and the classifier. +# trainingpercentage = 80 # % - Set at will here. +# Files are in the format ./pos/file.txt or ./neg/file.txt +# The categorized corpus reader imports the files and assigns them to categories, depending on their original folder. +sentimentcorpus = corpusreader('.', r'(pos|neg)/.*\.txt', cat_pattern=r'(pos|neg)') +# The list of files corresponding to each category is saved in the variables below. +posids = sentimentcorpus.fileids('pos') +negids = sentimentcorpus.fileids('neg') +# Features are based in a bag-of-words model, the contents of all files of each category are imported into a dictionary each. All items are lower-cased for normalization. +posfeatures = [ ( dict( [(word.lower(), True) for word in (sentimentcorpus.words( fileids=[i] )) ] ), 'pos' ) for i in posids] +negfeatures = [ ( dict( [(word.lower(), True) for word in (sentimentcorpus.words( fileids=[i] )) ] ), 'neg' ) for i in negids] +# This is what the training percentage is for: the first N% of elements are taken for training the classifier, the last 100-N% are taken for testing the accuracy. +# trainingfeatures = negfeatures[:floor( len(negfeatures)*trainingpercentage/100 )] + posfeatures[:floor( len(posfeatures)*trainingpercentage/100 )] +trainingfeatures = negfeatures + posfeatures +# testingfeatures = negfeatures[ floor( len(negfeatures)*trainingpercentage/100):] + posfeatures[ floor( len(posfeatures)*trainingpercentage/100):] +# Take the classifier, and train it with the training subset. +classifier = NaiveBayesClassifier.train(trainingfeatures) +# Take the classifier, and verify it against the testing subset. +# accuracy = util.accuracy(classifier, testingfeatures) + +def sentimentverify(input): + # The code below allows to convert a plain-text review into the format used by the NLTK corpus reader. + tokenizer('\w+|\$[\d\.]+|\S+').tokenize(input.lower()) + # Create a bag-of-words dictionary for the particular review. + wordict = dict( [(word, True) for word in input ] ) + # This does the heavy lifting of checking if the review is positive or negative. + classification = classifier.classify(wordict) + # Return the probability of the review of being positive or negative. + posprob = classifier.prob_classify(wordict).prob('pos') + negprob = classifier.prob_classify(wordict).prob('neg') + # Return the formatted scores through the webapp. + reviewtext = None + reviewscore = None + # reviewaccuracy = ( "{0:.2f}%".format(accuracy*100) ) + if classification == 'pos': + reviewtext = "positiva" + reviewscore = ( "{0:.2f}%".format(posprob*100) ) + else: + reviewtext = "negativa" + reviewscore = ( "{0:.2f}%".format(negprob*100) ) + # return reviewtext, reviewscore, reviewaccuracy + return reviewtext, reviewscore + +# Kickstart the Flask webapp. +app = Flask(__name__) + +# The home page will be index.html, so references to root will be redirected there. +@app.route('/', methods=['POST', 'GET']) +@app.route('/index.html', methods=['POST', 'GET']) +def index(): + # This will add support for a static stylesheet. + url_for('static', filename='style.css') + # Several required definitions. + error = None + reviewtext = None + reviewscore = None + # reviewaccuracy = None + # If the user sent data through the form, pass it through the sentiment analysis engine and return the score. + if request.method == 'POST': + if request.form['text']: + # reviewtext, reviewscore, reviewaccuracy = sentimentverify(request.form['text']) + reviewtext, reviewscore = sentimentverify(request.form['text']) + else: + error = 'Se requiere una reseña.' + # Render the returned data, replacing the review text in the specified places. + # return render_template('/index.html', reviewtext=reviewtext, reviewscore=reviewscore, reviewaccuracy=reviewaccuracy, error=error) + return render_template('/index.html', reviewtext=reviewtext, reviewscore=reviewscore, error=error) + +# Run the webapp in localhost (typically http://localhost:5050 ) +if __name__ == '__main__': + app.run(host='0.0.0.0', debug=True) diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..dd7352c --- /dev/null +++ b/static/style.css @@ -0,0 +1,22 @@ +body { + background-color: #DDDDDD; +} +header, footer { + background-color: #AAAAAA; + color: #DDDDDD; + text-shadow: 2px 2px #BBBBBB; + border-top: 1px solid #BBBBBB; + border-bottom: 1px solid #BBBBBB; +} +header { + margin-bottom: 30px; +} +footer { + margin-top: 30px; +} +.reviewtext, .reviewscore, .reviewaccuracy { + font-weight: bold; +} +textarea { + margin-bottom: 5px; +} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..f2caed5 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,45 @@ + + + + Sentiment Analysis + + + + +
+
+

Sentiment Analysis

+
+
+
+
+

Inserte su consulta abajo:

+
+
+ + + +
+
+
+
+
+
+ {% if error %} +

Error:

+

{{ error }}

+ {% endif %} + {% if reviewtext %} +

Resultados:

+

La reseña es {{reviewtext}} con una probabilidad de {{reviewscore}}

+ + {% endif %} +
+
+ + +