From 76884f90a08b1cc65a4ed7d826cc60c1481fb4a0 Mon Sep 17 00:00:00 2001 From: Colvchap Date: Fri, 24 Feb 2017 02:24:48 -0500 Subject: [PATCH 1/2] updating the status of the project, and saving progress with an external source --- TextMining.py | 94 +++++++++++++++++++++++++++++++++++++++++++ dictionary_pickler.py | 42 +++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 TextMining.py create mode 100644 dictionary_pickler.py diff --git a/TextMining.py b/TextMining.py new file mode 100644 index 0000000..eda6f85 --- /dev/null +++ b/TextMining.py @@ -0,0 +1,94 @@ +""" +This is a self directional project with guidance from the Software Design +teaching team. + +@author: Colvin Chapman + +NLTK package: + Bird, Steven, Edward Loper and Ewan Klein (2009), Natural Language + Processing with Python. O’Reilly Media Inc. + """ +import nltk +import requests +import doctest +import pickle + +# #nltk.download() +# +# unabridged_webster = requests.get( +# 'http://www.gutenberg.org/cache/epub/29765/pg29765.txt').text +# +# pickle.dump('Webster_Dictionary', unabridged_webster,) +# +# print(len(unabridged_webster)) +# # print(unabridged_webster[0: 3000]) + + +def word(webster_dict, start, end): + """ Takes in a string with words in it, and returns a list of all the words + in that string + + range: the area on the string that is used + + >>> word("I want to go", 1,12) + ['want', 'to', 'go'] + """ + return nltk.word_tokenize(webster_dict[start: end]) + + +def word_entries(word_list): + """Takes on a list of words and returns only the words that are all + capital letters. + + >>> word_entries(['adH', 'HAND', 'HAHA', 'UNiCoRN']) + ['HAND', 'HAHA'] + """ + good_list = [] + for word in word_list: + if len(word) > 2: + if str.upper(word) == word: + good_list.append(word) + return good_list + + +def pickle_a_list(name, filey): + """name: string that represents name of file""" + + item = open(name + '.pickle', 'wb') + pickle.dump(filey, item) + item.close() + return + + +def pickle_test(): + """making sure the functions work before wasting time processig an entire + dictionary + + It works!""" + + pickle_a_list('test_list', ['GAAA', 'BE', 'bsvavv']) + + test_pickle = open('test_list.pickle', 'rb') + + reloaded_test_pickle = pickle.load(test_pickle) + return (reloaded_test_pickle) + + +def english_language(): + websterfile = open('Webster.txt') + webster = websterfile.read() + web_words = word(webster, 0, len(webster)) + web_word_list = word_entries(web_words) + pickle_a_list('english_words', web_word_list) + + +def open_english(): + english_file = open('english_words.pickle', 'rb') + reloaded_english_words = pickle.load(english_file) + return reloaded_english_words + + +reloaded_english_words = open_english() +print(len(reloaded_english_words)) + +# doctest.run_docstring_examples(word, globals(), verbose=True) diff --git a/dictionary_pickler.py b/dictionary_pickler.py new file mode 100644 index 0000000..bb7fa2e --- /dev/null +++ b/dictionary_pickler.py @@ -0,0 +1,42 @@ +""" +This is a self directional project with guidance from the Software Design +teaching team. + +@author: Colvin Chapman +""" + +import requests +import pickle + +unabridged_webster = requests.get( + 'http://www.gutenberg.org/cache/epub/29765/pg29765.txt').text + +'''I attempted to do some pickling, but in the interest of time, left this as + unfinished business: + +pickle.dump('Webster_Dictionary', unabridged_webster,) + ''' + + +def test_writing(): + """Hey, it made a file! + """ + test = open('test.txt', 'w') + test.write('This should appear in a text file somewhere!') + test.close() + return + + +def write_dictionary(): + cooldict = open('Webster.txt', 'w') + cooldict.write(unabridged_webster) + cooldict.close() + + +write_dictionary() + +print(len(unabridged_webster)) +# print(unabridged_webster[0: 3000]) + +"the length of webster is 28,930,471 characters" +"the english language has about 129,000 words" From 2a74a029a2d18b286888bffe749ad1daeb787708 Mon Sep 17 00:00:00 2001 From: Colvchap Date: Sun, 26 Feb 2017 16:42:56 -0500 Subject: [PATCH 2/2] Finished Text Mining Project --- TextMining.py | 175 ++++++++++++++++++++++++++++++++++++--- TextMiningReflection.pdf | Bin 0 -> 39852 bytes txtSaver.py | 26 ++++++ 3 files changed, 191 insertions(+), 10 deletions(-) create mode 100644 TextMiningReflection.pdf create mode 100644 txtSaver.py diff --git a/TextMining.py b/TextMining.py index eda6f85..ac50701 100644 --- a/TextMining.py +++ b/TextMining.py @@ -2,6 +2,12 @@ This is a self directional project with guidance from the Software Design teaching team. +My project is focuesd around letter frequency in all words of the english +language compared to that of authors. + +In addition, the same functions can be used to compare word choice (because of +letter frequencies) between two authors. + @author: Colvin Chapman NLTK package: @@ -9,9 +15,10 @@ Processing with Python. O’Reilly Media Inc. """ import nltk -import requests import doctest import pickle +import string +import math # #nltk.download() # @@ -36,6 +43,29 @@ def word(webster_dict, start, end): return nltk.word_tokenize(webster_dict[start: end]) +def trim_string(st): + """turns string into more managable format. + >>> trim_string('SGHsdg.14!\n') + 'sghsdg' + """ + st = st.upper() + exclude = set(string.punctuation+string.digits+'\n'+'’ ‘ÉÈÀ“ ”') + st = ''.join(ch for ch in st if ch not in exclude) + return st + + +def trim_string_webster(st): + """turns string into more managable format. + >>> trim_string('SG Hsdg.14!\n') + 'SGH' + """ + + exclude = set(string.punctuation + string.digits + '\n' + + string.ascii_lowercase) + st = ''.join(ch for ch in st if ch not in exclude) + return st + + def word_entries(word_list): """Takes on a list of words and returns only the words that are all capital letters. @@ -76,19 +106,144 @@ def pickle_test(): def english_language(): websterfile = open('Webster.txt') - webster = websterfile.read() + webster = trim_string_webster(websterfile.read()) web_words = word(webster, 0, len(webster)) web_word_list = word_entries(web_words) - pickle_a_list('english_words', web_word_list) + pickle_a_list('english_words_only', web_word_list) -def open_english(): - english_file = open('english_words.pickle', 'rb') - reloaded_english_words = pickle.load(english_file) - return reloaded_english_words +def any_text(name_of_file): + """Opens the text file, + runs histogram + returns dictionary of histogram""" + of_file = open(name_of_file) + s = trim_string(of_file.read()) + d = dict() + for c in s: + d[c] = d.get(c, 0) + 1 + return d -reloaded_english_words = open_english() -print(len(reloaded_english_words)) +def word_choice(name_of_file): + """Compiles letters in a string in order of most to least common letters + used. + """ + hist = any_text(name_of_file) + couples = [] + end_string = '' + for item in hist: + couples.append((hist[item], item)) + couples.sort(key=lambda tup: tup[0]) # sorts in place + coupless = couples[::-1] + for pair in coupless: + end_string += pair[1] + return end_string + + +def levenshtein(s1, s2): + """find out how similar + the match is to other word_choice strings + + (taken from a reading journal) + """ + if len(s1) < len(s2): + return levenshtein(s2, s1) + + # len(s1) >= len(s2) + if len(s2) == 0: + return len(s1) + + previous_row = range(len(s2) + 1) + for i, c1 in enumerate(s1): + current_row = [i + 1] + for j, c2 in enumerate(s2): + insertions = previous_row[j + 1] + 1 + deletions = current_row[j] + 1 + substitutions = previous_row[j] + (c1 != c2) + current_row.append(min(insertions, deletions, substitutions)) + previous_row = current_row + + return previous_row[-1] + + +def histogram(wordstring): + d = dict() + for char in wordstring: + d[char] = d.get(char, 0) + 1 + return d + + +def pickle_tester(file_name): + """ Primariy for the dictionary which is stored as a list of words. + returns a string in order of the most to least common characters. + """ + english_file = open(file_name, 'rb') + reloaded_english_words = pickle.load(english_file) + + hist = histogram(''.join(reloaded_english_words)) + couples = [] + end_string = '' + for item in hist: + couples.append((hist[item], item)) + couples.sort(key=lambda tup: tup[0]) # sorts in place + coupless = couples[::-1] + for pair in coupless: + end_string += pair[1] + return end_string + + +def norm(d1, d2): + """takes in two dectionaries of frequency and returns a resultant vector + representing how similar they are.""" + resultant_sum = 0 + total1 = 0 + total2 = 0 + for key in d1: + total1 += d1[key] + total2 += d2[key] + for key in d1: + resultant_sum += ((d1[key]/total1 - d2[key]/total2))**2 + return 100*resultant_sum**.5 + + +def dict_resultant(filename): + english_file = open('english_words_only.pickle', 'rb') + reloaded_english_words = pickle.load(english_file) -# doctest.run_docstring_examples(word, globals(), verbose=True) + hist = histogram(''.join(reloaded_english_words)) + return norm(any_text(filename), hist) + + +print(norm(any_text('Oliver_Twist'), any_text('David_Copperfield'))) +print(norm(any_text('Oliver_Twist'), any_text('Sherlock_Holmes'))) + +print(dict_resultant('Oliver_Twist')) + +print(word_choice('Oliver_Twist')) +print(word_choice('David_Copperfield')) +print(word_choice('Sherlock_Holmes')) +print(word_choice('bible.txt')) + +end_dict = 'EAISRTONCLPDMUHBGYFWVKJZXQ' +end_Oliver = 'ETAOINHRSDLUMWCGFYPBVKXJQZ' +end_David = 'ETAOINSHRDLMUWCYFGPBVKXJQZ' +end_Sherlock = 'ETAOINHSRDLUMWCYFGPBVKXJQZ' +end_Bible = 'ETHAONSIRDLUMFWCYGBPVKJZXQ' + + +print('Dict vs Oliver : ' + str(levenshtein(end_dict, end_Oliver))+'\n' + + str(dict_resultant('Oliver_Twist'))) +print('Oliver vs David : ' + str(levenshtein(end_Oliver, end_David))+'\n' + + str(norm(any_text('Oliver_Twist'), any_text('David_Copperfield')))) +print('David vs Dict: ' + str(levenshtein(end_David, end_dict))+'\n' + + str(dict_resultant('David_Copperfield'))) +print('Dict vs Sherlock: ' + str(levenshtein(end_dict, end_Sherlock))+'\n' + + str(dict_resultant('Sherlock_Holmes'))) +print('Oliver vs Sherlock: '+ str(levenshtein(end_Oliver, end_Sherlock)) + + '\n' + str(norm(any_text('Oliver_Twist'), any_text('Sherlock_Holmes')))) +print('David vs Sherlock: '+str(levenshtein(end_David, end_Sherlock))+'\n' + + str(norm(any_text('Sherlock_Holmes'), any_text('David_Copperfield')))) +print('Bible vs Sherlock: ' + str(levenshtein(end_Bible, end_Sherlock)) + + '\n' + str(norm(any_text('bible.txt'), any_text('Sherlock_Holmes')))) +print('Dict vs Bible: ' + str(levenshtein(end_David, end_Bible))+'\n' + + str(dict_resultant('bible.txt'))) diff --git a/TextMiningReflection.pdf b/TextMiningReflection.pdf new file mode 100644 index 0000000000000000000000000000000000000000..66123eff8628bb5ac8aa1dbe943f7684fa093569 GIT binary patch literal 39852 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 fMPcHA46%#E*~QSwfFk;TYx_?p literal 0 HcmV?d00001 diff --git a/txtSaver.py b/txtSaver.py new file mode 100644 index 0000000..b0646d0 --- /dev/null +++ b/txtSaver.py @@ -0,0 +1,26 @@ +""" +This is a self directional project with guidance from the Software Design +teaching team. + +@author: Colvin Chapman +""" + +import requests + + +def write_book(URL, name_file): + body = requests.get(URL).text + cooldict = open(name_file, 'w') + cooldict.write(body) + cooldict.close() + + +write_book("http://www.gutenberg.org/cache/epub/730/pg730.txt", "Oliver_Twist") +write_book("http://www.gutenberg.org/files/766/766-0.txt", "David_Copperfield") +write_book("http://www.gutenberg.org/cache/epub/1661/pg1661.txt", + "Sherlock_Holmes") + + +""" +the length of webster is 28,930,471 characters +the english language has about 129,000 words"""