manetta
6 years ago
commit
5420755165
32 changed files with 3759 additions and 0 deletions
@ -0,0 +1,52 @@ |
|||||
|
```\ |
||||
|
█▀▀ █▀▀█ █▀▀█ █▀▀ █▀▀ ░░ █▀▀█ █▀▀ █▀▀█ █▀▀▄ ░▀░ █▀▀▄ █▀▀▀ █▀▀ |
||||
|
█░░ █▄▄▀ █░░█ ▀▀█ ▀▀█ ▀▀ █▄▄▀ █▀▀ █▄▄█ █░░█ ▀█▀ █░░█ █░▀█ ▀▀█ |
||||
|
▀▀▀ ▀░▀▀ ▀▀▀▀ ▀▀▀ ▀▀▀ ░░ ▀░▀▀ ▀▀▀ ▀░░▀ ▀▀▀░ ▀▀▀ ▀░░▀ ▀▀▀▀ ▀▀▀ |
||||
|
``` |
||||
|
|
||||
|
# cross-reader - ADJ (adjectives) and PRE (prepositions) |
||||
|
|
||||
|
(a few notes) |
||||
|
|
||||
|
## Install |
||||
|
|
||||
|
$ pip3 install flask |
||||
|
|
||||
|
$ pip3 install nltk |
||||
|
|
||||
|
(follow nltk instructions to download a nltk pos.tagger) |
||||
|
|
||||
|
## Start |
||||
|
|
||||
|
Start the flask/python local server ... |
||||
|
|
||||
|
$ python3 start.py |
||||
|
|
||||
|
Browse to your localhost on port 5000 ... |
||||
|
|
||||
|
> 127.0.0.1:5000 |
||||
|
|
||||
|
|
||||
|
## Txt documents |
||||
|
|
||||
|
The search machine is using the index.json file to process results. |
||||
|
|
||||
|
The function 'create_index' can be called to generate this file. It uses a set of plain text files to index each word and its corresponding TFIDF value. |
||||
|
|
||||
|
|
||||
|
## Changing txt documents |
||||
|
|
||||
|
If you want to work with another set of texts, make a 'txt/' folder, add a few txt files in it, and remove the index.json file (or rename it if you want to keep it). |
||||
|
|
||||
|
To generate a new index.json file: |
||||
|
|
||||
|
Remove the index.json file |
||||
|
|
||||
|
$ rm index.json |
||||
|
|
||||
|
Stop and start the python server... |
||||
|
|
||||
|
ctrl + c |
||||
|
|
||||
|
$ python3 start.py |
||||
|
|
@ -0,0 +1,49 @@ |
|||||
|
import os, json, re |
||||
|
|
||||
|
import nltk |
||||
|
from nltk import sent_tokenize |
||||
|
from nltk.tokenize import RegexpTokenizer |
||||
|
tokenizer = RegexpTokenizer(r'\w+') # initialize tokenizer |
||||
|
|
||||
|
import pprint |
||||
|
pp = pprint.PrettyPrinter(indent=4) |
||||
|
|
||||
|
def load_text_files(): |
||||
|
files = [] |
||||
|
corpus = [] |
||||
|
sentences = {} |
||||
|
wordlists = {} |
||||
|
dir = 'txt' |
||||
|
|
||||
|
for document in sorted(os.listdir(dir)): |
||||
|
document = document.replace('.txt','') |
||||
|
lines = open('{}/{}.txt'.format(dir, document), "r").read() # list of lines in .txt file |
||||
|
lines = lines.replace(' •', '. ') # turn custom linebreaks into full-stops to let the tokenizer recognize them as end-of-lines |
||||
|
s = sent_tokenize(lines) |
||||
|
sentences[document] = s |
||||
|
files.append(document) # list of filenames |
||||
|
|
||||
|
print('*txt files loaded*') |
||||
|
return files, sentences |
||||
|
|
||||
|
def create_index(): |
||||
|
files, sentences = load_text_files() |
||||
|
index = {} |
||||
|
|
||||
|
# index = { |
||||
|
# document : { |
||||
|
# 'sentences' : [] |
||||
|
# } |
||||
|
|
||||
|
for document in files: |
||||
|
print('---------') |
||||
|
print('document:', document) |
||||
|
index[document] = {} |
||||
|
index[document]['sentences'] = sentences[document] |
||||
|
|
||||
|
with open('index.json','w+') as out: |
||||
|
out.write(json.dumps(index, indent=4, sort_keys=True)) |
||||
|
out.close() |
||||
|
print('*index created*') |
||||
|
|
||||
|
# create_index() |
@ -0,0 +1,376 @@ |
|||||
|
{ |
||||
|
"document1": { |
||||
|
"sentences": [ |
||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", |
||||
|
"Etiam laoreet scelerisque eleifend.", |
||||
|
"Duis mollis fermentum metus eget luctus.", |
||||
|
"Sed et lectus nulla.", |
||||
|
"Mauris vel dignissim lorem, a mattis nisi.", |
||||
|
"Proin fermentum rhoncus mauris, vitae sodales metus.", |
||||
|
"Vivamus dolor neque, suscipit et justo quis, malesuada lacinia mi.", |
||||
|
"Nulla sapien libero, bibendum at gravida vestibulum, dictum elementum ligula.", |
||||
|
"In sit amet finibus metus.", |
||||
|
"Ut tincidunt leo eget erat dictum euismod.", |
||||
|
"Fusce feugiat erat a nunc condimentum, at fermentum neque semper.", |
||||
|
"Ut tempor interdum dui, sit amet faucibus ante lacinia sed.", |
||||
|
"Aenean at pretium velit.", |
||||
|
"Nunc semper aliquet mattis.", |
||||
|
"Proin gravida turpis non dui sagittis iaculis.", |
||||
|
"Etiam consectetur rhoncus rutrum.", |
||||
|
"Quisque nec fermentum massa, venenatis rutrum eros.", |
||||
|
"Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", |
||||
|
"Nunc convallis nisi vel ante vehicula, vitae consectetur felis luctus.", |
||||
|
"Praesent non rutrum arcu, quis porttitor risus.", |
||||
|
"Praesent rhoncus pulvinar iaculis.", |
||||
|
"Curabitur odio augue, rutrum eget odio vel, ullamcorper facilisis arcu.", |
||||
|
"Pellentesque feugiat dolor nec turpis rhoncus semper.", |
||||
|
"Curabitur est odio, molestie eu nulla sit amet, porttitor gravida purus.", |
||||
|
"Cras nec elementum est, et condimentum urna.", |
||||
|
"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.", |
||||
|
"Cras sodales nisi risus, et tempor est pretium eu.", |
||||
|
"Suspendisse volutpat dictum libero, et sollicitudin magna pellentesque eu.", |
||||
|
"Donec finibus malesuada finibus.", |
||||
|
"Interdum et malesuada fames ac ante ipsum primis in faucibus.", |
||||
|
"Nunc lorem turpis, rutrum et nunc consectetur, interdum auctor nisl.", |
||||
|
"Maecenas et arcu urna.", |
||||
|
"Cras pretium elementum fermentum.", |
||||
|
"Aliquam erat velit, interdum non odio eget, rutrum vestibulum erat.", |
||||
|
"Sed nec nulla ac urna volutpat mollis.", |
||||
|
"Donec eget malesuada dui, eget cursus risus.", |
||||
|
"Ut rutrum magna porta, scelerisque leo sit amet, vestibulum enim.", |
||||
|
"Nam vehicula ante non cursus faucibus.", |
||||
|
"Phasellus egestas pulvinar sollicitudin.", |
||||
|
"Vivamus vitae ultricies est.", |
||||
|
"Mauris sit amet pharetra diam, eu pharetra nisi.", |
||||
|
"Sed finibus quam id risus fermentum, nec dictum arcu volutpat.", |
||||
|
"Etiam venenatis non ipsum ac viverra.", |
||||
|
"Maecenas volutpat nulla non nibh ultricies vestibulum.", |
||||
|
"Nunc ornare tincidunt gravida.", |
||||
|
"Sed ultrices finibus venenatis.", |
||||
|
"Suspendisse potenti.", |
||||
|
"Duis scelerisque ultricies ex id tristique.", |
||||
|
"In hac habitasse platea dictumst.", |
||||
|
"Nam aliquam vulputate accumsan.", |
||||
|
"Proin erat tortor, consequat sed metus id, cursus bibendum justo.", |
||||
|
"Sed hendrerit, libero aliquet porta suscipit, erat erat rhoncus libero, eu aliquam odio nisi in est.", |
||||
|
"Donec enim massa, pellentesque in urna sed, viverra sagittis justo.", |
||||
|
"In hac habitasse platea dictumst.", |
||||
|
"Aliquam erat volutpat.", |
||||
|
"Pellentesque hendrerit viverra magna, ut eleifend risus euismod eu.", |
||||
|
"Suspendisse vestibulum malesuada ipsum, scelerisque hendrerit lorem malesuada id.", |
||||
|
"Praesent euismod efficitur dolor quis convallis.", |
||||
|
"Vestibulum at leo non nisl ultrices gravida a id tellus.", |
||||
|
"Fusce et placerat ligula, vel cursus dolor.", |
||||
|
"Cras eget ante a lacus tristique rutrum.", |
||||
|
"In hac habitasse platea dictumst.", |
||||
|
"Integer commodo venenatis libero quis ultricies.", |
||||
|
"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.", |
||||
|
"Donec et eros felis.", |
||||
|
"Nullam dictum tellus tincidunt, aliquet urna id, rhoncus nisi.", |
||||
|
"Phasellus nec tellus purus.", |
||||
|
"Aliquam lobortis sapien sollicitudin porttitor ullamcorper." |
||||
|
] |
||||
|
}, |
||||
|
"document2": { |
||||
|
"sentences": [ |
||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", |
||||
|
"Ut posuere augue est, luctus sodales nibh tempus in.", |
||||
|
"Vestibulum nec massa aliquam, facilisis sapien mattis, porta nisi.", |
||||
|
"Suspendisse id fermentum elit, nec tristique eros.", |
||||
|
"Sed convallis gravida tellus sed rhoncus.", |
||||
|
"Pellentesque auctor, ipsum nec rutrum laoreet, nibh mi euismod augue, vitae cursus libero tortor vitae nisl.", |
||||
|
"Pellentesque a lectus a justo varius auctor.", |
||||
|
"Cras nisi nibh, pretium porttitor erat a, ullamcorper semper diam.", |
||||
|
"Phasellus et ex vitae nisl sagittis euismod.", |
||||
|
"Sed dapibus lacus nec magna dapibus, eu fringilla purus pellentesque.", |
||||
|
"Ut vitae nibh diam.", |
||||
|
"Quisque blandit, nunc eu laoreet finibus, turpis tellus rhoncus orci, nec mollis nisl dolor vitae eros.", |
||||
|
"Maecenas mi mi, aliquam congue massa fermentum, maximus pretium nisi.", |
||||
|
"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc ultrices enim urna.", |
||||
|
"Nullam ut enim non ipsum pellentesque pulvinar.", |
||||
|
"Nullam lacinia nisi ex, ac tincidunt orci bibendum nec.", |
||||
|
"Etiam facilisis euismod vehicula.", |
||||
|
"Pellentesque semper, erat efficitur ultricies ultrices, elit urna convallis eros, at tempor eros sapien a ex.", |
||||
|
"Cras dapibus blandit justo id porttitor.", |
||||
|
"Sed facilisis lacus finibus semper placerat.", |
||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", |
||||
|
"Vestibulum lorem turpis, dictum non elementum non, finibus quis eros.", |
||||
|
"Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", |
||||
|
"Aliquam non sem sit amet lacus iaculis tincidunt.", |
||||
|
"Vestibulum viverra ac est vitae suscipit.", |
||||
|
"Nam quis dui sed augue volutpat scelerisque sit amet nec tellus.", |
||||
|
"Donec venenatis condimentum sagittis.", |
||||
|
"Quisque molestie tempor turpis.", |
||||
|
"Donec tempus magna sit amet lacus vulputate viverra.", |
||||
|
"Sed vel quam congue eros dignissim lobortis.", |
||||
|
"Aenean facilisis ut dolor sed ultricies.", |
||||
|
"Cras auctor dolor ac dui semper, vitae maximus purus bibendum.", |
||||
|
"Suspendisse eleifend imperdiet mauris et convallis.", |
||||
|
"In nec volutpat risus, at placerat lectus.", |
||||
|
"Vivamus vehicula dolor nec lacus dignissim euismod.", |
||||
|
"Vivamus gravida felis non sollicitudin accumsan.", |
||||
|
"Quisque vitae posuere orci.", |
||||
|
"Proin dapibus faucibus arcu quis lacinia.", |
||||
|
"Nulla facilisi.", |
||||
|
"Proin ut nibh velit.", |
||||
|
"Vestibulum quis tempor odio, quis cursus erat.", |
||||
|
"Praesent ex metus, interdum ut tincidunt non, scelerisque tincidunt arcu.", |
||||
|
"Quisque ac molestie mi, et euismod erat.", |
||||
|
"Vestibulum lectus nisl, vulputate eget ex vitae, mollis feugiat eros.", |
||||
|
"Praesent ullamcorper dui eget mauris dignissim pretium.", |
||||
|
"Donec consectetur purus ac felis congue, et euismod nulla pretium.", |
||||
|
"Quisque eu erat justo.", |
||||
|
"Suspendisse imperdiet hendrerit vestibulum.", |
||||
|
"Sed vulputate, velit sit amet pharetra condimentum, enim massa blandit quam, sed lobortis ipsum nibh posuere nisi.", |
||||
|
"Proin porta nisl at augue finibus, ac tincidunt sapien lacinia.", |
||||
|
"Curabitur iaculis eu erat sed hendrerit.", |
||||
|
"Integer pharetra enim eros, ac ullamcorper nunc viverra tempor.", |
||||
|
"Morbi leo tortor, porta nec tellus sit amet, sagittis accumsan ex.", |
||||
|
"Ut rhoncus, velit id porta mattis, dolor lacus sagittis nulla, at suscipit lacus ex sit amet leo.", |
||||
|
"Aliquam sit amet lacinia urna, et facilisis purus.", |
||||
|
"Pellentesque euismod tellus molestie, pulvinar arcu id, consequat ipsum.", |
||||
|
"In pharetra faucibus libero, fermentum posuere nisl.", |
||||
|
"Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", |
||||
|
"Pellentesque at dolor in ex commodo efficitur.", |
||||
|
"Aliquam interdum in metus at scelerisque.", |
||||
|
"Phasellus rutrum justo et justo molestie dapibus.", |
||||
|
"Suspendisse ac diam blandit, porta ex ut, lobortis est.", |
||||
|
"Fusce dictum efficitur convallis.", |
||||
|
"Mauris justo velit, scelerisque nec laoreet quis, placerat et felis.", |
||||
|
"Duis eu quam risus.", |
||||
|
"Praesent mollis eros in magna sollicitudin porta.", |
||||
|
"Donec vitae odio ipsum.", |
||||
|
"Suspendisse potenti.", |
||||
|
"Nunc id libero consequat, euismod lacus sed, ornare lorem.", |
||||
|
"Praesent scelerisque eu quam a vestibulum.", |
||||
|
"Nullam sodales tincidunt leo, vel malesuada elit commodo id.", |
||||
|
"Donec eu augue maximus leo iaculis varius eu vitae quam.", |
||||
|
"Praesent maximus, felis eget congue elementum, neque turpis interdum ex, nec hendrerit odio sem a arcu.", |
||||
|
"Quisque iaculis rutrum mauris ut faucibus.", |
||||
|
"Pellentesque fermentum dolor sed eros volutpat, ullamcorper porta metus ornare.", |
||||
|
"Duis sollicitudin blandit dui, et iaculis libero mollis congue.", |
||||
|
"Morbi dapibus tortor tortor, eget eleifend lacus malesuada id.", |
||||
|
"Sed at lorem ante.", |
||||
|
"Maecenas a semper purus.", |
||||
|
"Duis eget nibh neque.", |
||||
|
"Donec consequat libero eros, id posuere odio fermentum vel.", |
||||
|
"Aliquam nec varius magna.", |
||||
|
"Phasellus nec volutpat turpis.", |
||||
|
"Phasellus elit neque, tincidunt eu vehicula sit amet, vestibulum at nisi.", |
||||
|
"Suspendisse vitae ultricies quam.", |
||||
|
"Pellentesque sagittis sollicitudin arcu sed sollicitudin.", |
||||
|
"Mauris vehicula erat risus, tempus consectetur mi scelerisque et.", |
||||
|
"Cras et tortor ut mauris vehicula porttitor eu at eros.", |
||||
|
"Vivamus porta, enim nec pretium elementum, diam nunc scelerisque risus, eget blandit libero augue ut diam.", |
||||
|
"Vivamus eget lorem eget lectus dignissim consectetur id nec mi.", |
||||
|
"Integer volutpat pulvinar dictum.", |
||||
|
"Aliquam purus nisl, blandit sed ligula ut, interdum cursus odio.", |
||||
|
"Cras congue lacinia nisi, quis eleifend massa placerat mollis.", |
||||
|
"Sed in mi eros.", |
||||
|
"Praesent semper ultricies velit in ultricies.", |
||||
|
"Mauris tristique varius turpis vel placerat.", |
||||
|
"Nam vulputate sit amet ligula nec commodo.", |
||||
|
"Interdum et malesuada fames ac ante ipsum primis in faucibus.", |
||||
|
"Sed rhoncus massa in luctus interdum.", |
||||
|
"Mauris et justo ac eros blandit mattis.", |
||||
|
"Donec ante sem, malesuada elementum ex at, tempus mollis sem.", |
||||
|
"Aenean ac venenatis tellus.", |
||||
|
"Phasellus vestibulum mi nec elit sollicitudin aliquet.", |
||||
|
"Donec sed justo erat.", |
||||
|
"Nunc scelerisque lectus vitae placerat pretium.", |
||||
|
"Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", |
||||
|
"Quisque semper interdum laoreet.", |
||||
|
"Donec facilisis, orci ut semper sodales, augue ipsum iaculis mi, eu tempor ligula libero dictum enim.", |
||||
|
"Mauris non ultricies leo, eget ullamcorper dui.", |
||||
|
"Fusce ante purus, pellentesque in tristique in, ornare ut massa.", |
||||
|
"Vestibulum tempus ipsum sed fringilla rutrum.", |
||||
|
"Praesent ultrices posuere sem eu fringilla.", |
||||
|
"Nulla efficitur magna nunc, sit amet imperdiet ante tempor non.", |
||||
|
"In vitae aliquam neque.", |
||||
|
"Nunc leo tortor, volutpat et mi ut, convallis pretium nunc.", |
||||
|
"Fusce quis tortor tincidunt, viverra arcu sed, feugiat ex.", |
||||
|
"Vestibulum sed tortor elementum, sollicitudin leo id, rutrum diam.", |
||||
|
"Aenean eget nisi sagittis, commodo leo eget, egestas libero.", |
||||
|
"Aliquam convallis risus nunc, nec blandit mi lacinia non.", |
||||
|
"Nunc venenatis tellus ac leo accumsan dignissim.", |
||||
|
"Donec molestie eleifend aliquet.", |
||||
|
"Nunc ullamcorper ligula neque, nec sagittis erat luctus in.", |
||||
|
"Integer eu erat id ante congue vehicula.", |
||||
|
"In in dictum diam, ut tincidunt urna.", |
||||
|
"Morbi nec lectus vitae lorem vehicula tristique vitae ac ipsum." |
||||
|
] |
||||
|
}, |
||||
|
"document3": { |
||||
|
"sentences": [ |
||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", |
||||
|
"Proin eu consequat dolor.", |
||||
|
"Vestibulum tempus risus vitae massa hendrerit, a fermentum quam lacinia.", |
||||
|
"Fusce laoreet ultricies ornare.", |
||||
|
"Cras ultricies quis tellus ac ullamcorper.", |
||||
|
"Pellentesque congue vehicula nunc et sodales.", |
||||
|
"In tincidunt porttitor justo quis convallis.", |
||||
|
"Vestibulum sed turpis sed tellus varius placerat.", |
||||
|
"Phasellus consectetur libero id feugiat pretium.", |
||||
|
"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.", |
||||
|
"Phasellus sed lorem et ligula tempus dapibus.", |
||||
|
"Donec eu sollicitudin justo, sed ornare nibh.", |
||||
|
"In hac habitasse platea dictumst.", |
||||
|
"Fusce dictum eget odio quis rhoncus.", |
||||
|
"Curabitur posuere arcu quis mi molestie, a mattis est viverra.", |
||||
|
"Suspendisse euismod fermentum maximus.", |
||||
|
"Quisque in diam sed leo pretium dapibus eget aliquet augue.", |
||||
|
"Aenean rhoncus sed purus auctor sagittis.", |
||||
|
"Nulla eget feugiat arcu.", |
||||
|
"Nam accumsan, leo in scelerisque facilisis, tortor lectus sagittis orci, a dictum eros diam vestibulum odio.", |
||||
|
"Suspendisse aliquet mi eget arcu dictum euismod.", |
||||
|
"Aliquam imperdiet odio iaculis mollis interdum.", |
||||
|
"Nam sed dictum augue.", |
||||
|
"Nulla sagittis arcu at libero porttitor bibendum porta ac nunc.", |
||||
|
"Nam ut urna laoreet turpis vehicula finibus rhoncus ut erat.", |
||||
|
"Etiam at justo vehicula ante feugiat porttitor non eget mauris.", |
||||
|
"Nunc tincidunt fringilla mollis.", |
||||
|
"Aliquam erat volutpat.", |
||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", |
||||
|
"Vivamus accumsan accumsan diam et pharetra.", |
||||
|
"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.", |
||||
|
"Nulla pellentesque gravida ex id porta.", |
||||
|
"Nam vitae consequat eros, facilisis venenatis erat.", |
||||
|
"Nunc quis venenatis dolor.", |
||||
|
"Maecenas commodo gravida egestas.", |
||||
|
"Vestibulum ut orci finibus, aliquam metus molestie, maximus enim.", |
||||
|
"Praesent at augue ut nulla mattis aliquet.", |
||||
|
"Integer fringilla dignissim elit non lacinia.", |
||||
|
"Pellentesque scelerisque nec felis sit amet malesuada.", |
||||
|
"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.", |
||||
|
"Donec efficitur hendrerit urna, pulvinar finibus eros efficitur in.", |
||||
|
"Phasellus finibus ipsum est, vel tempor nisi sollicitudin vitae.", |
||||
|
"Morbi vitae est et arcu vulputate semper.", |
||||
|
"Nam a finibus tortor, sit amet cursus arcu.", |
||||
|
"Aenean congue, risus eu tristique elementum, magna augue tristique diam, non imperdiet ipsum erat nec est.", |
||||
|
"Integer venenatis augue sit amet eleifend elementum.", |
||||
|
"Donec rhoncus metus eget suscipit vulputate.", |
||||
|
"Duis euismod risus ut justo gravida, nec ultrices nisl placerat.", |
||||
|
"Aliquam elementum feugiat mollis.", |
||||
|
"Vestibulum lobortis mattis tortor eget ullamcorper.", |
||||
|
"Mauris congue, urna non auctor finibus, leo enim ultrices nibh, nec dignissim dui lorem euismod nibh.", |
||||
|
"Phasellus suscipit semper posuere.", |
||||
|
"Donec luctus eros turpis, vel ultricies tortor fringilla vel.", |
||||
|
"Vestibulum venenatis pulvinar nibh vel cursus.", |
||||
|
"Curabitur congue molestie urna, at sagittis lorem imperdiet eu.", |
||||
|
"Fusce in purus et est tincidunt sollicitudin eu nec risus.", |
||||
|
"Suspendisse tempus eros ante, in feugiat nibh sodales ac.", |
||||
|
"Curabitur commodo mi at leo aliquet tempus.", |
||||
|
"Phasellus blandit varius nunc, sit amet consequat ipsum vulputate in.", |
||||
|
"Nam eget sem dictum, rhoncus turpis a, condimentum mi.", |
||||
|
"Nulla et fermentum libero, sed suscipit justo.", |
||||
|
"Nunc ac felis sem.", |
||||
|
"Maecenas a metus risus.", |
||||
|
"Morbi porta tincidunt ex at cursus.", |
||||
|
"Suspendisse tristique arcu nec lorem elementum, quis faucibus dolor sodales.", |
||||
|
"Praesent porta congue auctor.", |
||||
|
"Vivamus eu iaculis arcu, nec ultrices erat.", |
||||
|
"Cras sodales facilisis metus in laoreet.", |
||||
|
"Proin a magna ligula.", |
||||
|
"Nunc bibendum tincidunt hendrerit.", |
||||
|
"Aliquam erat volutpat.", |
||||
|
"Cras auctor facilisis tincidunt.", |
||||
|
"Maecenas eu sollicitudin massa.", |
||||
|
"Nunc consectetur leo fringilla, tristique lorem vitae, lobortis dui.", |
||||
|
"Nunc lobortis tempor blandit.", |
||||
|
"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut et consectetur libero.", |
||||
|
"Morbi dapibus metus quis lectus laoreet, id commodo nulla tempor.", |
||||
|
"Aenean nibh ante, ornare sit amet vehicula a, gravida ac quam.", |
||||
|
"Nam ornare orci ac vulputate condimentum.", |
||||
|
"Suspendisse pulvinar vestibulum mi, in dignissim lorem feugiat et.", |
||||
|
"Curabitur non nulla interdum, cursus sem vitae, viverra diam.", |
||||
|
"Ut porta orci id nunc convallis, vel lobortis erat fringilla.", |
||||
|
"In bibendum iaculis auctor.", |
||||
|
"Duis eget euismod lacus, in congue enim.", |
||||
|
"Curabitur lobortis vestibulum risus in dignissim.", |
||||
|
"Nunc id convallis quam, et porttitor lorem.", |
||||
|
"Vestibulum in posuere tortor, vel posuere mi.", |
||||
|
"Proin ultricies lacus vitae maximus commodo.", |
||||
|
"Pellentesque viverra nisl non eleifend fermentum.", |
||||
|
"Suspendisse leo leo, fermentum vitae convallis accumsan, consectetur at nibh.", |
||||
|
"Fusce eu ante elit.", |
||||
|
"Curabitur dignissim ut enim vel pellentesque.", |
||||
|
"Sed turpis purus, porta in tortor non, tempor tincidunt ipsum.", |
||||
|
"Mauris non interdum sapien.", |
||||
|
"Ut sollicitudin eget lorem ultrices vestibulum.", |
||||
|
"Integer et fermentum urna, vitae molestie magna.", |
||||
|
"In sit amet fermentum orci.", |
||||
|
"Pellentesque ultrices volutpat lorem a congue.", |
||||
|
"Phasellus non quam vel magna sodales aliquet non eu ligula.", |
||||
|
"Aenean risus purus, tincidunt id mattis sed, interdum et urna.", |
||||
|
"Nunc in sem aliquam enim hendrerit euismod.", |
||||
|
"Praesent dictum enim non felis consectetur vehicula.", |
||||
|
"Suspendisse aliquam condimentum tempus.", |
||||
|
"Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.", |
||||
|
"Donec et mauris nulla.", |
||||
|
"Quisque dignissim, elit ut convallis laoreet, felis metus luctus lectus, sed feugiat nibh purus non leo.", |
||||
|
"Cras laoreet tempor dictum.", |
||||
|
"Quisque vitae magna eget velit rutrum sodales.", |
||||
|
"Quisque vestibulum dui metus, a mollis enim cursus vel.", |
||||
|
"Nam at hendrerit est.", |
||||
|
"Nulla eleifend odio at lacus mattis, quis feugiat urna euismod.", |
||||
|
"Morbi eget nunc sed eros accumsan cursus sed eget ex.", |
||||
|
"Maecenas sagittis pulvinar diam quis cursus.", |
||||
|
"Nullam vel rhoncus metus.", |
||||
|
"Morbi at tortor feugiat, sollicitudin urna ut, sollicitudin risus.", |
||||
|
"Nullam nulla velit, pellentesque eu lectus vel, sagittis laoreet ligula.", |
||||
|
"Proin luctus ac libero luctus imperdiet.", |
||||
|
"Sed ullamcorper, est vel tincidunt tempor, eros tortor interdum odio, at blandit turpis ligula ut tortor.", |
||||
|
"Cras bibendum dignissim urna, sit amet gravida dolor commodo porta.", |
||||
|
"Suspendisse fermentum metus gravida est tincidunt, vel tempus leo condimentum.", |
||||
|
"Nam vel nulla nibh.", |
||||
|
"Pellentesque ac tristique dolor.", |
||||
|
"Aenean malesuada tortor interdum consequat dictum.", |
||||
|
"Donec tempor turpis eget lorem consequat, sed porttitor sapien scelerisque.", |
||||
|
"Curabitur vel nulla fermentum, viverra dolor ut, dictum erat.", |
||||
|
"Nunc mauris ante, varius sit amet turpis ut, bibendum tempor erat.", |
||||
|
"Maecenas gravida gravida leo sed rutrum.", |
||||
|
"Pellentesque vulputate lacinia odio, sit amet pulvinar ligula dictum id.", |
||||
|
"Proin magna ipsum, posuere ac dictum eget, feugiat a justo.", |
||||
|
"Donec fringilla blandit enim sed pulvinar.", |
||||
|
"Curabitur ut lacus eget enim molestie accumsan viverra sit amet mauris.", |
||||
|
"Praesent in ultricies nulla.", |
||||
|
"Morbi euismod tincidunt aliquam.", |
||||
|
"Sed nec magna finibus, faucibus leo id, laoreet ligula.", |
||||
|
"Cras aliquam ultricies mattis.", |
||||
|
"Donec vitae magna vehicula, scelerisque lorem vitae, dignissim lectus.", |
||||
|
"Suspendisse ultrices nisl non mollis tempor.", |
||||
|
"Pellentesque risus lectus, aliquam vitae urna sit amet, dictum consectetur nunc.", |
||||
|
"Nunc tortor eros, hendrerit quis ornare eu, cursus non ante.", |
||||
|
"Cras consequat tortor lectus, mollis interdum urna ullamcorper id.", |
||||
|
"Donec malesuada lobortis vestibulum.", |
||||
|
"Ut eleifend sem malesuada elit luctus placerat.", |
||||
|
"Integer tristique lacus et enim blandit, nec volutpat tortor iaculis.", |
||||
|
"Proin erat turpis, hendrerit a aliquam a, scelerisque dapibus leo.", |
||||
|
"Sed elementum augue magna, nec finibus elit aliquam sed.", |
||||
|
"Vestibulum eleifend lacus tortor, eget posuere risus volutpat consequat.", |
||||
|
"Phasellus pulvinar, erat vel fringilla dapibus, mauris ex eleifend mauris, eu facilisis felis dui non nibh.", |
||||
|
"Curabitur et volutpat elit.", |
||||
|
"Curabitur lobortis, lectus tristique suscipit lobortis, ligula sem lacinia diam, quis lacinia leo ante aliquam purus.", |
||||
|
"Integer consectetur ornare auctor.", |
||||
|
"Vivamus nec nibh id augue mollis congue et et ante.", |
||||
|
"Mauris dignissim a velit eu malesuada.", |
||||
|
"Vivamus sit amet sodales purus.", |
||||
|
"Mauris eget vehicula lorem.", |
||||
|
"Nunc pulvinar ante faucibus tristique sagittis.", |
||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", |
||||
|
"Duis lectus nisl, tincidunt eu diam at, egestas congue libero.", |
||||
|
"Suspendisse potenti.", |
||||
|
"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.", |
||||
|
"Aenean et nunc sollicitudin, elementum mauris lacinia, imperdiet magna.", |
||||
|
"Cras purus nisi, interdum a ante laoreet, commodo fermentum quam.", |
||||
|
"Nunc ut ante scelerisque, porta purus at, placerat turpis.", |
||||
|
"Pellentesque sit amet turpis orci.", |
||||
|
"Duis non lacinia lorem.", |
||||
|
"Donec tempor eros eu augue volutpat consequat.", |
||||
|
"Aenean non tempus erat.", |
||||
|
"Suspendisse congue, enim aliquet scelerisque venenatis, mi lectus sollicitudin massa, nec placerat mi diam lacinia ipsum.", |
||||
|
"In pulvinar ornare enim non ultricies.", |
||||
|
"Interdum et malesuada fames ac ante ipsum primis in faucibus." |
||||
|
] |
||||
|
} |
||||
|
} |
@ -0,0 +1,129 @@ |
|||||
|
import os, json |
||||
|
from flask import Markup |
||||
|
|
||||
|
from nltk import tokenize, pos_tag, RegexpTokenizer |
||||
|
tokenizer = RegexpTokenizer(r'\w+') # initialize tokenizer |
||||
|
|
||||
|
import pprint |
||||
|
pp = pprint.PrettyPrinter(indent=4) |
||||
|
|
||||
|
def load_index(): |
||||
|
if os.path.isfile('index.json') == False: |
||||
|
tfidf.create_index() |
||||
|
f = open('index.json').read() |
||||
|
index = json.loads(f) |
||||
|
return index |
||||
|
|
||||
|
def get_random(x, y): |
||||
|
from random import randint |
||||
|
return randint(x, y) |
||||
|
|
||||
|
def generate_random_rgb(): |
||||
|
r = get_random(0, 255) |
||||
|
g = get_random(0, 255) |
||||
|
b = get_random(0, 255) |
||||
|
return r, g, b |
||||
|
|
||||
|
def get_pos(): |
||||
|
# --- |
||||
|
# Note: NLTK provides documentation for each tag, |
||||
|
# which can be queried using the tag, e.g. |
||||
|
# nltk.help.upenn_tagset('RB'), or a regular expression, |
||||
|
# e.g. nltk.help.upenn_tagset('NN.*'). Some corpora |
||||
|
# have README files with tagset documentation, |
||||
|
# see nltk.corpus.???.readme(), substituting in the name |
||||
|
# of the corpus. -- http://www.nltk.org/book/ch05.html |
||||
|
# --- |
||||
|
|
||||
|
# data { |
||||
|
# 'word' : { |
||||
|
# 'count' : 8, |
||||
|
# 'sentences' : { |
||||
|
# 'filename' : [ |
||||
|
# 'This is a sentence.', |
||||
|
# 'This is another sentence.' |
||||
|
# ] |
||||
|
# } |
||||
|
# } |
||||
|
# } |
||||
|
|
||||
|
index = load_index() |
||||
|
sentences_all = [index[document]['sentences'] for document, _ in index.items()] |
||||
|
data = {} |
||||
|
data['ADJ'] = {} |
||||
|
data['PRE'] = {} |
||||
|
filenames = [filename for filename, _ in index.items()] |
||||
|
# print(filenames) |
||||
|
for i, sentences in enumerate(sentences_all): |
||||
|
r, g, b = generate_random_rgb() |
||||
|
for sentence in sentences: |
||||
|
pos = pos_tag(tokenizer.tokenize(sentence)) |
||||
|
# print(pos) |
||||
|
for word, tag in pos: |
||||
|
if 'JJ' in tag: |
||||
|
# --- |
||||
|
# JJ: adjective or numeral, ordinal |
||||
|
# For example: third ill-mannered pre-war regrettable oiled calamitous first separable |
||||
|
# ectoplasmic battery-powered participatory fourth still-to-be-named |
||||
|
# multilingual multi-disciplinary ... |
||||
|
if word.lower() not in data['ADJ']: |
||||
|
data['ADJ'][word.lower()] = {} |
||||
|
if 'sentences' not in data['ADJ'][word.lower()]: |
||||
|
data['ADJ'][word.lower()]['sentences'] = {} |
||||
|
if filenames[i] not in data['ADJ'][word.lower()].keys(): |
||||
|
data['ADJ'][word.lower()]['sentences'][filenames[i]] = [] |
||||
|
s = Markup(sentence.replace(word, '<strong class="query" style="color:rgba({r},{g},{b},1); background-image: radial-gradient(ellipse, rgba({r},{g},{b},0.4), rgba({r},{g},{b},0.2), transparent, transparent);">{word}</strong>'.format(r=r, b=b, g=g, word=word))) |
||||
|
if s not in data['ADJ'][word.lower()]['sentences'][filenames[i]]: |
||||
|
data['ADJ'][word.lower()]['sentences'][filenames[i]].append(s) |
||||
|
if 'TO' in tag or 'IN' in tag: |
||||
|
# --- |
||||
|
# TO: "to" as preposition (voorzetsel) or infinitive marker (oneindige beïnvloeder?) |
||||
|
# For example: to |
||||
|
# --- |
||||
|
# IN: preposition or conjunction (voegwoord, samenstelling, verbinding), subordinating (ondergeschikt) |
||||
|
# For example: astride among uppon whether out inside pro despite on by throughout |
||||
|
# below within for towards near behind atop around if like until below |
||||
|
# next into if beside ... |
||||
|
# --- |
||||
|
if word.lower() not in data['PRE']: |
||||
|
data['PRE'][word.lower()] = {} |
||||
|
if 'sentences' not in data['PRE'][word.lower()]: |
||||
|
data['PRE'][word.lower()]['sentences'] = {} |
||||
|
if filenames[i] not in data['PRE'][word.lower()]['sentences'].keys(): |
||||
|
data['PRE'][word.lower()]['sentences'][filenames[i]] = [] |
||||
|
s = Markup(sentence.replace(word, '<strong class="query" style="color:rgba({r},{g},{b},1); background-image: radial-gradient(ellipse, rgba({r},{g},{b},0.4), rgba({r},{g},{b},0.2), transparent, transparent);">{word}</strong>'.format(r=r, b=b, g=g, word=word))) |
||||
|
if s not in data['PRE'][word.lower()]['sentences'][filenames[i]]: |
||||
|
data['PRE'][word.lower()]['sentences'][filenames[i]].append(s) |
||||
|
|
||||
|
# count number of results for each word |
||||
|
for word_type, words in data.items(): |
||||
|
for word, _ in words.items(): |
||||
|
# print(filenames) |
||||
|
count = 0 |
||||
|
for filename, sentences in data[word_type][word]['sentences'].items(): |
||||
|
# print(filename) |
||||
|
count += len(sentences) |
||||
|
data[word_type][word.lower()]['count'] = count |
||||
|
count = 0 |
||||
|
|
||||
|
data_sorted = {} |
||||
|
for word_type, words in data.items(): |
||||
|
tmp = [] |
||||
|
for word, _ in words.items(): |
||||
|
count = data[word_type][word.lower()]['count'] |
||||
|
tmp.append([count, word]) |
||||
|
i = 0 |
||||
|
tmp.sort(reverse=True) |
||||
|
print('tmp', tmp) |
||||
|
for count, word in tmp: |
||||
|
if word_type not in data_sorted: |
||||
|
data_sorted[word_type] = {} |
||||
|
data_sorted[word_type][i] = {} |
||||
|
data_sorted[word_type][i][word.lower()] = data[word_type][word.lower()] |
||||
|
i += 1 |
||||
|
|
||||
|
print(data_sorted) |
||||
|
return data_sorted, index |
||||
|
|
||||
|
# data, index = get_pos() |
||||
|
# pp.pprint(data) |
@ -0,0 +1,42 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
|
||||
|
import os |
||||
|
import flask |
||||
|
|
||||
|
import readings |
||||
|
from create_index import create_index |
||||
|
|
||||
|
# Create the application. |
||||
|
APP = flask.Flask(__name__) |
||||
|
|
||||
|
@APP.route('/', methods=['GET', 'POST']) |
||||
|
def index(): |
||||
|
data, index = readings.get_pos() |
||||
|
filenames = [document for document, _ in index.items()] |
||||
|
return flask.render_template('index.html', data=data, filenames=filenames) |
||||
|
|
||||
|
@APP.route('/<word_type>/<word>', methods=['GET', 'POST']) |
||||
|
def results(word_type, word): |
||||
|
data, index = readings.get_pos() |
||||
|
for ranking, words in data[word_type].items(): |
||||
|
for w in words.keys(): |
||||
|
if w == word: |
||||
|
results = data[word_type][ranking][word.lower()] |
||||
|
filenames = [document for document, _ in index.items()] |
||||
|
return flask.render_template('results.html', data=data, results=results, filenames=filenames, word=word, word_type=word_type) |
||||
|
|
||||
|
@APP.route('/document/<name>', methods=['GET', 'POST']) |
||||
|
def open_document(name): |
||||
|
""" |
||||
|
Open document. |
||||
|
""" |
||||
|
data, index = readings.get_pos() |
||||
|
filenames = sorted([document for document, _ in index.items()]) |
||||
|
txt = open('txt/{}.txt'.format(name), 'r').readlines() |
||||
|
return flask.render_template('document.html', data=data, name=name, filenames=filenames, txt=txt) |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
if not 'index.json' in os.listdir('.'): |
||||
|
create_index() |
||||
|
APP.debug=True |
||||
|
APP.run(port=5000) |
@ -0,0 +1,85 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang='en'> |
||||
|
<head> |
||||
|
<meta charset="utf-8" /> |
||||
|
<title>worksessions - calls - attachments</title> |
||||
|
<style> |
||||
|
body{ |
||||
|
position: relative; |
||||
|
width: 100%; |
||||
|
min-width: 800px; |
||||
|
left: 0; |
||||
|
top:0; |
||||
|
overflow-x: hidden; |
||||
|
} |
||||
|
#wrapper{ |
||||
|
width: calc(100% - 220px); |
||||
|
} |
||||
|
div#crossings, div#sentences, div#ADJ, div#PRE{ |
||||
|
position: relative; |
||||
|
display: inline-block; |
||||
|
width: calc(50% - 1.25em); |
||||
|
top:0; |
||||
|
left: 0; |
||||
|
margin:0 1em 2em 0; |
||||
|
padding:0; |
||||
|
vertical-align: top; |
||||
|
} |
||||
|
div#crossings{ |
||||
|
float: right; |
||||
|
} |
||||
|
div#txtfiles{ |
||||
|
position: absolute; |
||||
|
width:200px; |
||||
|
top:0; |
||||
|
right: 40px; |
||||
|
} |
||||
|
div.sentence{ |
||||
|
margin-bottom: 1.5em; |
||||
|
} |
||||
|
strong.query{ |
||||
|
display: inline; |
||||
|
width: 100%; |
||||
|
height: 12em; |
||||
|
margin:10em -6em -10.5em -6em; |
||||
|
padding: 10em 6em; |
||||
|
text-align: center; |
||||
|
} |
||||
|
small, sup{ |
||||
|
font-family: monospace; |
||||
|
font-size: 8pt; |
||||
|
} |
||||
|
</style> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div id="wrapper"> |
||||
|
<div id="crossings"> |
||||
|
{% if data == {} %} |
||||
|
<div>I have no words for this.</div> |
||||
|
{% else %} |
||||
|
<h1 style="margin-bottom:0;margin-top:1.25em;line-height: 0;">attachments</h1> |
||||
|
{% for word_type, ranking in data.items() %} |
||||
|
<div id="{{ word_type }}"> |
||||
|
<h1>{{ word_type }}</h1> |
||||
|
{% for rank, words in ranking.items() %} |
||||
|
{% for word in words.keys() %} |
||||
|
<a href="/{{ word_type }}/{{ word }}">{{ word }}</a><sup>{{ words[word]['count'] }}</sup> |
||||
|
{% endfor %} |
||||
|
{% endfor %} |
||||
|
</div> |
||||
|
{% endfor %} |
||||
|
{% endif %} |
||||
|
</div> |
||||
|
<div id="sentences"> |
||||
|
{% block results %} |
||||
|
{% endblock %} |
||||
|
</div> |
||||
|
<div id="txtfiles"> |
||||
|
<h1><br>files</h1> |
||||
|
{% for file in filenames %} |
||||
|
<a href="/document/{{ file }}">{{ file }}</a><br> |
||||
|
{% endfor %} |
||||
|
</div> |
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,12 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %}{% endblock %} |
||||
|
|
||||
|
{% block txtlist %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block results %} |
||||
|
<h1><em>{{ name }}</em><br><br></h1> |
||||
|
{% for line in txt%} |
||||
|
<p>{{ line }}</p> |
||||
|
{% endfor %} |
||||
|
{% endblock %} |
@ -0,0 +1,4 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
|
||||
|
{% block results %} |
||||
|
{% endblock %} |
@ -0,0 +1,18 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %} {% endblock %} |
||||
|
|
||||
|
{% block txtlist %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block results %} |
||||
|
{% if results == {} %} |
||||
|
<div>No sentences.</div> |
||||
|
{% else %} |
||||
|
<h1><em>cross readings</em> <br>through <em>{{ word }}</em> ({{ word_type }})</h1> |
||||
|
{% for document, sentences in results['sentences'].items() %} |
||||
|
{% for sentence in sentences %} |
||||
|
<div class="{{ word_type }} sentence">{{ sentence }} <small>({{ document }})</small></div> |
||||
|
{% endfor %} |
||||
|
{% endfor %} |
||||
|
{% endif %} |
||||
|
{% endblock %} |
@ -0,0 +1,9 @@ |
|||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet scelerisque eleifend. Duis mollis fermentum metus eget luctus. Sed et lectus nulla. Mauris vel dignissim lorem, a mattis nisi. Proin fermentum rhoncus mauris, vitae sodales metus. Vivamus dolor neque, suscipit et justo quis, malesuada lacinia mi. Nulla sapien libero, bibendum at gravida vestibulum, dictum elementum ligula. In sit amet finibus metus. Ut tincidunt leo eget erat dictum euismod. Fusce feugiat erat a nunc condimentum, at fermentum neque semper. Ut tempor interdum dui, sit amet faucibus ante lacinia sed. Aenean at pretium velit. |
||||
|
|
||||
|
Nunc semper aliquet mattis. Proin gravida turpis non dui sagittis iaculis. Etiam consectetur rhoncus rutrum. Quisque nec fermentum massa, venenatis rutrum eros. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc convallis nisi vel ante vehicula, vitae consectetur felis luctus. Praesent non rutrum arcu, quis porttitor risus. Praesent rhoncus pulvinar iaculis. Curabitur odio augue, rutrum eget odio vel, ullamcorper facilisis arcu. Pellentesque feugiat dolor nec turpis rhoncus semper. Curabitur est odio, molestie eu nulla sit amet, porttitor gravida purus. |
||||
|
|
||||
|
Cras nec elementum est, et condimentum urna. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras sodales nisi risus, et tempor est pretium eu. Suspendisse volutpat dictum libero, et sollicitudin magna pellentesque eu. Donec finibus malesuada finibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nunc lorem turpis, rutrum et nunc consectetur, interdum auctor nisl. Maecenas et arcu urna. Cras pretium elementum fermentum. Aliquam erat velit, interdum non odio eget, rutrum vestibulum erat. Sed nec nulla ac urna volutpat mollis. Donec eget malesuada dui, eget cursus risus. Ut rutrum magna porta, scelerisque leo sit amet, vestibulum enim. Nam vehicula ante non cursus faucibus. Phasellus egestas pulvinar sollicitudin. |
||||
|
|
||||
|
Vivamus vitae ultricies est. Mauris sit amet pharetra diam, eu pharetra nisi. Sed finibus quam id risus fermentum, nec dictum arcu volutpat. Etiam venenatis non ipsum ac viverra. Maecenas volutpat nulla non nibh ultricies vestibulum. Nunc ornare tincidunt gravida. Sed ultrices finibus venenatis. Suspendisse potenti. Duis scelerisque ultricies ex id tristique. In hac habitasse platea dictumst. Nam aliquam vulputate accumsan. Proin erat tortor, consequat sed metus id, cursus bibendum justo. Sed hendrerit, libero aliquet porta suscipit, erat erat rhoncus libero, eu aliquam odio nisi in est. |
||||
|
|
||||
|
Donec enim massa, pellentesque in urna sed, viverra sagittis justo. In hac habitasse platea dictumst. Aliquam erat volutpat. Pellentesque hendrerit viverra magna, ut eleifend risus euismod eu. Suspendisse vestibulum malesuada ipsum, scelerisque hendrerit lorem malesuada id. Praesent euismod efficitur dolor quis convallis. Vestibulum at leo non nisl ultrices gravida a id tellus. Fusce et placerat ligula, vel cursus dolor. Cras eget ante a lacus tristique rutrum. In hac habitasse platea dictumst. Integer commodo venenatis libero quis ultricies. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec et eros felis. Nullam dictum tellus tincidunt, aliquet urna id, rhoncus nisi. Phasellus nec tellus purus. Aliquam lobortis sapien sollicitudin porttitor ullamcorper. |
@ -0,0 +1,19 @@ |
|||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut posuere augue est, luctus sodales nibh tempus in. Vestibulum nec massa aliquam, facilisis sapien mattis, porta nisi. Suspendisse id fermentum elit, nec tristique eros. Sed convallis gravida tellus sed rhoncus. Pellentesque auctor, ipsum nec rutrum laoreet, nibh mi euismod augue, vitae cursus libero tortor vitae nisl. Pellentesque a lectus a justo varius auctor. Cras nisi nibh, pretium porttitor erat a, ullamcorper semper diam. Phasellus et ex vitae nisl sagittis euismod. Sed dapibus lacus nec magna dapibus, eu fringilla purus pellentesque. Ut vitae nibh diam. Quisque blandit, nunc eu laoreet finibus, turpis tellus rhoncus orci, nec mollis nisl dolor vitae eros. Maecenas mi mi, aliquam congue massa fermentum, maximus pretium nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc ultrices enim urna. |
||||
|
|
||||
|
Nullam ut enim non ipsum pellentesque pulvinar. Nullam lacinia nisi ex, ac tincidunt orci bibendum nec. Etiam facilisis euismod vehicula. Pellentesque semper, erat efficitur ultricies ultrices, elit urna convallis eros, at tempor eros sapien a ex. Cras dapibus blandit justo id porttitor. Sed facilisis lacus finibus semper placerat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lorem turpis, dictum non elementum non, finibus quis eros. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam non sem sit amet lacus iaculis tincidunt. Vestibulum viverra ac est vitae suscipit. Nam quis dui sed augue volutpat scelerisque sit amet nec tellus. Donec venenatis condimentum sagittis. Quisque molestie tempor turpis. |
||||
|
|
||||
|
Donec tempus magna sit amet lacus vulputate viverra. Sed vel quam congue eros dignissim lobortis. Aenean facilisis ut dolor sed ultricies. Cras auctor dolor ac dui semper, vitae maximus purus bibendum. Suspendisse eleifend imperdiet mauris et convallis. In nec volutpat risus, at placerat lectus. Vivamus vehicula dolor nec lacus dignissim euismod. Vivamus gravida felis non sollicitudin accumsan. Quisque vitae posuere orci. Proin dapibus faucibus arcu quis lacinia. Nulla facilisi. Proin ut nibh velit. Vestibulum quis tempor odio, quis cursus erat. Praesent ex metus, interdum ut tincidunt non, scelerisque tincidunt arcu. Quisque ac molestie mi, et euismod erat. Vestibulum lectus nisl, vulputate eget ex vitae, mollis feugiat eros. |
||||
|
|
||||
|
Praesent ullamcorper dui eget mauris dignissim pretium. Donec consectetur purus ac felis congue, et euismod nulla pretium. Quisque eu erat justo. Suspendisse imperdiet hendrerit vestibulum. Sed vulputate, velit sit amet pharetra condimentum, enim massa blandit quam, sed lobortis ipsum nibh posuere nisi. Proin porta nisl at augue finibus, ac tincidunt sapien lacinia. Curabitur iaculis eu erat sed hendrerit. Integer pharetra enim eros, ac ullamcorper nunc viverra tempor. Morbi leo tortor, porta nec tellus sit amet, sagittis accumsan ex. Ut rhoncus, velit id porta mattis, dolor lacus sagittis nulla, at suscipit lacus ex sit amet leo. Aliquam sit amet lacinia urna, et facilisis purus. |
||||
|
|
||||
|
Pellentesque euismod tellus molestie, pulvinar arcu id, consequat ipsum. In pharetra faucibus libero, fermentum posuere nisl. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque at dolor in ex commodo efficitur. Aliquam interdum in metus at scelerisque. Phasellus rutrum justo et justo molestie dapibus. Suspendisse ac diam blandit, porta ex ut, lobortis est. Fusce dictum efficitur convallis. Mauris justo velit, scelerisque nec laoreet quis, placerat et felis. Duis eu quam risus. Praesent mollis eros in magna sollicitudin porta. Donec vitae odio ipsum. Suspendisse potenti. Nunc id libero consequat, euismod lacus sed, ornare lorem. Praesent scelerisque eu quam a vestibulum. Nullam sodales tincidunt leo, vel malesuada elit commodo id. |
||||
|
|
||||
|
Donec eu augue maximus leo iaculis varius eu vitae quam. Praesent maximus, felis eget congue elementum, neque turpis interdum ex, nec hendrerit odio sem a arcu. Quisque iaculis rutrum mauris ut faucibus. Pellentesque fermentum dolor sed eros volutpat, ullamcorper porta metus ornare. Duis sollicitudin blandit dui, et iaculis libero mollis congue. Morbi dapibus tortor tortor, eget eleifend lacus malesuada id. Sed at lorem ante. Maecenas a semper purus. Duis eget nibh neque. Donec consequat libero eros, id posuere odio fermentum vel. Aliquam nec varius magna. |
||||
|
|
||||
|
Phasellus nec volutpat turpis. Phasellus elit neque, tincidunt eu vehicula sit amet, vestibulum at nisi. Suspendisse vitae ultricies quam. Pellentesque sagittis sollicitudin arcu sed sollicitudin. Mauris vehicula erat risus, tempus consectetur mi scelerisque et. Cras et tortor ut mauris vehicula porttitor eu at eros. Vivamus porta, enim nec pretium elementum, diam nunc scelerisque risus, eget blandit libero augue ut diam. Vivamus eget lorem eget lectus dignissim consectetur id nec mi. Integer volutpat pulvinar dictum. Aliquam purus nisl, blandit sed ligula ut, interdum cursus odio. |
||||
|
|
||||
|
Cras congue lacinia nisi, quis eleifend massa placerat mollis. Sed in mi eros. Praesent semper ultricies velit in ultricies. Mauris tristique varius turpis vel placerat. Nam vulputate sit amet ligula nec commodo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed rhoncus massa in luctus interdum. Mauris et justo ac eros blandit mattis. |
||||
|
|
||||
|
Donec ante sem, malesuada elementum ex at, tempus mollis sem. Aenean ac venenatis tellus. Phasellus vestibulum mi nec elit sollicitudin aliquet. Donec sed justo erat. Nunc scelerisque lectus vitae placerat pretium. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque semper interdum laoreet. Donec facilisis, orci ut semper sodales, augue ipsum iaculis mi, eu tempor ligula libero dictum enim. Mauris non ultricies leo, eget ullamcorper dui. Fusce ante purus, pellentesque in tristique in, ornare ut massa. Vestibulum tempus ipsum sed fringilla rutrum. |
||||
|
|
||||
|
Praesent ultrices posuere sem eu fringilla. Nulla efficitur magna nunc, sit amet imperdiet ante tempor non. In vitae aliquam neque. Nunc leo tortor, volutpat et mi ut, convallis pretium nunc. Fusce quis tortor tincidunt, viverra arcu sed, feugiat ex. Vestibulum sed tortor elementum, sollicitudin leo id, rutrum diam. Aenean eget nisi sagittis, commodo leo eget, egestas libero. Aliquam convallis risus nunc, nec blandit mi lacinia non. Nunc venenatis tellus ac leo accumsan dignissim. Donec molestie eleifend aliquet. Nunc ullamcorper ligula neque, nec sagittis erat luctus in. Integer eu erat id ante congue vehicula. In in dictum diam, ut tincidunt urna. Morbi nec lectus vitae lorem vehicula tristique vitae ac ipsum. |
@ -0,0 +1,29 @@ |
|||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu consequat dolor. Vestibulum tempus risus vitae massa hendrerit, a fermentum quam lacinia. Fusce laoreet ultricies ornare. Cras ultricies quis tellus ac ullamcorper. Pellentesque congue vehicula nunc et sodales. In tincidunt porttitor justo quis convallis. Vestibulum sed turpis sed tellus varius placerat. Phasellus consectetur libero id feugiat pretium. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus sed lorem et ligula tempus dapibus. Donec eu sollicitudin justo, sed ornare nibh. In hac habitasse platea dictumst. Fusce dictum eget odio quis rhoncus. Curabitur posuere arcu quis mi molestie, a mattis est viverra. |
||||
|
|
||||
|
Suspendisse euismod fermentum maximus. Quisque in diam sed leo pretium dapibus eget aliquet augue. Aenean rhoncus sed purus auctor sagittis. Nulla eget feugiat arcu. Nam accumsan, leo in scelerisque facilisis, tortor lectus sagittis orci, a dictum eros diam vestibulum odio. Suspendisse aliquet mi eget arcu dictum euismod. Aliquam imperdiet odio iaculis mollis interdum. Nam sed dictum augue. Nulla sagittis arcu at libero porttitor bibendum porta ac nunc. Nam ut urna laoreet turpis vehicula finibus rhoncus ut erat. Etiam at justo vehicula ante feugiat porttitor non eget mauris. Nunc tincidunt fringilla mollis. Aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus accumsan accumsan diam et pharetra. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. |
||||
|
|
||||
|
Nulla pellentesque gravida ex id porta. Nam vitae consequat eros, facilisis venenatis erat. Nunc quis venenatis dolor. Maecenas commodo gravida egestas. Vestibulum ut orci finibus, aliquam metus molestie, maximus enim. Praesent at augue ut nulla mattis aliquet. Integer fringilla dignissim elit non lacinia. Pellentesque scelerisque nec felis sit amet malesuada. |
||||
|
|
||||
|
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec efficitur hendrerit urna, pulvinar finibus eros efficitur in. Phasellus finibus ipsum est, vel tempor nisi sollicitudin vitae. Morbi vitae est et arcu vulputate semper. Nam a finibus tortor, sit amet cursus arcu. Aenean congue, risus eu tristique elementum, magna augue tristique diam, non imperdiet ipsum erat nec est. Integer venenatis augue sit amet eleifend elementum. Donec rhoncus metus eget suscipit vulputate. Duis euismod risus ut justo gravida, nec ultrices nisl placerat. Aliquam elementum feugiat mollis. Vestibulum lobortis mattis tortor eget ullamcorper. Mauris congue, urna non auctor finibus, leo enim ultrices nibh, nec dignissim dui lorem euismod nibh. |
||||
|
|
||||
|
Phasellus suscipit semper posuere. Donec luctus eros turpis, vel ultricies tortor fringilla vel. Vestibulum venenatis pulvinar nibh vel cursus. Curabitur congue molestie urna, at sagittis lorem imperdiet eu. Fusce in purus et est tincidunt sollicitudin eu nec risus. Suspendisse tempus eros ante, in feugiat nibh sodales ac. Curabitur commodo mi at leo aliquet tempus. |
||||
|
|
||||
|
Phasellus blandit varius nunc, sit amet consequat ipsum vulputate in. Nam eget sem dictum, rhoncus turpis a, condimentum mi. Nulla et fermentum libero, sed suscipit justo. Nunc ac felis sem. Maecenas a metus risus. Morbi porta tincidunt ex at cursus. Suspendisse tristique arcu nec lorem elementum, quis faucibus dolor sodales. Praesent porta congue auctor. Vivamus eu iaculis arcu, nec ultrices erat. Cras sodales facilisis metus in laoreet. Proin a magna ligula. Nunc bibendum tincidunt hendrerit. Aliquam erat volutpat. Cras auctor facilisis tincidunt. Maecenas eu sollicitudin massa. Nunc consectetur leo fringilla, tristique lorem vitae, lobortis dui. |
||||
|
|
||||
|
Nunc lobortis tempor blandit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut et consectetur libero. Morbi dapibus metus quis lectus laoreet, id commodo nulla tempor. Aenean nibh ante, ornare sit amet vehicula a, gravida ac quam. Nam ornare orci ac vulputate condimentum. Suspendisse pulvinar vestibulum mi, in dignissim lorem feugiat et. Curabitur non nulla interdum, cursus sem vitae, viverra diam. Ut porta orci id nunc convallis, vel lobortis erat fringilla. In bibendum iaculis auctor. Duis eget euismod lacus, in congue enim. |
||||
|
|
||||
|
Curabitur lobortis vestibulum risus in dignissim. Nunc id convallis quam, et porttitor lorem. Vestibulum in posuere tortor, vel posuere mi. Proin ultricies lacus vitae maximus commodo. Pellentesque viverra nisl non eleifend fermentum. Suspendisse leo leo, fermentum vitae convallis accumsan, consectetur at nibh. Fusce eu ante elit. Curabitur dignissim ut enim vel pellentesque. Sed turpis purus, porta in tortor non, tempor tincidunt ipsum. |
||||
|
|
||||
|
Mauris non interdum sapien. Ut sollicitudin eget lorem ultrices vestibulum. Integer et fermentum urna, vitae molestie magna. In sit amet fermentum orci. Pellentesque ultrices volutpat lorem a congue. Phasellus non quam vel magna sodales aliquet non eu ligula. Aenean risus purus, tincidunt id mattis sed, interdum et urna. Nunc in sem aliquam enim hendrerit euismod. Praesent dictum enim non felis consectetur vehicula. Suspendisse aliquam condimentum tempus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec et mauris nulla. Quisque dignissim, elit ut convallis laoreet, felis metus luctus lectus, sed feugiat nibh purus non leo. Cras laoreet tempor dictum. Quisque vitae magna eget velit rutrum sodales. Quisque vestibulum dui metus, a mollis enim cursus vel. |
||||
|
|
||||
|
Nam at hendrerit est. Nulla eleifend odio at lacus mattis, quis feugiat urna euismod. Morbi eget nunc sed eros accumsan cursus sed eget ex. Maecenas sagittis pulvinar diam quis cursus. Nullam vel rhoncus metus. Morbi at tortor feugiat, sollicitudin urna ut, sollicitudin risus. Nullam nulla velit, pellentesque eu lectus vel, sagittis laoreet ligula. Proin luctus ac libero luctus imperdiet. Sed ullamcorper, est vel tincidunt tempor, eros tortor interdum odio, at blandit turpis ligula ut tortor. Cras bibendum dignissim urna, sit amet gravida dolor commodo porta. Suspendisse fermentum metus gravida est tincidunt, vel tempus leo condimentum. |
||||
|
|
||||
|
Nam vel nulla nibh. Pellentesque ac tristique dolor. Aenean malesuada tortor interdum consequat dictum. Donec tempor turpis eget lorem consequat, sed porttitor sapien scelerisque. Curabitur vel nulla fermentum, viverra dolor ut, dictum erat. Nunc mauris ante, varius sit amet turpis ut, bibendum tempor erat. Maecenas gravida gravida leo sed rutrum. Pellentesque vulputate lacinia odio, sit amet pulvinar ligula dictum id. |
||||
|
|
||||
|
Proin magna ipsum, posuere ac dictum eget, feugiat a justo. Donec fringilla blandit enim sed pulvinar. Curabitur ut lacus eget enim molestie accumsan viverra sit amet mauris. Praesent in ultricies nulla. Morbi euismod tincidunt aliquam. Sed nec magna finibus, faucibus leo id, laoreet ligula. Cras aliquam ultricies mattis. |
||||
|
|
||||
|
Donec vitae magna vehicula, scelerisque lorem vitae, dignissim lectus. Suspendisse ultrices nisl non mollis tempor. Pellentesque risus lectus, aliquam vitae urna sit amet, dictum consectetur nunc. Nunc tortor eros, hendrerit quis ornare eu, cursus non ante. Cras consequat tortor lectus, mollis interdum urna ullamcorper id. Donec malesuada lobortis vestibulum. Ut eleifend sem malesuada elit luctus placerat. Integer tristique lacus et enim blandit, nec volutpat tortor iaculis. Proin erat turpis, hendrerit a aliquam a, scelerisque dapibus leo. Sed elementum augue magna, nec finibus elit aliquam sed. Vestibulum eleifend lacus tortor, eget posuere risus volutpat consequat. Phasellus pulvinar, erat vel fringilla dapibus, mauris ex eleifend mauris, eu facilisis felis dui non nibh. Curabitur et volutpat elit. |
||||
|
|
||||
|
Curabitur lobortis, lectus tristique suscipit lobortis, ligula sem lacinia diam, quis lacinia leo ante aliquam purus. Integer consectetur ornare auctor. Vivamus nec nibh id augue mollis congue et et ante. Mauris dignissim a velit eu malesuada. Vivamus sit amet sodales purus. Mauris eget vehicula lorem. Nunc pulvinar ante faucibus tristique sagittis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis lectus nisl, tincidunt eu diam at, egestas congue libero. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean et nunc sollicitudin, elementum mauris lacinia, imperdiet magna. |
||||
|
|
||||
|
Cras purus nisi, interdum a ante laoreet, commodo fermentum quam. Nunc ut ante scelerisque, porta purus at, placerat turpis. Pellentesque sit amet turpis orci. Duis non lacinia lorem. Donec tempor eros eu augue volutpat consequat. Aenean non tempus erat. Suspendisse congue, enim aliquet scelerisque venenatis, mi lectus sollicitudin massa, nec placerat mi diam lacinia ipsum. In pulvinar ornare enim non ultricies. Interdum et malesuada fames ac ante ipsum primis in faucibus. |
@ -0,0 +1,51 @@ |
|||||
|
```\ |
||||
|
█▀▀ █▀▀█ █▀▀█ █▀▀ █▀▀ ░░ █▀▀█ █▀▀ █▀▀█ █▀▀▄ ░▀░ █▀▀▄ █▀▀▀ █▀▀ |
||||
|
█░░ █▄▄▀ █░░█ ▀▀█ ▀▀█ ▀▀ █▄▄▀ █▀▀ █▄▄█ █░░█ ▀█▀ █░░█ █░▀█ ▀▀█ |
||||
|
▀▀▀ ▀░▀▀ ▀▀▀▀ ▀▀▀ ▀▀▀ ░░ ▀░▀▀ ▀▀▀ ▀░░▀ ▀▀▀░ ▀▀▀ ▀░░▀ ▀▀▀▀ ▀▀▀ |
||||
|
``` |
||||
|
|
||||
|
# cross-reader (TF-IDF) |
||||
|
|
||||
|
(a few notes) |
||||
|
|
||||
|
## Install |
||||
|
|
||||
|
$ pip3 install flask |
||||
|
|
||||
|
$ pip3 install nltk |
||||
|
|
||||
|
|
||||
|
## Start |
||||
|
|
||||
|
Start the flask/python local server ... |
||||
|
|
||||
|
$ python3 start.py |
||||
|
|
||||
|
Browse to your localhost on port 5000 ... |
||||
|
|
||||
|
> 127.0.0.1:5000 |
||||
|
|
||||
|
|
||||
|
## Txt documents |
||||
|
|
||||
|
The search machine is using the index.json file to process results. |
||||
|
|
||||
|
The function 'create_index' can be called to generate this file. It uses a set of plain text files to index each word and its corresponding TFIDF value. |
||||
|
|
||||
|
|
||||
|
## Changing txt documents |
||||
|
|
||||
|
If you want to work with another set of texts, make a 'txt/' folder, add a few txt files in it, and remove the index.json file (or rename it if you want to keep it). |
||||
|
|
||||
|
To generate a new index.json file: |
||||
|
|
||||
|
Remove the index.json file |
||||
|
|
||||
|
$ rm index.json |
||||
|
|
||||
|
Stop and start the python server... |
||||
|
|
||||
|
ctrl + c |
||||
|
|
||||
|
$ python3 start.py |
||||
|
|
File diff suppressed because it is too large
@ -0,0 +1,260 @@ |
|||||
|
import os, json, re |
||||
|
from flask import Markup |
||||
|
|
||||
|
import nltk |
||||
|
from nltk import sent_tokenize |
||||
|
from nltk.tokenize import RegexpTokenizer |
||||
|
tokenizer = RegexpTokenizer(r'\w+') # initialize tokenizer |
||||
|
|
||||
|
import pprint |
||||
|
pp = pprint.PrettyPrinter(indent=4) |
||||
|
|
||||
|
import tfidf |
||||
|
|
||||
|
|
||||
|
# TF-IDF visualisation multiplier |
||||
|
multiplier = 25000 |
||||
|
|
||||
|
|
||||
|
def load_index(): |
||||
|
if os.path.isfile('index.json') == False: |
||||
|
tfidf.create_index() |
||||
|
f = open('index.json').read() |
||||
|
index = json.loads(f) |
||||
|
return index |
||||
|
|
||||
|
def get_random(x, y): |
||||
|
from random import randint |
||||
|
return randint(x, y) |
||||
|
|
||||
|
def generate_random_rgb(): |
||||
|
r = get_random(0, 255) |
||||
|
g = get_random(0, 255) |
||||
|
b = get_random(0, 255) |
||||
|
return r, g, b |
||||
|
|
||||
|
def insert_query_highlight(query, sentence, r, g, b): |
||||
|
pattern = r'[\s\W\_]'+query+r'[\s\W\_]|^'+query+'|'+query+'$' |
||||
|
match = re.search(pattern, sentence, flags=re.IGNORECASE) |
||||
|
if match: |
||||
|
match = match.group() |
||||
|
sentence = re.sub(pattern, ' <strong class="query" style="color:rgba({r},{g},{b},1); background-image: radial-gradient(ellipse, rgba({r},{g},{b},0.4), rgba({r},{g},{b},0.2), transparent, transparent);">{match}</strong> '.format(match=match, r=r, b=b, g=g), sentence, flags=re.IGNORECASE) |
||||
|
return sentence |
||||
|
|
||||
|
def insert_suggestion_links(query, sentence): |
||||
|
# insert further reading links |
||||
|
for suggestion in open('words.txt','r').readlines(): |
||||
|
suggestion = suggestion.replace('\n', '').strip() |
||||
|
if suggestion: |
||||
|
if suggestion != query: |
||||
|
pattern = r'[\s\W\_]'+suggestion+r'[\s\W\_]|^'+suggestion+'|'+suggestion+'$' |
||||
|
match = re.search(pattern, sentence, flags=re.IGNORECASE) |
||||
|
if match: |
||||
|
match = match.group() |
||||
|
match = match.replace(suggestion, '<a href="?q={0}">{0}</a>'.format(suggestion)) |
||||
|
sentence = re.sub(pattern, ' <strong>{}</strong> '.format(match), sentence, flags=re.IGNORECASE) |
||||
|
return sentence |
||||
|
|
||||
|
def get_adjectives(): |
||||
|
index = load_index() |
||||
|
sentences_all = [sentences for sentences in document['sentences'] for document, _ in index.items()] |
||||
|
adjectives = [] |
||||
|
for sentences in sentences_all: |
||||
|
for sentence in sentences: |
||||
|
pos = nltk.pos_tag(words) |
||||
|
|
||||
|
return adjectives |
||||
|
|
||||
|
def generate_analytics(query, results, index): |
||||
|
analytics = {} |
||||
|
querypos = nltk.pos_tag([query]) |
||||
|
analytics['type'] = querypos[0][1] |
||||
|
|
||||
|
# Contrast-mapping |
||||
|
# analytics['mapping'] = [] |
||||
|
# if results[0]['matches']: |
||||
|
# for word in tokenizer.tokenize(results[0]['matches'][0]): |
||||
|
# document = results[0]['filename'] |
||||
|
# analytics['mapping'].append([word, index[document]['tfidf'][word.lower()] * multiplier]) # lowercased! (!important) |
||||
|
|
||||
|
# Stemmer (very similar words) |
||||
|
analytics['stemmer'] = [] |
||||
|
porter = nltk.PorterStemmer() |
||||
|
basequery = porter.stem(query) |
||||
|
for document, _ in index.items(): |
||||
|
words = index[document]['tfidf'].keys() |
||||
|
bases = [[porter.stem(word), word] for word in words] |
||||
|
# print('Stemmer bases', bases) |
||||
|
for base, word in bases: |
||||
|
if base == basequery: |
||||
|
analytics['stemmer'].append(word) |
||||
|
analytics['stemmer'] = set(analytics['stemmer']) |
||||
|
if query in analytics['stemmer']: |
||||
|
analytics['stemmer'].remove(query) |
||||
|
# print('Stemmer:', matches) |
||||
|
|
||||
|
print('*analytics information returned*') |
||||
|
# pp.pprint(analytics) |
||||
|
return analytics |
||||
|
|
||||
|
def request_results(query): |
||||
|
print('*results request started*') |
||||
|
query = query.strip().lower() |
||||
|
print('Query:', query) |
||||
|
index = load_index() |
||||
|
filenames = [document for document, _ in index.items()] |
||||
|
|
||||
|
results = {} |
||||
|
|
||||
|
# results = { |
||||
|
# 0 : { |
||||
|
# 'name' : 'Feminist document (2000)', |
||||
|
# 'filename' : '2000_Feminist_document', |
||||
|
# 'tfidf' : 0.00041, |
||||
|
# 'matches' : [ |
||||
|
# 'This is a first matching sentence.', |
||||
|
# 'This is a second matching sentence.', |
||||
|
# 'This is a third matching sentence.' |
||||
|
# ] |
||||
|
# } |
||||
|
# } |
||||
|
|
||||
|
# First, sort the matching documents on TF-IDF values |
||||
|
order = [] |
||||
|
for document, _ in index.items(): |
||||
|
for key in index[document]['tfidf'].keys(): |
||||
|
if query == key.lower(): |
||||
|
print('Query match:', query) |
||||
|
match = (index[document]['tfidf'][key.lower()], document) # lowercased! (!important) |
||||
|
order.append(match) |
||||
|
break |
||||
|
order.sort(reverse=True) |
||||
|
print('Order:', order) |
||||
|
|
||||
|
# Loop through the sorted matches |
||||
|
# and add all the data that is needed |
||||
|
# (sentences, tfidf value, document name) |
||||
|
x = 0 |
||||
|
for tfidf, document in order: |
||||
|
# print('document:', document) |
||||
|
results[x] = {} |
||||
|
results[x]['name'] = index[document]['name'] # nicely readable name |
||||
|
results[x]['filename'] = document |
||||
|
results[x]['tfidf'] = tfidf |
||||
|
results[x]['matches'] = [] |
||||
|
results[x]['html'] = [] |
||||
|
|
||||
|
# Generate a random RGB color for this document |
||||
|
r, g, b = generate_random_rgb() |
||||
|
|
||||
|
# All sentences from this document |
||||
|
sentences = index[document]['sentences'] |
||||
|
|
||||
|
# Collect matching sentences only |
||||
|
for sentence in sentences: |
||||
|
for word in tokenizer.tokenize(sentence): |
||||
|
if word.lower() == query: |
||||
|
|
||||
|
# Append sentence to final set of matching results |
||||
|
results[x]['matches'].append(sentence) |
||||
|
|
||||
|
# Transform sentence into an HTML elements |
||||
|
html = insert_query_highlight(query, sentence, r, g, b) |
||||
|
html = insert_suggestion_links(query, html) |
||||
|
html = Markup(html) |
||||
|
results[x]['html'].append(html) |
||||
|
|
||||
|
break # Append sentence only once |
||||
|
x += 1 |
||||
|
|
||||
|
pp.pprint(results) |
||||
|
print('*results returned*') |
||||
|
|
||||
|
# Add analytics |
||||
|
if results.keys(): |
||||
|
analytics = generate_analytics(query, results, index) |
||||
|
else: |
||||
|
analytics = False |
||||
|
# pp.pprint(analytics) |
||||
|
|
||||
|
return filenames, results, analytics |
||||
|
|
||||
|
def get_tfidflistings(): |
||||
|
index = load_index() |
||||
|
languages = set([index[document]['language'] for document in index.keys()]) |
||||
|
tfidflistings = {} |
||||
|
for language in languages: |
||||
|
tfidflistings[language] = [] |
||||
|
for document in index.keys(): |
||||
|
if index[document]['language'] == language: |
||||
|
for word, value in index[document]['tfidf'].items(): |
||||
|
tfidflistings[language].append([value, word]) |
||||
|
tfidflistings[language].sort(reverse=True) |
||||
|
|
||||
|
# pp.pprint(tfidflistings) |
||||
|
print('*tfidflistings returned*') |
||||
|
return tfidflistings |
||||
|
|
||||
|
def get_tfidfcontext(query): |
||||
|
tfidflistings = get_tfidflistings() |
||||
|
tfidfcontext = {} |
||||
|
context_reach = 3 |
||||
|
for language in tfidflistings.keys(): |
||||
|
index = 0 |
||||
|
tfidfcontext[language] = [] |
||||
|
for value, word in tfidflistings[language]: |
||||
|
if word.lower() == query.lower(): |
||||
|
for x in range(1, context_reach): |
||||
|
cprev = tfidflistings[language][index - x] |
||||
|
cnext = tfidflistings[language][index + x] |
||||
|
tfidfcontext[language].append(cprev) |
||||
|
if x == 1: |
||||
|
tfidfcontext[language].append([value, word]) |
||||
|
tfidfcontext[language].append(cnext) |
||||
|
break |
||||
|
index += 1 |
||||
|
tfidfcontext[language].sort(reverse=True) |
||||
|
|
||||
|
# pp.pprint(tfidfcontext) |
||||
|
print('*tfidfcontext returned*') |
||||
|
return tfidfcontext |
||||
|
|
||||
|
def request_mappings(mapping_type): |
||||
|
index = load_index() |
||||
|
filenames = [document for document, _ in index.items()] |
||||
|
mappings = [] |
||||
|
for document, _ in index.items(): |
||||
|
sentences = [] |
||||
|
for sentence in index[document]['sentences']: |
||||
|
for word in tokenizer.tokenize(sentence): |
||||
|
if mapping_type == 'tfidf': |
||||
|
tfidf = index[document]['tfidf'][word.lower()] * multiplier # lowercased! (!important) |
||||
|
if [tfidf, word.lower()] not in mappings: # lowercased! (!important) |
||||
|
mappings.append([tfidf, word.lower()]) # lowercased! (!important) |
||||
|
# if mapping_type == 'tf': |
||||
|
# tf = index[document]['tf'][word.lower()] # lowercased! (!important) |
||||
|
# if [tf, word.lower()] not in mappings: # lowercased! (!important) |
||||
|
# mappings.append([tf, word.lower()]) # lowercased! (!important) |
||||
|
if mapping_type == 'idf': |
||||
|
idf = index[document]['idf'][word.lower()] # lowercased! (!important) |
||||
|
if [idf, word.lower()] not in mappings: # lowercased! (!important) |
||||
|
mappings.append([idf, word.lower()]) # lowercased! (!important) |
||||
|
mappings.sort(reverse=True) |
||||
|
return mappings, filenames |
||||
|
|
||||
|
def request_mappings_for_document(name): |
||||
|
index = load_index() |
||||
|
filenames = [document for document, _ in index.items()] |
||||
|
mappings = {} |
||||
|
for document, _ in index.items(): |
||||
|
if document == name: |
||||
|
sentences = [] |
||||
|
for sentence in index[document]['sentences']: |
||||
|
words = [] |
||||
|
for word in tokenizer.tokenize(sentence): |
||||
|
tfidf = index[document]['tfidf'][word.lower()] * multiplier # lowercased! (!important) |
||||
|
words.append([word, tfidf]) |
||||
|
sentences.append(words) |
||||
|
mappings[document] = sentences |
||||
|
# pp.pprint(mappings) |
||||
|
return mappings, filenames |
@ -0,0 +1,97 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
|
||||
|
import os, sys |
||||
|
from sys import stdout |
||||
|
import flask |
||||
|
from flask import request |
||||
|
|
||||
|
import tfidf |
||||
|
import readings |
||||
|
|
||||
|
|
||||
|
# Create the application. |
||||
|
APP = flask.Flask(__name__) |
||||
|
|
||||
|
# Jinja filters |
||||
|
def prettyfilename(filename): |
||||
|
return filename.replace('_', ' ').replace('-', ' ').replace('.txt', '') |
||||
|
APP.jinja_env.filters['prettyfilename'] = prettyfilename |
||||
|
|
||||
|
# Jinja globals |
||||
|
def get_random(x, y): |
||||
|
from random import randint |
||||
|
return randint(x, y) |
||||
|
APP.jinja_env.globals.update(get_random=get_random) |
||||
|
|
||||
|
@APP.route('/', methods=['GET', 'POST']) |
||||
|
def index(): |
||||
|
""" |
||||
|
Displays the index page accessible at '/' |
||||
|
Which is either the start page (using the index.html template) |
||||
|
or a results page (using the results.html template). |
||||
|
""" |
||||
|
query = None |
||||
|
results = None |
||||
|
|
||||
|
query = request.args.get('q', '') |
||||
|
suggestions = open('words.txt', 'r').readlines() |
||||
|
|
||||
|
if request.args.get('q', ''): |
||||
|
filenames, results, analytics = readings.request_results(query) |
||||
|
tfidfcontext = readings.get_tfidfcontext(query) |
||||
|
return flask.render_template('results.html', query=query, results=results, filenames=filenames, suggestions=suggestions, analytics=analytics) |
||||
|
|
||||
|
else: |
||||
|
index = readings.load_index() |
||||
|
filenames = [document for document, _ in index.items()] |
||||
|
return flask.render_template('index.html', filenames=filenames, suggestions=suggestions) |
||||
|
|
||||
|
@APP.route('/document/<name>', methods=['GET', 'POST']) |
||||
|
def open_document(name): |
||||
|
""" |
||||
|
Open document. |
||||
|
""" |
||||
|
index = readings.load_index() |
||||
|
suggestions = open('words.txt', 'r').readlines() |
||||
|
filenames = sorted([document for document, _ in index.items()]) |
||||
|
txt = open('txt/{}.txt'.format(name), 'r').readlines() |
||||
|
return flask.render_template('document.html', filenames=filenames, txt=txt, suggestions=suggestions) |
||||
|
|
||||
|
@APP.route('/list/<list_type>/<filename>', methods=['GET', 'POST']) |
||||
|
def render_list_for_document(list_type, filename): |
||||
|
""" |
||||
|
Show list of (TF / IDF / TF-IDF) values of one document. |
||||
|
""" |
||||
|
index = readings.load_index() |
||||
|
suggestions = open('words.txt', 'r').readlines() |
||||
|
filenames = sorted([document for document, _ in index.items()]) |
||||
|
values_list = [(value, word) for word, value in index[filename][list_type].items()] |
||||
|
return flask.render_template('list.html', filenames=filenames, suggestions=suggestions, list=values_list, list_type=list_type, filename=filename) |
||||
|
|
||||
|
@APP.route('/mappings/<mapping_type>', methods=['GET', 'POST']) |
||||
|
def get_contrast_mappings(mapping_type): |
||||
|
""" |
||||
|
Displays the page accessible at '/mappings'. |
||||
|
A TF-IDF visualisation is displayed, |
||||
|
using the TF-IDF values as font-size. |
||||
|
""" |
||||
|
mappings, filenames = readings.request_mappings(mapping_type) |
||||
|
suggestions = open('words.txt', 'r').readlines() |
||||
|
return flask.render_template('mappings.html', filenames=filenames, suggestions=suggestions, mappings=mappings, mapping_type=mapping_type) |
||||
|
|
||||
|
@APP.route('/mapping/<name>', methods=['GET', 'POST']) |
||||
|
def contrast_mappings_name(name): |
||||
|
""" |
||||
|
Displays the page accessible at '/mappings/<name>'. |
||||
|
A TF-IDF visualisation is displayed from the specific document, using the TF-IDF values as font-size. |
||||
|
""" |
||||
|
mappings, filenames = readings.request_mappings_for_document(name) |
||||
|
print(name) |
||||
|
suggestions = open('words.txt', 'r').readlines() |
||||
|
return flask.render_template('mappings.name.html', filenames=filenames, suggestions=suggestions, mappings=mappings[name], document=name) |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
if not 'index.json' in os.listdir('.'): |
||||
|
tfidf.create_index() |
||||
|
APP.debug=True |
||||
|
APP.run() |
@ -0,0 +1,129 @@ |
|||||
|
@font-face{ |
||||
|
font-family: 'unifont'; |
||||
|
src:url('fonts/unifont-11.0.03.ttf'); |
||||
|
} |
||||
|
|
||||
|
body{ |
||||
|
/*background-color: rgba(220,220,220,0.6);*/ |
||||
|
margin:20px; |
||||
|
font-size: 16px; |
||||
|
line-height: 22px; |
||||
|
overflow-x: hidden; |
||||
|
} |
||||
|
h1, h2, h3{ |
||||
|
font-size: 100%; |
||||
|
margin:2em 0 1em 0; |
||||
|
} |
||||
|
hr{ |
||||
|
border:0; |
||||
|
border-bottom:1px dashed black; |
||||
|
clear: both; |
||||
|
margin:2em 0; |
||||
|
} |
||||
|
a, a:active, a:hover{ |
||||
|
color:black; |
||||
|
text-decoration: none; |
||||
|
border-bottom:1px dotted; |
||||
|
padding:0; |
||||
|
margin:0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#nav-wrapper{ |
||||
|
z-index: -1; |
||||
|
} |
||||
|
#nav{ |
||||
|
display: inline-block; |
||||
|
} |
||||
|
#logo{ |
||||
|
margin:0 30px 30px 0; |
||||
|
font-family: monospace,; |
||||
|
font-size: 16px; |
||||
|
line-height: 1.1; |
||||
|
font-weight: normal; |
||||
|
} |
||||
|
#logo a{ |
||||
|
border:0; |
||||
|
} |
||||
|
#search{ |
||||
|
width: 400px; |
||||
|
position: relative; |
||||
|
margin:0 20px 80px 0; |
||||
|
vertical-align: top; |
||||
|
} |
||||
|
#search input#query{ |
||||
|
width: 100%; |
||||
|
height: 30px; |
||||
|
padding:0px 10px; |
||||
|
border:1px solid rgba(190,190,190,1); |
||||
|
} |
||||
|
#search #submit{ |
||||
|
position: absolute; |
||||
|
width: 26px; |
||||
|
height: 26px; |
||||
|
right: -12px; |
||||
|
top:5px; |
||||
|
border:0; |
||||
|
border-radius: 100%; |
||||
|
background-color:transparent; |
||||
|
text-align: center; |
||||
|
} |
||||
|
#search #submit:hover{ |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
#txt-list{ |
||||
|
position: fixed; |
||||
|
width:250px; |
||||
|
right: 0px; |
||||
|
top:-7px; |
||||
|
margin:20px; |
||||
|
font-size: 16px; |
||||
|
line-height: 1.2; |
||||
|
z-index: 3; |
||||
|
} |
||||
|
#txt-list ul{ |
||||
|
margin:0; |
||||
|
padding:0; |
||||
|
} |
||||
|
#txt-list ul li{ |
||||
|
margin:0; |
||||
|
padding:0 0 10px 0; |
||||
|
text-indent: -45px; |
||||
|
list-style: none; |
||||
|
word-break: break-all; |
||||
|
} |
||||
|
a.contrast{ |
||||
|
border: 0; |
||||
|
} |
||||
|
#suggestions{ |
||||
|
position: fixed; |
||||
|
width: 250px; |
||||
|
right: 300px; |
||||
|
top:12px; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
|
||||
|
#wrapper{ |
||||
|
z-index: 1; |
||||
|
width: calc(100% - 650px); |
||||
|
margin:1em 0 2em 0; |
||||
|
} |
||||
|
|
||||
|
#results{ |
||||
|
max-width: 800px; |
||||
|
} |
||||
|
#results h2{ |
||||
|
} |
||||
|
#results .line{ |
||||
|
margin:0.5em 0 1em; |
||||
|
} |
||||
|
#results strong.query{ |
||||
|
width: 100%; |
||||
|
height: 12em; |
||||
|
padding: 2em 6em 2em 6em; |
||||
|
margin:-9.7em -6em -10.5em -6em; |
||||
|
} |
||||
|
|
||||
|
#analytics{ |
||||
|
margin:2em 0; |
||||
|
} |
@ -0,0 +1,67 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang='en'> |
||||
|
<head> |
||||
|
<meta charset="utf-8" /> |
||||
|
<title>Sear%r%r%rch {% block title %}{% endblock %}</title> |
||||
|
<link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='css/stylesheet.css')}}" /> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div id="nav-wrapper"> |
||||
|
<div id="nav">◐ |
||||
|
<!-- <small><a class="contrast" href="/mappings/tf">TF</a></small> --> |
||||
|
<small><a class="contrast" href="/mappings/idf">IDF</a></small> |
||||
|
<small><a class="contrast" href="/mappings/tfidf">TFIDF</a></small> |
||||
|
</div><br><br> |
||||
|
<div id="logo"> |
||||
|
<a href="/"> |
||||
|
%█▀▀ █▀▀█ █▀▀█ █▀▀ █▀▀ ░░ █▀▀█ █▀▀ █▀▀█ █▀▀▄ ░▀░ █▀▀▄ █▀▀▀ █▀▀ <br> |
||||
|
%█░░ █▄▄▀ █░░█ ▀▀█ ▀▀█ ▀▀ █▄▄▀ █▀▀ █▄▄█ █░░█ ▀█▀ █░░█ █░▀█ ▀▀█ <br> |
||||
|
%▀▀▀ ▀░▀▀ ▀▀▀▀ ▀▀▀ ▀▀▀ ░░ ▀░▀▀ ▀▀▀ ▀░░▀ ▀▀▀░ ▀▀▀ ▀░░▀ ▀▀▀▀ ▀▀▀ <br> |
||||
|
<!-- https://fsymbols.com/generators/tarty/ --> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div id="search"> |
||||
|
<form action="" method="GET"> |
||||
|
<input id="query" name="q" value="{{query}}"/> |
||||
|
<input id="submit" type="submit" value="➜"/> |
||||
|
</form> |
||||
|
</div> |
||||
|
<div id="txt-list"> |
||||
|
<p>Sear%r%rching <em>and cross-reading through</em> the following files:</p> |
||||
|
<ul> |
||||
|
{% for txt in filenames|sort %} |
||||
|
{% set name = txt.replace('.txt','') %} |
||||
|
<li> |
||||
|
<a href="/document/{{ name }}">{{ txt.replace('_', ' ') }}</a><br> |
||||
|
<a class="contrast" href="/mapping/{{ name }}">◐</a> |
||||
|
<small><a href="/list/tf/{{ name }}">TF</a> </small> |
||||
|
<small><a href="/list/idf/{{ name }}">IDF</a> </small> |
||||
|
<small><a href="/list/tfidf/{{ name }}">TF-IDF</a></small> |
||||
|
</li> |
||||
|
{% endfor %} |
||||
|
<ul> |
||||
|
</div> |
||||
|
<div id="suggestions"> |
||||
|
<div> |
||||
|
<p>Cross-reading suggestions:</p> |
||||
|
{% for suggestion in suggestions %} |
||||
|
<div><strong><a href="/?q={{ suggestion.strip() }}">{{ suggestion.strip() }}</a></strong></div> |
||||
|
{% endfor %} |
||||
|
</div> |
||||
|
<div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div id="wrapper"> |
||||
|
<div id="content"> |
||||
|
{% block content %} |
||||
|
{% endblock %} |
||||
|
</div> |
||||
|
{% block results %} |
||||
|
{% endblock %} |
||||
|
{% block overlay %} |
||||
|
{% endblock %} |
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,13 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %}{% endblock %} |
||||
|
|
||||
|
{% block txtlist %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block content %} |
||||
|
<div id="document"> |
||||
|
{% for line in txt%} |
||||
|
<p>{{ line }}</p> |
||||
|
{% endfor %} |
||||
|
</div> |
||||
|
{% endblock %} |
@ -0,0 +1,8 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
|
||||
|
{% block results %} |
||||
|
<div id="intro"> |
||||
|
<p>This Sear%r%rch tool only works with <strong>one word</strong>.</p> |
||||
|
|
||||
|
</div> |
||||
|
{% endblock %} |
@ -0,0 +1,14 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %}{% endblock %} |
||||
|
|
||||
|
{% block txtlist %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block content %} |
||||
|
<div id="list"> |
||||
|
<h1>{{ list_type }} * {{ filename | prettyfilename }}</h1> |
||||
|
{% for value, word in list | sort(reverse=True) %} |
||||
|
<div><strong><a href="/?q={{ word}}">{{ word }}</a></strong> <sup>({{ value }})</sup></div> |
||||
|
{% endfor %} |
||||
|
</div> |
||||
|
{% endblock %} |
@ -0,0 +1,22 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %}{% endblock %} |
||||
|
|
||||
|
{% block search %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block results %} |
||||
|
<div id="mappings"> |
||||
|
{% if mapping_type == 'tfidf' %} |
||||
|
{% for value, word in mappings %} |
||||
|
<strong class="query" style="font-size:{{ 100 + value }}%;"> <a href="/?q={{ word }}">{{ word }}</a> </strong> |
||||
|
{% endfor %} |
||||
|
{% else %} |
||||
|
{% for value, word in mappings %} |
||||
|
<strong class="query"> <a href="/?q={{ word }}">{{ word }}</a></strong> ({{ value }})<br> |
||||
|
{% endfor %} |
||||
|
{% endif %} |
||||
|
</div> |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block suggestions %} |
||||
|
{% endblock %} |
@ -0,0 +1,19 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %}{% endblock %} |
||||
|
|
||||
|
{% block search %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block content %} |
||||
|
<h1>{{ document | prettyfilename }}</h1> |
||||
|
{% for sentence in mappings %} |
||||
|
<p class="sentence"> |
||||
|
{% for word in sentence %} |
||||
|
<strong class="query" style="font-size:{{ 100 + word[1] }}%;"> <a href="/?q={{ word[0] }}">{{ word[0] }}</a> </strong> |
||||
|
{% endfor %} |
||||
|
</p> |
||||
|
{% endfor %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block suggestions %} |
||||
|
{% endblock %} |
@ -0,0 +1,17 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %}{% endblock %} |
||||
|
|
||||
|
{% block txtlist %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block results %} |
||||
|
<h1>ordered.all</h1> |
||||
|
<div id="listing_all" class="listings"> |
||||
|
{% for item in results %} |
||||
|
<span class="{{files[item[2]]}}"> |
||||
|
<strong style="font-size:{{item[0] * 50000}}%;"><a href="{{ url_for('index')}}?q={{item[1]}}">{{item[1]}}</a></strong> |
||||
|
</span> |
||||
|
{% endfor %} |
||||
|
<hr> |
||||
|
</div> |
||||
|
{% endblock %} |
@ -0,0 +1,27 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %}{% endblock %} |
||||
|
|
||||
|
{% block txtlist %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block results %} |
||||
|
<h1>lists</h1> |
||||
|
<div id="listing_per_manifesto" class="listings"> |
||||
|
{% for manifesto, words in results.items()|sort %} |
||||
|
<span class="result"> |
||||
|
<div class="ascii"> |
||||
|
/\|\/\<br> |
||||
|
_) (__<br> |
||||
|
\_ _/ <br> |
||||
|
) \ <br> |
||||
|
\/\|\/ |
||||
|
</div> |
||||
|
<h2>{{manifesto}}</h2> |
||||
|
{% for value, word in words %} |
||||
|
<strong style="font-size:{{value * 50000}}%;"><a href="{{ url_for('index')}}?q={{word}}">{{word}}</a></strong> |
||||
|
{% endfor %} |
||||
|
</span> |
||||
|
{% endfor %} |
||||
|
<hr> |
||||
|
</div> |
||||
|
{% endblock %} |
@ -0,0 +1,50 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %}{{query}}{% endblock %} |
||||
|
|
||||
|
{% block txtlist %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block results %} |
||||
|
<h1>The results for the query "{{query}}" are:</h1> |
||||
|
|
||||
|
<div id="results"> |
||||
|
{% if results == {} %} |
||||
|
<div>That word is not used in any of the files.</div> |
||||
|
{% else %} |
||||
|
{% for _, document in results.items() %} |
||||
|
{% for line in document.html %} |
||||
|
<div class="result"> |
||||
|
<!-- <div class="ascii"> |
||||
|
✄█▀▀ █▀▀█ █░░ █░░ <br> |
||||
|
✄█░░ █▄▄█ █░░ █░░ <br> |
||||
|
✄▀▀▀ ▀░░▀ ▀▀▀ ▀▀▀ <br> |
||||
|
</div> --> |
||||
|
{% set name = document.filename.replace('.txt', '') %} |
||||
|
<h2><a href="/document/{{ name }}">{{ document.name }}</a></h2> |
||||
|
<div class="line">{{ line }}</div> |
||||
|
</div> |
||||
|
{% endfor %} |
||||
|
{% endfor %} |
||||
|
{% endif %} |
||||
|
</div> |
||||
|
|
||||
|
{% if analytics %} |
||||
|
<hr> |
||||
|
<div id="analytics"> |
||||
|
<!-- <h1>ANALYTICS</h1> --> |
||||
|
|
||||
|
{% if analytics.stemmer %} |
||||
|
<div id="similars" class="analytics stemmer"> |
||||
|
<h2>Similar but not the same to <em>{{ query }}</em>:</h2> |
||||
|
{% for word in analytics.stemmer %} |
||||
|
<strong class="word"><a href="?q={{ word }}">{{ word }}</a></strong> |
||||
|
{% endfor%} |
||||
|
</div> |
||||
|
{% else %} |
||||
|
<div>None</div> |
||||
|
{% endif%} |
||||
|
|
||||
|
</div> |
||||
|
{% endif%} |
||||
|
|
||||
|
{% endblock %} |
@ -0,0 +1,27 @@ |
|||||
|
{% extends "base.html" %} |
||||
|
{% block title %}{{query}}{% endblock %} |
||||
|
|
||||
|
{% block txtlist %} |
||||
|
<div id="more-descr">[<span class="asterix">*</span>] The algorithm is asked to not return more than 3 sentences from the same manifesto. There are more sentences that match this search query!</div> |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block results %} |
||||
|
<h1>The results for the query "{{query}}" are:</h1> |
||||
|
<div id="results" class="lists"> |
||||
|
{% if results == {} %} |
||||
|
<div>That word is not used in any of the manifesto's.</div> |
||||
|
{% else %} |
||||
|
{% for _, manifesto in results.items() %} |
||||
|
<span class="result"> |
||||
|
<h2 class="title">{{manifesto.name}}</h2> |
||||
|
<span class="list"> |
||||
|
{% for i in range(manifesto.tf) %} |
||||
|
<strong style="font-size:{{manifesto.tfidf * 10000}}px;">{{query}}</strong> |
||||
|
{% endfor %} |
||||
|
</span> |
||||
|
</span> |
||||
|
{% endfor %} |
||||
|
<hr> |
||||
|
{% endif %} |
||||
|
</div> |
||||
|
{% endblock %} |
@ -0,0 +1,115 @@ |
|||||
|
import os, json, re |
||||
|
from math import log, exp |
||||
|
|
||||
|
import nltk |
||||
|
from nltk import sent_tokenize |
||||
|
from nltk.tokenize import RegexpTokenizer |
||||
|
tokenizer = RegexpTokenizer(r'\w+') # initialize tokenizer |
||||
|
|
||||
|
import pprint |
||||
|
pp = pprint.PrettyPrinter(indent=4) |
||||
|
|
||||
|
def tfidf(query, words, corpus): |
||||
|
# Term Frequency |
||||
|
tf_count = 0 |
||||
|
for word in words: |
||||
|
if query == word: |
||||
|
tf_count += 1 |
||||
|
tf = tf_count/len(words) |
||||
|
# print('TF count:', tf_count) |
||||
|
# print('Total number of words:', len(words)) |
||||
|
# print('TF - count/total', tf_count/len(words)) |
||||
|
|
||||
|
# Inverse Document Frequency |
||||
|
idf_count = 0 |
||||
|
for words in corpus: |
||||
|
if query in words: |
||||
|
idf_count += 1 |
||||
|
# print('count:', idf_count) |
||||
|
idf = log(len(corpus)/idf_count) |
||||
|
# print('Total number of documents:', len(corpus)) |
||||
|
# print('documents/count', len(corpus)/idf_count) |
||||
|
# print('IDF - log(documents/count)', log(len(corpus)/idf_count)) |
||||
|
|
||||
|
tfidf_value = tf * idf |
||||
|
# print('TF-IDF:', tfidf_value) |
||||
|
|
||||
|
return tf_count, idf_count, tfidf_value |
||||
|
|
||||
|
def get_language(document): |
||||
|
language = re.search(r'\[.*\]', document, flags=re.IGNORECASE).group().replace('[','').replace(']','').lower() |
||||
|
return language |
||||
|
|
||||
|
def load_text_files(): |
||||
|
files = [] |
||||
|
corpus = [] |
||||
|
sentences = {} |
||||
|
wordlists = {} |
||||
|
dir = 'txt' |
||||
|
|
||||
|
for document in sorted(os.listdir(dir)): |
||||
|
document = document.replace('.txt','') |
||||
|
# print('document:', document) |
||||
|
lines = open('{}/{}.txt'.format(dir, document), "r").read() # list of lines in .txt file |
||||
|
lines = lines.replace(' •', '. ') # turn custom linebreaks into full-stops to let the tokenizer recognize them as end-of-lines |
||||
|
words = [word.lower() for word in tokenizer.tokenize(lines)] # all words of one document, in reading order + lowercased! (!important) |
||||
|
wordlists[document] = words |
||||
|
corpus.append(words) |
||||
|
s = sent_tokenize(lines) |
||||
|
sentences[document] = s |
||||
|
files.append(document) # list of filenames |
||||
|
|
||||
|
print('*txt files loaded*') |
||||
|
return files, corpus, sentences, wordlists |
||||
|
|
||||
|
def make_human_readable_name(document): |
||||
|
name = document.replace('_', ' ').replace('-', ' ') |
||||
|
return name |
||||
|
|
||||
|
def create_index(): |
||||
|
files, corpus, sentences, wordlists = load_text_files() |
||||
|
index = {} |
||||
|
|
||||
|
# index = { |
||||
|
# Fem document : { |
||||
|
# 'tfidf' : { |
||||
|
# 'aap': 39.2, |
||||
|
# 'beer': 20.456, |
||||
|
# 'citroen': 3.21 |
||||
|
# }, |
||||
|
# 'tf' : { |
||||
|
# 'aap': 4, |
||||
|
# 'beer': 6, |
||||
|
# 'citroen': 2 |
||||
|
# }, |
||||
|
# 'name': 'Feminist document (2000)', |
||||
|
# 'language': 'en' |
||||
|
# } |
||||
|
# } |
||||
|
|
||||
|
for document in files: |
||||
|
print('---------') |
||||
|
print('document:', document) |
||||
|
index[document] = {} |
||||
|
index[document]['sentences'] = sentences[document] |
||||
|
words = wordlists[document] |
||||
|
for word in words: |
||||
|
tf_count, idf_count, tfidf_value = tfidf(word, words, corpus) |
||||
|
if 'tf' not in index[document]: |
||||
|
index[document]['tf'] = {} |
||||
|
index[document]['tf'][word] = tf_count |
||||
|
if 'idf' not in index[document]: |
||||
|
index[document]['idf'] = {} |
||||
|
index[document]['idf'][word] = idf_count |
||||
|
if 'tfidf' not in index[document]: |
||||
|
index[document]['tfidf'] = {} |
||||
|
index[document]['tfidf'][word] = tfidf_value |
||||
|
|
||||
|
index[document]['name'] = make_human_readable_name(document) |
||||
|
|
||||
|
with open('index.json','w+') as out: |
||||
|
out.write(json.dumps(index, indent=4, sort_keys=True)) |
||||
|
out.close() |
||||
|
print('*index created*') |
||||
|
|
||||
|
# create_index() |
@ -0,0 +1,9 @@ |
|||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet scelerisque eleifend. Duis mollis fermentum metus eget luctus. Sed et lectus nulla. Mauris vel dignissim lorem, a mattis nisi. Proin fermentum rhoncus mauris, vitae sodales metus. Vivamus dolor neque, suscipit et justo quis, malesuada lacinia mi. Nulla sapien libero, bibendum at gravida vestibulum, dictum elementum ligula. In sit amet finibus metus. Ut tincidunt leo eget erat dictum euismod. Fusce feugiat erat a nunc condimentum, at fermentum neque semper. Ut tempor interdum dui, sit amet faucibus ante lacinia sed. Aenean at pretium velit. |
||||
|
|
||||
|
Nunc semper aliquet mattis. Proin gravida turpis non dui sagittis iaculis. Etiam consectetur rhoncus rutrum. Quisque nec fermentum massa, venenatis rutrum eros. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc convallis nisi vel ante vehicula, vitae consectetur felis luctus. Praesent non rutrum arcu, quis porttitor risus. Praesent rhoncus pulvinar iaculis. Curabitur odio augue, rutrum eget odio vel, ullamcorper facilisis arcu. Pellentesque feugiat dolor nec turpis rhoncus semper. Curabitur est odio, molestie eu nulla sit amet, porttitor gravida purus. |
||||
|
|
||||
|
Cras nec elementum est, et condimentum urna. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras sodales nisi risus, et tempor est pretium eu. Suspendisse volutpat dictum libero, et sollicitudin magna pellentesque eu. Donec finibus malesuada finibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nunc lorem turpis, rutrum et nunc consectetur, interdum auctor nisl. Maecenas et arcu urna. Cras pretium elementum fermentum. Aliquam erat velit, interdum non odio eget, rutrum vestibulum erat. Sed nec nulla ac urna volutpat mollis. Donec eget malesuada dui, eget cursus risus. Ut rutrum magna porta, scelerisque leo sit amet, vestibulum enim. Nam vehicula ante non cursus faucibus. Phasellus egestas pulvinar sollicitudin. |
||||
|
|
||||
|
Vivamus vitae ultricies est. Mauris sit amet pharetra diam, eu pharetra nisi. Sed finibus quam id risus fermentum, nec dictum arcu volutpat. Etiam venenatis non ipsum ac viverra. Maecenas volutpat nulla non nibh ultricies vestibulum. Nunc ornare tincidunt gravida. Sed ultrices finibus venenatis. Suspendisse potenti. Duis scelerisque ultricies ex id tristique. In hac habitasse platea dictumst. Nam aliquam vulputate accumsan. Proin erat tortor, consequat sed metus id, cursus bibendum justo. Sed hendrerit, libero aliquet porta suscipit, erat erat rhoncus libero, eu aliquam odio nisi in est. |
||||
|
|
||||
|
Donec enim massa, pellentesque in urna sed, viverra sagittis justo. In hac habitasse platea dictumst. Aliquam erat volutpat. Pellentesque hendrerit viverra magna, ut eleifend risus euismod eu. Suspendisse vestibulum malesuada ipsum, scelerisque hendrerit lorem malesuada id. Praesent euismod efficitur dolor quis convallis. Vestibulum at leo non nisl ultrices gravida a id tellus. Fusce et placerat ligula, vel cursus dolor. Cras eget ante a lacus tristique rutrum. In hac habitasse platea dictumst. Integer commodo venenatis libero quis ultricies. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec et eros felis. Nullam dictum tellus tincidunt, aliquet urna id, rhoncus nisi. Phasellus nec tellus purus. Aliquam lobortis sapien sollicitudin porttitor ullamcorper. |
@ -0,0 +1,19 @@ |
|||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut posuere augue est, luctus sodales nibh tempus in. Vestibulum nec massa aliquam, facilisis sapien mattis, porta nisi. Suspendisse id fermentum elit, nec tristique eros. Sed convallis gravida tellus sed rhoncus. Pellentesque auctor, ipsum nec rutrum laoreet, nibh mi euismod augue, vitae cursus libero tortor vitae nisl. Pellentesque a lectus a justo varius auctor. Cras nisi nibh, pretium porttitor erat a, ullamcorper semper diam. Phasellus et ex vitae nisl sagittis euismod. Sed dapibus lacus nec magna dapibus, eu fringilla purus pellentesque. Ut vitae nibh diam. Quisque blandit, nunc eu laoreet finibus, turpis tellus rhoncus orci, nec mollis nisl dolor vitae eros. Maecenas mi mi, aliquam congue massa fermentum, maximus pretium nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc ultrices enim urna. |
||||
|
|
||||
|
Nullam ut enim non ipsum pellentesque pulvinar. Nullam lacinia nisi ex, ac tincidunt orci bibendum nec. Etiam facilisis euismod vehicula. Pellentesque semper, erat efficitur ultricies ultrices, elit urna convallis eros, at tempor eros sapien a ex. Cras dapibus blandit justo id porttitor. Sed facilisis lacus finibus semper placerat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lorem turpis, dictum non elementum non, finibus quis eros. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam non sem sit amet lacus iaculis tincidunt. Vestibulum viverra ac est vitae suscipit. Nam quis dui sed augue volutpat scelerisque sit amet nec tellus. Donec venenatis condimentum sagittis. Quisque molestie tempor turpis. |
||||
|
|
||||
|
Donec tempus magna sit amet lacus vulputate viverra. Sed vel quam congue eros dignissim lobortis. Aenean facilisis ut dolor sed ultricies. Cras auctor dolor ac dui semper, vitae maximus purus bibendum. Suspendisse eleifend imperdiet mauris et convallis. In nec volutpat risus, at placerat lectus. Vivamus vehicula dolor nec lacus dignissim euismod. Vivamus gravida felis non sollicitudin accumsan. Quisque vitae posuere orci. Proin dapibus faucibus arcu quis lacinia. Nulla facilisi. Proin ut nibh velit. Vestibulum quis tempor odio, quis cursus erat. Praesent ex metus, interdum ut tincidunt non, scelerisque tincidunt arcu. Quisque ac molestie mi, et euismod erat. Vestibulum lectus nisl, vulputate eget ex vitae, mollis feugiat eros. |
||||
|
|
||||
|
Praesent ullamcorper dui eget mauris dignissim pretium. Donec consectetur purus ac felis congue, et euismod nulla pretium. Quisque eu erat justo. Suspendisse imperdiet hendrerit vestibulum. Sed vulputate, velit sit amet pharetra condimentum, enim massa blandit quam, sed lobortis ipsum nibh posuere nisi. Proin porta nisl at augue finibus, ac tincidunt sapien lacinia. Curabitur iaculis eu erat sed hendrerit. Integer pharetra enim eros, ac ullamcorper nunc viverra tempor. Morbi leo tortor, porta nec tellus sit amet, sagittis accumsan ex. Ut rhoncus, velit id porta mattis, dolor lacus sagittis nulla, at suscipit lacus ex sit amet leo. Aliquam sit amet lacinia urna, et facilisis purus. |
||||
|
|
||||
|
Pellentesque euismod tellus molestie, pulvinar arcu id, consequat ipsum. In pharetra faucibus libero, fermentum posuere nisl. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque at dolor in ex commodo efficitur. Aliquam interdum in metus at scelerisque. Phasellus rutrum justo et justo molestie dapibus. Suspendisse ac diam blandit, porta ex ut, lobortis est. Fusce dictum efficitur convallis. Mauris justo velit, scelerisque nec laoreet quis, placerat et felis. Duis eu quam risus. Praesent mollis eros in magna sollicitudin porta. Donec vitae odio ipsum. Suspendisse potenti. Nunc id libero consequat, euismod lacus sed, ornare lorem. Praesent scelerisque eu quam a vestibulum. Nullam sodales tincidunt leo, vel malesuada elit commodo id. |
||||
|
|
||||
|
Donec eu augue maximus leo iaculis varius eu vitae quam. Praesent maximus, felis eget congue elementum, neque turpis interdum ex, nec hendrerit odio sem a arcu. Quisque iaculis rutrum mauris ut faucibus. Pellentesque fermentum dolor sed eros volutpat, ullamcorper porta metus ornare. Duis sollicitudin blandit dui, et iaculis libero mollis congue. Morbi dapibus tortor tortor, eget eleifend lacus malesuada id. Sed at lorem ante. Maecenas a semper purus. Duis eget nibh neque. Donec consequat libero eros, id posuere odio fermentum vel. Aliquam nec varius magna. |
||||
|
|
||||
|
Phasellus nec volutpat turpis. Phasellus elit neque, tincidunt eu vehicula sit amet, vestibulum at nisi. Suspendisse vitae ultricies quam. Pellentesque sagittis sollicitudin arcu sed sollicitudin. Mauris vehicula erat risus, tempus consectetur mi scelerisque et. Cras et tortor ut mauris vehicula porttitor eu at eros. Vivamus porta, enim nec pretium elementum, diam nunc scelerisque risus, eget blandit libero augue ut diam. Vivamus eget lorem eget lectus dignissim consectetur id nec mi. Integer volutpat pulvinar dictum. Aliquam purus nisl, blandit sed ligula ut, interdum cursus odio. |
||||
|
|
||||
|
Cras congue lacinia nisi, quis eleifend massa placerat mollis. Sed in mi eros. Praesent semper ultricies velit in ultricies. Mauris tristique varius turpis vel placerat. Nam vulputate sit amet ligula nec commodo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed rhoncus massa in luctus interdum. Mauris et justo ac eros blandit mattis. |
||||
|
|
||||
|
Donec ante sem, malesuada elementum ex at, tempus mollis sem. Aenean ac venenatis tellus. Phasellus vestibulum mi nec elit sollicitudin aliquet. Donec sed justo erat. Nunc scelerisque lectus vitae placerat pretium. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque semper interdum laoreet. Donec facilisis, orci ut semper sodales, augue ipsum iaculis mi, eu tempor ligula libero dictum enim. Mauris non ultricies leo, eget ullamcorper dui. Fusce ante purus, pellentesque in tristique in, ornare ut massa. Vestibulum tempus ipsum sed fringilla rutrum. |
||||
|
|
||||
|
Praesent ultrices posuere sem eu fringilla. Nulla efficitur magna nunc, sit amet imperdiet ante tempor non. In vitae aliquam neque. Nunc leo tortor, volutpat et mi ut, convallis pretium nunc. Fusce quis tortor tincidunt, viverra arcu sed, feugiat ex. Vestibulum sed tortor elementum, sollicitudin leo id, rutrum diam. Aenean eget nisi sagittis, commodo leo eget, egestas libero. Aliquam convallis risus nunc, nec blandit mi lacinia non. Nunc venenatis tellus ac leo accumsan dignissim. Donec molestie eleifend aliquet. Nunc ullamcorper ligula neque, nec sagittis erat luctus in. Integer eu erat id ante congue vehicula. In in dictum diam, ut tincidunt urna. Morbi nec lectus vitae lorem vehicula tristique vitae ac ipsum. |
@ -0,0 +1,29 @@ |
|||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu consequat dolor. Vestibulum tempus risus vitae massa hendrerit, a fermentum quam lacinia. Fusce laoreet ultricies ornare. Cras ultricies quis tellus ac ullamcorper. Pellentesque congue vehicula nunc et sodales. In tincidunt porttitor justo quis convallis. Vestibulum sed turpis sed tellus varius placerat. Phasellus consectetur libero id feugiat pretium. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus sed lorem et ligula tempus dapibus. Donec eu sollicitudin justo, sed ornare nibh. In hac habitasse platea dictumst. Fusce dictum eget odio quis rhoncus. Curabitur posuere arcu quis mi molestie, a mattis est viverra. |
||||
|
|
||||
|
Suspendisse euismod fermentum maximus. Quisque in diam sed leo pretium dapibus eget aliquet augue. Aenean rhoncus sed purus auctor sagittis. Nulla eget feugiat arcu. Nam accumsan, leo in scelerisque facilisis, tortor lectus sagittis orci, a dictum eros diam vestibulum odio. Suspendisse aliquet mi eget arcu dictum euismod. Aliquam imperdiet odio iaculis mollis interdum. Nam sed dictum augue. Nulla sagittis arcu at libero porttitor bibendum porta ac nunc. Nam ut urna laoreet turpis vehicula finibus rhoncus ut erat. Etiam at justo vehicula ante feugiat porttitor non eget mauris. Nunc tincidunt fringilla mollis. Aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus accumsan accumsan diam et pharetra. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. |
||||
|
|
||||
|
Nulla pellentesque gravida ex id porta. Nam vitae consequat eros, facilisis venenatis erat. Nunc quis venenatis dolor. Maecenas commodo gravida egestas. Vestibulum ut orci finibus, aliquam metus molestie, maximus enim. Praesent at augue ut nulla mattis aliquet. Integer fringilla dignissim elit non lacinia. Pellentesque scelerisque nec felis sit amet malesuada. |
||||
|
|
||||
|
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec efficitur hendrerit urna, pulvinar finibus eros efficitur in. Phasellus finibus ipsum est, vel tempor nisi sollicitudin vitae. Morbi vitae est et arcu vulputate semper. Nam a finibus tortor, sit amet cursus arcu. Aenean congue, risus eu tristique elementum, magna augue tristique diam, non imperdiet ipsum erat nec est. Integer venenatis augue sit amet eleifend elementum. Donec rhoncus metus eget suscipit vulputate. Duis euismod risus ut justo gravida, nec ultrices nisl placerat. Aliquam elementum feugiat mollis. Vestibulum lobortis mattis tortor eget ullamcorper. Mauris congue, urna non auctor finibus, leo enim ultrices nibh, nec dignissim dui lorem euismod nibh. |
||||
|
|
||||
|
Phasellus suscipit semper posuere. Donec luctus eros turpis, vel ultricies tortor fringilla vel. Vestibulum venenatis pulvinar nibh vel cursus. Curabitur congue molestie urna, at sagittis lorem imperdiet eu. Fusce in purus et est tincidunt sollicitudin eu nec risus. Suspendisse tempus eros ante, in feugiat nibh sodales ac. Curabitur commodo mi at leo aliquet tempus. |
||||
|
|
||||
|
Phasellus blandit varius nunc, sit amet consequat ipsum vulputate in. Nam eget sem dictum, rhoncus turpis a, condimentum mi. Nulla et fermentum libero, sed suscipit justo. Nunc ac felis sem. Maecenas a metus risus. Morbi porta tincidunt ex at cursus. Suspendisse tristique arcu nec lorem elementum, quis faucibus dolor sodales. Praesent porta congue auctor. Vivamus eu iaculis arcu, nec ultrices erat. Cras sodales facilisis metus in laoreet. Proin a magna ligula. Nunc bibendum tincidunt hendrerit. Aliquam erat volutpat. Cras auctor facilisis tincidunt. Maecenas eu sollicitudin massa. Nunc consectetur leo fringilla, tristique lorem vitae, lobortis dui. |
||||
|
|
||||
|
Nunc lobortis tempor blandit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut et consectetur libero. Morbi dapibus metus quis lectus laoreet, id commodo nulla tempor. Aenean nibh ante, ornare sit amet vehicula a, gravida ac quam. Nam ornare orci ac vulputate condimentum. Suspendisse pulvinar vestibulum mi, in dignissim lorem feugiat et. Curabitur non nulla interdum, cursus sem vitae, viverra diam. Ut porta orci id nunc convallis, vel lobortis erat fringilla. In bibendum iaculis auctor. Duis eget euismod lacus, in congue enim. |
||||
|
|
||||
|
Curabitur lobortis vestibulum risus in dignissim. Nunc id convallis quam, et porttitor lorem. Vestibulum in posuere tortor, vel posuere mi. Proin ultricies lacus vitae maximus commodo. Pellentesque viverra nisl non eleifend fermentum. Suspendisse leo leo, fermentum vitae convallis accumsan, consectetur at nibh. Fusce eu ante elit. Curabitur dignissim ut enim vel pellentesque. Sed turpis purus, porta in tortor non, tempor tincidunt ipsum. |
||||
|
|
||||
|
Mauris non interdum sapien. Ut sollicitudin eget lorem ultrices vestibulum. Integer et fermentum urna, vitae molestie magna. In sit amet fermentum orci. Pellentesque ultrices volutpat lorem a congue. Phasellus non quam vel magna sodales aliquet non eu ligula. Aenean risus purus, tincidunt id mattis sed, interdum et urna. Nunc in sem aliquam enim hendrerit euismod. Praesent dictum enim non felis consectetur vehicula. Suspendisse aliquam condimentum tempus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec et mauris nulla. Quisque dignissim, elit ut convallis laoreet, felis metus luctus lectus, sed feugiat nibh purus non leo. Cras laoreet tempor dictum. Quisque vitae magna eget velit rutrum sodales. Quisque vestibulum dui metus, a mollis enim cursus vel. |
||||
|
|
||||
|
Nam at hendrerit est. Nulla eleifend odio at lacus mattis, quis feugiat urna euismod. Morbi eget nunc sed eros accumsan cursus sed eget ex. Maecenas sagittis pulvinar diam quis cursus. Nullam vel rhoncus metus. Morbi at tortor feugiat, sollicitudin urna ut, sollicitudin risus. Nullam nulla velit, pellentesque eu lectus vel, sagittis laoreet ligula. Proin luctus ac libero luctus imperdiet. Sed ullamcorper, est vel tincidunt tempor, eros tortor interdum odio, at blandit turpis ligula ut tortor. Cras bibendum dignissim urna, sit amet gravida dolor commodo porta. Suspendisse fermentum metus gravida est tincidunt, vel tempus leo condimentum. |
||||
|
|
||||
|
Nam vel nulla nibh. Pellentesque ac tristique dolor. Aenean malesuada tortor interdum consequat dictum. Donec tempor turpis eget lorem consequat, sed porttitor sapien scelerisque. Curabitur vel nulla fermentum, viverra dolor ut, dictum erat. Nunc mauris ante, varius sit amet turpis ut, bibendum tempor erat. Maecenas gravida gravida leo sed rutrum. Pellentesque vulputate lacinia odio, sit amet pulvinar ligula dictum id. |
||||
|
|
||||
|
Proin magna ipsum, posuere ac dictum eget, feugiat a justo. Donec fringilla blandit enim sed pulvinar. Curabitur ut lacus eget enim molestie accumsan viverra sit amet mauris. Praesent in ultricies nulla. Morbi euismod tincidunt aliquam. Sed nec magna finibus, faucibus leo id, laoreet ligula. Cras aliquam ultricies mattis. |
||||
|
|
||||
|
Donec vitae magna vehicula, scelerisque lorem vitae, dignissim lectus. Suspendisse ultrices nisl non mollis tempor. Pellentesque risus lectus, aliquam vitae urna sit amet, dictum consectetur nunc. Nunc tortor eros, hendrerit quis ornare eu, cursus non ante. Cras consequat tortor lectus, mollis interdum urna ullamcorper id. Donec malesuada lobortis vestibulum. Ut eleifend sem malesuada elit luctus placerat. Integer tristique lacus et enim blandit, nec volutpat tortor iaculis. Proin erat turpis, hendrerit a aliquam a, scelerisque dapibus leo. Sed elementum augue magna, nec finibus elit aliquam sed. Vestibulum eleifend lacus tortor, eget posuere risus volutpat consequat. Phasellus pulvinar, erat vel fringilla dapibus, mauris ex eleifend mauris, eu facilisis felis dui non nibh. Curabitur et volutpat elit. |
||||
|
|
||||
|
Curabitur lobortis, lectus tristique suscipit lobortis, ligula sem lacinia diam, quis lacinia leo ante aliquam purus. Integer consectetur ornare auctor. Vivamus nec nibh id augue mollis congue et et ante. Mauris dignissim a velit eu malesuada. Vivamus sit amet sodales purus. Mauris eget vehicula lorem. Nunc pulvinar ante faucibus tristique sagittis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis lectus nisl, tincidunt eu diam at, egestas congue libero. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean et nunc sollicitudin, elementum mauris lacinia, imperdiet magna. |
||||
|
|
||||
|
Cras purus nisi, interdum a ante laoreet, commodo fermentum quam. Nunc ut ante scelerisque, porta purus at, placerat turpis. Pellentesque sit amet turpis orci. Duis non lacinia lorem. Donec tempor eros eu augue volutpat consequat. Aenean non tempus erat. Suspendisse congue, enim aliquet scelerisque venenatis, mi lectus sollicitudin massa, nec placerat mi diam lacinia ipsum. In pulvinar ornare enim non ultricies. Interdum et malesuada fames ac ante ipsum primis in faucibus. |
@ -0,0 +1,2 @@ |
|||||
|
lorum |
||||
|
ipsum |
Loading…
Reference in new issue