diff --git a/Dockerfile b/Dockerfile index 28eb917..e7f0578 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM python:2.7-slim LABEL maintainer "Kyrylo Malakhov and Vitalii Velychko " -LABEL description "ken (konspekt English) is a natural language processing API service for contextual and semantic analysis with document taxonomy building feature (python:2.7-slim + Nginx + uWSGI + Flask)" +LABEL description "KEn (konspekt English) is a natural language processing API service for contextual and semantic analysis with document taxonomy building feature (python:2.7-slim + Nginx + uWSGI + Flask)" COPY . /srv/ken WORKDIR /srv/ken diff --git a/README.md b/README.md index 38d217b..35bc2f5 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,6 @@ Or clone from the specific branch/tag of git repository: ```bash git clone --depth=1 --branch= -git clone --depth=1 --branch=develop https://malakhovks:ae9c2fa2d73fbbb0bd0a5ffa746f1df59036815c@github.com/malakhovks/ken.git ``` Checkout the branch you want to use: @@ -195,8 +194,9 @@ docker run --restart always --name ken -d -p 80:80 malakhovks/ken - **[Архітектура мережевого засобу KEn](#architecture-ua)** - **[Компіляція, збірка та розгортання мережевого засобу KEn (з приватного репозиторію) в середовищі UNIX-подібних операційних систем Linux](#unix-deployment-ua)** - **[Компіляція, збірка та розгортання мережевого засобу KEn (з приватного репозиторію) в середовищі програми віртуалізації для операційних систем VirtualBox](#virtualbox-deployment-ua)** -- **[Компіляція, збірка та розгортання мережевого засобу KEn (з приватного репозиторію) в середовищі операційної системи Windows 10 та вище](#windows-deployment-ua)** -- **[Розгортання мережевого засобу KEn з готового docker-образа](#docker-image-deployment-ua)** + +- **[Розгортання мережевого засобу KEn з готового docker-образа (в середовищі операційних систем Linux та Windows)](#docker-image-deployment-ua)** - **[Опис служб (веб-сервісів) мережевого засобу KEn доступних розробнику](#api-ua)** - **[Корисні посилання](#references-ua)** @@ -475,14 +475,14 @@ $ docker build . -t ```bash $ docker build . -t ken_image ``` -Створення ізольованого застосунку `ken_image` може зайняти тривалий час в жалежності від потужностей апаратного забезпечення. +Створення ізольованого застосунку `ken_image` може зайняти тривалий час в залежності від потужностей апаратного забезпечення. Повна документація по командам `Docker` доступна за посиланням [Docker documentation](https://docs.docker.com). 5. Запуск створеного ізольованого застосунку `ken_image` в контейнері `ken`: ```bash $ docker run --restart always --name ken -d -p 80:80 ken_image ``` -Команда `docker run` з параметром `--restart always` дозволяє автоматично перезапускати при перезавантаженні операцийноъ системы, що дозволяє досягти безперебійної роботи сервісу. +Команда `docker run` з параметром `--restart always` дозволяє автоматично перезапускати при перезавантаженні операційної системи, що дозволяє досягти безперебійної роботи сервісу. #### Основні команди керування [Docker](https://docs.docker.com)-контейнером: @@ -654,20 +654,9 @@ $ docker run --restart always --name ken -d -p 80:80 ken_image ------- - -## Компіляція, збірка та розгортання мережевого засобу KEn ([з приватного репозиторію](https://github.com/malakhovks/ken)) в середовищі операційної системй Windows 10 та вище - -*Настанови цього етапу в розробці.* - - - -#### Системні вимоги - -------- - -## Розгортання мережевого засобу KEn з готового docker-образа +## Розгортання мережевого засобу KEn з готового docker-образа (в середовищі операційних систем Linux та Windows) @@ -847,7 +836,7 @@ fetch("file", 'host[:port]/ken/api/v1.0/en/file/allterms', { - елемент `tname` - лема терміну (для багатослівних термінів - це правильна форма); - елемент `wcount` - кількість слів в терміні; - елемент `osn` - основа для кожного слова з терміну; -- елемент `sentpos` - позиція терміну в тексті, подається у вигляді строки формату `2/10` (в даному випадку означає, що термін знаходиться у 2-му реченні на 10 позиції; +- елемент `sentpos` - позиція терміну в тексті, подається у вигляді строки формату `2/10` (в даному випадку означає, що термін знаходиться у 2-му реченні на 10 позиції); - елементи `relup` та `reldown` - відображають зв'язки до інших термінів; - елементи `sentences` - містить масив елементів `sent`, який містить речення з тексту. Порядок речень в елементі `sentences` відповідаю порядку речень у вхідному тексті. @@ -926,6 +915,139 @@ fetch("file", 'host[:port]/ken/api/v1.0/en/file/parcexml', { ``` +Елемент `text` містить послідовність елементів `sentence`, що описує речення та їх параметри згідно лінгвістичної обробки опрацьованого тексту, зокрема, синтаксичний аналіз речень, граматичний аналіз речень та морфологічний аналіз речень. + +Параметри речень описуються наступними елементами: + +- елемент `sentnumber` - позиція речення в тексті, подається у вигляді строки формату `1` (в даному випадку означає, що речення знаходиться на 1 позиції в тексті); +- елемент `sent` - містить оригінальне речення, що обробляється; +- елемент `ner` - містить послідовність елементів `entity`, що описує розпізнані іменовані сутності: + - елемент `entitytext` - лема іменованої сутності; + - елемент `label` - мітка іменованої сутності, що визначає її категорію згідно [списку анотацій бібліотеки spaCy](https://spacy.io/api/annotation#named-entities); + - елемент `startentityposcharacter` - позиція першого символу іменованої сутності (токенізація на рівні символів), подається у вигляді строки формату `51` (в даному випадку означає, що перший символ іменованої сутності знаходиться на 51 позиції в реченні); + - елемент `endentityposcharacter` - позиція останнього символу іменованої сутності (токенізація на рівні символів), подається у вигляді строки формату `81` (в даному випадку означає, що останній символ іменованої сутності знаходиться на 81 позиції в реченні); + - елемент `startentitypostoken` - позиція першого токену (першого слова) іменованої сутності (токенізація на рівні слів), подається у вигляді строки формату `11` (в даному випадку означає, що позиція першого токену (першого слова) іменованої сутності в реченні - 11); + - елемент `endentitypostoken` - позиція останнього токену (останнього слова) іменованої сутності (токенізація на рівні слів), подається у вигляді строки формату `15` (в даному випадку означає, що позиція останнього токену (останнього слова) іменованої сутності в реченні - 15); +- елемент `item` - містить набір елементів, що описуть лінгвістичні параметри слів речення: + - елемент `word` - містить слово в оригінальній формі; + - елемент `lemma` - лема слова; + - елемент `number` - позиція слова (токенізація на рівні слів), подається у вигляді строки формату `1` (в даному випадку означає, що позиція слова в реченні - 1); + - елемент `speech` - мітка, що визначає частину мови слова, згідно списку анотацій бібліотеки Конспект; + - елемент `pos` - позиція першого символу слова (токенізація на рівні символів), подається у вигляді строки формату `7` (в даному випадку означає, що перший символ слова знаходиться на 7 позиції в реченні); + - елемент `rel_type` - синтаксична залежність слова згідно [списку анотацій бібліотеки spaCy](https://spacy.io/api/annotation#dependency-parsing); + - елемент `relate` - позиція слова (токенізація на рівні слів) до якого є синтаксична залежність, подається у вигляді строки формату `9` (в даному випадку означає, що позиція слова вреченні до якого є синтаксична залежність - 1). + +#### **S4** - служба візуалізації іменованих сутностей тексту + +##### Опис вхідних даних + +Вхідними даними є текстові дані (зокрема JSON-масив речень у вигляді JSON-строки) англійською мовою. + +Приклад вхідних даних для служба візуалізації іменованих сутностей тексту: + +```json +[ + "After the vision of the Semantic Web was broadcasted at the turn of the millennium, ontology became a synonym for the solution to many problems concerning the fact that computers do not understand human language: if there were an ontology and every document were marked up with it and we had agents that would understand the mark-up, then computers would finally be able to process our queries in a really sophisticated way.", + "Some years later, the success of Google shows us that the vision has not come true, being hampered by the incredible amount of extra work required for the intellectual encoding of semantic mark-up – as compared to simply uploading an HTML page.", + "To alleviate this acquisition bottleneck, the field of ontology learning has since emerged as an important sub-field of ontology engineering.", + "It is widely accepted that ontologies can facilitate text understanding and automatic processing of textual resources.", + "Moving from words to concepts not only mitigates data sparseness issues, but also promises appealing solutions to polysemy and homonymy by finding non-ambiguous concepts that may map to various realizations in – possibly ambiguous – words.", + "Numerous applications using lexical-semantic databases like WordNet (Miller, 1990) and its non-English counterparts, e.g. EuroWordNet (Vossen, 1997) or CoreNet (Choi and Bae, 2004) demonstrate the utility of semantic resources for natural language processing.", + "Python is a high-level programming language." +] +``` + +Приклад `POST` запиту до кінцевої точки служби **S4** на мові програмування `JavaScript` з використанням `jQuery`: + +```JavaScript +jQuery.ajax({ + url: "host[:port]/ken/api/v1.0/en/html/ner", + type: "POST", + headers: { + "Content-Type": "text/plain; charset=utf-8", + }, + processData: false, + data: "[ + \"After the vision of the Semantic Web was broadcasted at the turn of the millennium, ontology became a synonym for the solution to many problems concerning the fact that computers do not understand human language: if there were an ontology and every document were marked up with it and we had agents that would understand the mark-up, then computers would finally be able to process our queries in a really sophisticated way.\", + \"Some years later, the success of Google shows us that the vision has not come true, being hampered by the incredible amount of extra work required for the intellectual encoding of semantic mark-up – as compared to simply uploading an HTML page.\", + \"To alleviate this acquisition bottleneck, the field of ontology learning has since emerged as an important sub-field of ontology engineering.\", + \"It is widely accepted that ontologies can facilitate text understanding and automatic processing of textual resources.\", + \"Moving from words to concepts not only mitigates data sparseness issues, but also promises appealing solutions to polysemy and homonymy by finding non-ambiguous concepts that may map to various realizations in – possibly ambiguous – words.\", + \"Numerous applications using lexical-semantic databases like WordNet (Miller, 1990) and its non-English counterparts, e.g. EuroWordNet (Vossen, 1997) or CoreNet (Choi and Bae, 2004) demonstrate the utility of semantic resources for natural language processing.\", + \"Python is a high-level programming language.\" +]", +}) +.done(function(data, textStatus, jqXHR) { + console.log("HTTP Request Succeeded: " + jqXHR.status); + console.log(data); +}) +.fail(function(jqXHR, textStatus, errorThrown) { + console.log("HTTP Request Failed"); +}) +.always(function() { + /* ... */ +}); + +``` + +##### Опис вихідних даних + +Вихідними даними є спеціалізована `HTML`-структура тексту: + +```html +
After the vision of the Semantic Web was broadcasted at + + the turn of the millennium + DATE + +, ontology became a synonym for the solution to many problems concerning the fact that computers do not understand human language: if there were an ontology and every document were marked up with it and we had agents that would understand the mark-up, then computers would finally be able to process our queries in a really sophisticated way. + + Some years later + DATE + +, the success of + + Google + ORG + + shows us that the vision has not come true, being hampered by the incredible amount of extra work required for the intellectual encoding of semantic mark-up – as compared to simply uploading an HTML page. To alleviate this acquisition bottleneck, the field of ontology learning has since emerged as an important sub-field of ontology engineering. It is widely accepted that ontologies can facilitate text understanding and automatic processing of textual resources. Moving from words to concepts not only mitigates data sparseness issues, but also promises appealing solutions to polysemy and homonymy by finding non-ambiguous concepts that may map to various realizations in – possibly ambiguous – words. Numerous applications using lexical-semantic databases like + + WordNet + ORG + + ( + + Miller + ORG + +, + + 1990 + DATE + +) and its non- + + English + NORP + + counterparts, e.g. EuroWordNet (Vossen, + + 1997 + DATE + +) or + + CoreNet + ORG + + (Choi and Bae, + + 2004 + DATE + +) demonstrate the utility of semantic resources for natural language processing. Python is a high-level programming language.
+``` + ------- @@ -948,6 +1070,8 @@ fetch("file", 'host[:port]/ken/api/v1.0/en/file/parcexml', { - [Docker in Alpine Linux](https://wiki.alpinelinux.org/wiki/Docker) - [Docker-compose: идеальное рабочее окружение](https://habr.com/ru/post/346086/) - [Docker для начинающего разработчика](https://medium.com/p/docker-for-beginners-a2c9c73e7d3d) +- [Обзор GUI-интерфейсов для управления Docker-контейнерами](https://habr.com/ru/company/flant/blog/338332/) +- [Lazydocker — GUI для Docker прямо в терминале](https://habr.com/ru/company/flant/blog/446700/) #### Система черг для Python Flask application - uWSGI Spooler diff --git a/ken.py b/ken.py index 5c19592..bea4128 100644 --- a/ken.py +++ b/ken.py @@ -548,7 +548,7 @@ def get_terms_list(): if len(doc_for_tokens) == 2: ''' - # extract one-word terms from 2-words statements (excluding articles DET) + # Extract one-word terms from 2-words statements (excluding articles DET) ''' if doc_for_tokens[0].pos_ in ['DET', 'PUNCT']: @@ -666,7 +666,6 @@ def get_terms_list(): # If two-word term not exists in two_word_terms_help_list - # if chunk.lower_ not in two_word_terms_help_list: if chunk.lemma_ not in two_word_terms_help_list: # update two_word_terms_help_list with the new two-word term @@ -1015,19 +1014,7 @@ def get_ner(): # ------------------------------------------------------------------------------------------------------ TODO - in pdf TODO 2 files, comparable - - - -TODO exception handling in a good way - TODO Languagetool in a separate container for spelling correction - -TODO in production on Windows - - -Done in production on Linux with uWSGI, Nginx, Docker -Done Handling NER in terms - # ------------------------------------------------------------------------------------------------------ """ diff --git a/static/javascripts/ken-recap.js b/static/javascripts/ken-recap.js index af22f60..e8dda07 100644 --- a/static/javascripts/ken-recap.js +++ b/static/javascripts/ken-recap.js @@ -53,6 +53,7 @@ $newProjectAndClearAll.click(function () { }); $(document).ready(function () { + // Load last recapped file data if (localStorage.getItem("recapForLastFile")) { console.log("Load last recapped file data"); resJSON = JSON.parse(localStorage.getItem("recapForLastFile")); @@ -65,6 +66,15 @@ $(document).ready(function () { text: element.tname })); } + + // add text from last recapped file to textarea id="sents_from_text" + // Clear textarea id="sents_from_text" + $sents_from_text.text(''); + // add to textarea id="sents_from_text" + for (let sent_element of resJSON.termsintext.sentences.sent) { + $sents_from_text.append(sent_element + '\n\n') + } + } if (localStorage.getItem("projectFiles")) { @@ -79,7 +89,6 @@ $(document).ready(function () { $("#displacy").hide(); $("#displacy-ner").hide(); - // $("#displacy-label").center(); iziToast.info({ title: 'Вітаємо!', @@ -288,7 +297,7 @@ function fetchFileToRecapService() { $upload_button.css('display', 'none'); $('.tabs').css('display', 'block'); - // Очистка списка терминов, поля textArea и input choose file + // Clear terms list,textArea, input choose file $recapOverviewButton.val(""); $('option', $uploadResultList).remove(); $('option', $uploadUnknownTerms).remove(); @@ -301,7 +310,7 @@ function fetchFileToRecapService() { method: 'post', body: form }) - .then(function (response) { + .then(response => { if (response.status == 503) { $("body").css("cursor", "default"); @@ -311,20 +320,16 @@ function fetchFileToRecapService() { message: 'Статус: ' + response.status, position: 'bottomLeft' }); - alert('Сервіс зайнятий, спробуйте ще раз.' + '\n' + 'Статус: ' + response.status); return; } - // return response.json().then(function (result) { - return response.text().then(function (result) { + + return response.text().then(result => { dom = new DOMParser().parseFromString(result, "text/xml"); resJSON = xmlToJson(dom); - // console.log(JSON.stringify(resJSON)); - // console.log(JSON.stringify(Object.values(resJSON.termsintext.sentences.sent))) // add to local storage recap of the last uploaded file localStorage["recapForLastFile"] = JSON.stringify(resJSON); - // add to local storage recap of the last uploaded file // add to local storage recap of this file for #projectFileList localStorage[uploadFileName.split('\\').pop()] = JSON.stringify(resJSON); @@ -337,30 +342,28 @@ function fetchFileToRecapService() { })); } + // Clear textarea id="sents_from_text" + $sents_from_text.text(''); // add to textarea id="sents_from_text" for (let sent_element of resJSON.termsintext.sentences.sent) { $sents_from_text.append(sent_element + '\n\n') } - // hide progress bar - // $("body").css("cursor", "default"); - // $(".loader").hide(); }); }) // fetch to parce.xml for NER - .then(function (next) { + .then(next => { return fetch('/ken/api/v1.0/en/file/parcexml', { method: 'post', body: form }) - .then(function (response) { - return response.text().then(function (result) { + .then(response => { + return response.text().then(result => { + dom = new DOMParser().parseFromString(result, "text/xml"); resParceJSON = xmlToJson(dom); for (let sentElement of resParceJSON.text.sentence) { - // console.log(JSON.stringify(sentElement)); - if (sentElement.hasOwnProperty('ner')) { if (Array.isArray(sentElement.ner.entity)) { for (let entityElement of sentElement.ner.entity) { @@ -382,15 +385,15 @@ function fetchFileToRecapService() { }) }) // fetch to /ken/api/v1.0/en/html/ner for NER - .then(function (next) { + .then(next => { sentencesData = JSON.stringify(Object.values(resJSON.termsintext.sentences.sent)); - console.log(sentencesData); + return fetch('/ken/api/v1.0/en/html/ner', { method: 'post', body: sentencesData }) - .then(function (response) { + .then(response => { return response.text().then(function (result) { // htmlWithNER = new DOMParser().parseFromString(result, "text/html"); annotation = '

Named Entity Recognition annotations

' @@ -406,7 +409,7 @@ function fetchFileToRecapService() { }); }) }) - .catch(function (error) { + .catch(error => { $("body").css("cursor", "default"); $(".loader").hide(); iziToast.warning({ @@ -435,8 +438,12 @@ function forUploadResultListClickAndEnterPressEvents() { // inserting sentences with selected terms in textArea #textContent if (Array.isArray(resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos)) { + let sentIndex = []; for (let elementForUploadResultListDbClickAndEnterPress of resJSON.termsintext.exporterms.term[valOfSelectedElementInUploadResultList].sentpos) { - $textContent.append('\n' + resJSON.termsintext.sentences.sent[elementForUploadResultListDbClickAndEnterPress.substring(0, elementForUploadResultListDbClickAndEnterPress.indexOf("/")) - 1] + '\n'); + if (!sentIndex.includes(parseInt(elementForUploadResultListDbClickAndEnterPress.substring(0, elementForUploadResultListDbClickAndEnterPress.indexOf("/")) - 1))) { + $textContent.append('\n' + resJSON.termsintext.sentences.sent[elementForUploadResultListDbClickAndEnterPress.substring(0, elementForUploadResultListDbClickAndEnterPress.indexOf("/")) - 1] + '\n'); + sentIndex.push(parseInt(elementForUploadResultListDbClickAndEnterPress.substring(0, elementForUploadResultListDbClickAndEnterPress.indexOf("/")) - 1)); + } } } @@ -511,26 +518,6 @@ function forUploadResultListClickAndEnterPressEvents() { } $textContent.highlightWithinTextarea(onInput); -/* function multiSearchOr(text, searchWord) { - var regex = RegExp('\\b(\\w*' + searchWord + '\\w*)\\b', 'ig'); - let m; - let foundWords = []; - while ((m = regex.exec(text)) !== null) { - // This is necessary to avoid infinite loops with zero-width matches - if (m.index === regex.lastIndex) { - regex.lastIndex++; - } - - // The result can be accessed through the `m`-variable. - m.forEach((match, groupIndex) => { - // console.log(match); - foundWords.push(match) - }); - } - return foundWords[0]; - } */ - - // visualize noun chunk / term let displacy = new displaCy('/ken/api/v1.0/en/html/depparse/nounchunk', { container: '#displacy' @@ -565,10 +552,26 @@ function forProjectFileListClickAndEnterPressEvents() { })); } - alert('Разбор файлу "' + $projectFileList.prop('value') + '" завантажено'); + // add text from last recapped file to textarea id="sents_from_text" + // Clear textarea id="sents_from_text" + $sents_from_text.text(''); + // add to textarea id="sents_from_text" + for (let sent_element of resJSON.termsintext.sentences.sent) { + $sents_from_text.append(sent_element + '\n\n') + } + + iziToast.info({ + title: 'Разбор файлу', + message: $projectFileList.prop('value') + ' завантажено!', + position: 'bottomLeft' + }); } else { - alert('Разбору файлу "' + $projectFileList.prop('value') + '" не існує'); + iziToast.warning({ + title: 'Разбор файлу', + message: $projectFileList.prop('value') + ' не існує!', + position: 'bottomLeft' + }); } } @@ -642,26 +645,6 @@ function xmlToJson(xml) { return obj; } -function getLanguage(ofText) { - let text = 'https://translate.yandex.net/api/v1.5/tr.json/detect?hint=ru,en&key=trnsl.1.1.20160517T143002Z.e9fc37c7a484c5f4.8cba036cc3eb084c401f3766ed5b2b389b6dc9fc&text=' + ofText; - if (self.fetch) { - fetch(text, { - method: 'post' - }) - .then(function (response) { - return response.json().then(function (result) { - // langField.innerHTML = result.lang; - console.log(result.lang); - }) - }) - .catch(function (error) { - alert('Виникла помилка на стороні серевера.' + '\n' + 'Помилка: ' + error + '\n' + ' Cпробуйте ще раз.'); - }); - } else { - alert('Ваш браузер застарів. Встановіть актуальну версію Google Chrome'); - } -} - // CHANGE TABS $('.nav-tabs a').click(function (e) { e.preventDefault(); @@ -670,10 +653,6 @@ $('.nav-tabs a').click(function (e) { $('a[data-toggle="data"]').on('shown.bs.tab', function (e) { - // if ($(e.target).attr("href") == '#new_term_tab'){ - // alert('target'); - // } - if ($("#new_term_tab").is(".tab-pane.active")) { $("#displacy").hide(); $("#displacy-ner").show(); diff --git a/resources/tests/documents-for-test/about-ontology-for-spelling-correction.docx b/tests/documents-for-test/about-ontology-for-spelling-correction.docx similarity index 100% rename from resources/tests/documents-for-test/about-ontology-for-spelling-correction.docx rename to tests/documents-for-test/about-ontology-for-spelling-correction.docx diff --git a/resources/tests/documents-for-test/about-ontology-for-spelling-correction.pdf b/tests/documents-for-test/about-ontology-for-spelling-correction.pdf similarity index 100% rename from resources/tests/documents-for-test/about-ontology-for-spelling-correction.pdf rename to tests/documents-for-test/about-ontology-for-spelling-correction.pdf diff --git a/resources/tests/documents-for-test/about-ontology-for-spelling-correction.txt b/tests/documents-for-test/about-ontology-for-spelling-correction.txt similarity index 100% rename from resources/tests/documents-for-test/about-ontology-for-spelling-correction.txt rename to tests/documents-for-test/about-ontology-for-spelling-correction.txt diff --git a/resources/tests/documents-for-test/about-ontology-n.txt b/tests/documents-for-test/about-ontology-n.txt similarity index 100% rename from resources/tests/documents-for-test/about-ontology-n.txt rename to tests/documents-for-test/about-ontology-n.txt diff --git a/resources/tests/documents-for-test/about-ontology.txt b/tests/documents-for-test/about-ontology.txt similarity index 100% rename from resources/tests/documents-for-test/about-ontology.txt rename to tests/documents-for-test/about-ontology.txt diff --git a/resources/tests/documents-for-test/captains-courageous.txt b/tests/documents-for-test/captains-courageous.txt similarity index 100% rename from resources/tests/documents-for-test/captains-courageous.txt rename to tests/documents-for-test/captains-courageous.txt diff --git a/resources/tests/documents-for-test/computer-programming.txt b/tests/documents-for-test/computer-programming.txt similarity index 100% rename from resources/tests/documents-for-test/computer-programming.txt rename to tests/documents-for-test/computer-programming.txt diff --git a/resources/tests/documents-for-test/cris.txt b/tests/documents-for-test/cris.txt similarity index 100% rename from resources/tests/documents-for-test/cris.txt rename to tests/documents-for-test/cris.txt diff --git a/resources/tests/documents-for-test/flask.pdf b/tests/documents-for-test/flask.pdf similarity index 100% rename from resources/tests/documents-for-test/flask.pdf rename to tests/documents-for-test/flask.pdf diff --git a/resources/tests/documents-for-test/sentences.json b/tests/documents-for-test/sentences.json similarity index 100% rename from resources/tests/documents-for-test/sentences.json rename to tests/documents-for-test/sentences.json diff --git a/resources/tests/documents-for-test/small.txt b/tests/documents-for-test/small.txt similarity index 100% rename from resources/tests/documents-for-test/small.txt rename to tests/documents-for-test/small.txt diff --git a/resources/tests/konspekt-templates/allterms-NEW.json b/tests/konspekt-templates/allterms-NEW.json similarity index 100% rename from resources/tests/konspekt-templates/allterms-NEW.json rename to tests/konspekt-templates/allterms-NEW.json diff --git a/resources/tests/konspekt-templates/allterms-OLD.json b/tests/konspekt-templates/allterms-OLD.json similarity index 100% rename from resources/tests/konspekt-templates/allterms-OLD.json rename to tests/konspekt-templates/allterms-OLD.json diff --git a/resources/tests/konspekt-templates/allterms.xml b/tests/konspekt-templates/allterms.xml similarity index 100% rename from resources/tests/konspekt-templates/allterms.xml rename to tests/konspekt-templates/allterms.xml diff --git a/resources/tests/konspekt-templates/konspekt-pos-tags.doc b/tests/konspekt-templates/konspekt-pos-tags.doc similarity index 100% rename from resources/tests/konspekt-templates/konspekt-pos-tags.doc rename to tests/konspekt-templates/konspekt-pos-tags.doc diff --git a/resources/tests/konspekt-templates/konspekt-pos-tags/Backup of konspekt-pos-tags.doc b/tests/konspekt-templates/konspekt-pos-tags/Backup of konspekt-pos-tags.doc similarity index 100% rename from resources/tests/konspekt-templates/konspekt-pos-tags/Backup of konspekt-pos-tags.doc rename to tests/konspekt-templates/konspekt-pos-tags/Backup of konspekt-pos-tags.doc diff --git a/resources/tests/konspekt-templates/parce-NEW.json b/tests/konspekt-templates/parce-NEW.json similarity index 100% rename from resources/tests/konspekt-templates/parce-NEW.json rename to tests/konspekt-templates/parce-NEW.json diff --git a/resources/tests/konspekt-templates/parce.xml b/tests/konspekt-templates/parce.xml similarity index 100% rename from resources/tests/konspekt-templates/parce.xml rename to tests/konspekt-templates/parce.xml diff --git a/resources/tests/scratch-code/chunks/do-phrase-detection.py b/tests/scratch-code/chunks/do-phrase-detection.py similarity index 100% rename from resources/tests/scratch-code/chunks/do-phrase-detection.py rename to tests/scratch-code/chunks/do-phrase-detection.py diff --git a/resources/tests/scratch-code/chunks/noun-chunks-hightlighted.py b/tests/scratch-code/chunks/noun-chunks-hightlighted.py similarity index 100% rename from resources/tests/scratch-code/chunks/noun-chunks-hightlighted.py rename to tests/scratch-code/chunks/noun-chunks-hightlighted.py diff --git a/resources/tests/scratch-code/chunks/regexp.py b/tests/scratch-code/chunks/regexp.py similarity index 100% rename from resources/tests/scratch-code/chunks/regexp.py rename to tests/scratch-code/chunks/regexp.py diff --git a/resources/tests/scratch-code/chunks/yield.py b/tests/scratch-code/chunks/yield.py similarity index 100% rename from resources/tests/scratch-code/chunks/yield.py rename to tests/scratch-code/chunks/yield.py diff --git a/resources/tests/scratch-code/docx-text-extract.py b/tests/scratch-code/docx-text-extract.py similarity index 100% rename from resources/tests/scratch-code/docx-text-extract.py rename to tests/scratch-code/docx-text-extract.py diff --git a/resources/tests/scratch-code/new-structure/struct.py b/tests/scratch-code/new-structure/struct.py similarity index 100% rename from resources/tests/scratch-code/new-structure/struct.py rename to tests/scratch-code/new-structure/struct.py diff --git a/resources/tests/scratch-code/pdf-text-extract.py b/tests/scratch-code/pdf-text-extract.py similarity index 100% rename from resources/tests/scratch-code/pdf-text-extract.py rename to tests/scratch-code/pdf-text-extract.py diff --git a/resources/tests/scratch-code/sentence-segmenter.py b/tests/scratch-code/sentence-segmenter.py similarity index 100% rename from resources/tests/scratch-code/sentence-segmenter.py rename to tests/scratch-code/sentence-segmenter.py diff --git a/resources/tests/scratch-code/visualizing/sentence-render-body-tag.py b/tests/scratch-code/visualizing/sentence-render-body-tag.py similarity index 100% rename from resources/tests/scratch-code/visualizing/sentence-render-body-tag.py rename to tests/scratch-code/visualizing/sentence-render-body-tag.py diff --git a/resources/tests/scratch-code/visualizing/sentence-render-dep-pos.py b/tests/scratch-code/visualizing/sentence-render-dep-pos.py similarity index 100% rename from resources/tests/scratch-code/visualizing/sentence-render-dep-pos.py rename to tests/scratch-code/visualizing/sentence-render-dep-pos.py diff --git a/resources/tests/scratch-code/visualizing/sentences-render-dep-pos.py b/tests/scratch-code/visualizing/sentences-render-dep-pos.py similarity index 100% rename from resources/tests/scratch-code/visualizing/sentences-render-dep-pos.py rename to tests/scratch-code/visualizing/sentences-render-dep-pos.py diff --git a/resources/tests/scratch-code/visualizing/visualizer.py b/tests/scratch-code/visualizing/visualizer.py similarity index 100% rename from resources/tests/scratch-code/visualizing/visualizer.py rename to tests/scratch-code/visualizing/visualizer.py diff --git a/resources/tests/scratch-code/xml-proccessing.py b/tests/scratch-code/xml-proccessing.py similarity index 100% rename from resources/tests/scratch-code/xml-proccessing.py rename to tests/scratch-code/xml-proccessing.py diff --git a/wiki/work-plan-requirements/ken-pipeline.graffle b/wiki/work-plan-requirements/ken-pipeline.graffle deleted file mode 100644 index 665dab1..0000000 Binary files a/wiki/work-plan-requirements/ken-pipeline.graffle and /dev/null differ diff --git a/wiki/work-plan-requirements/ken-pipeline.pdf b/wiki/work-plan-requirements/ken-pipeline.pdf deleted file mode 100644 index d3f624f..0000000 Binary files a/wiki/work-plan-requirements/ken-pipeline.pdf and /dev/null differ diff --git a/wiki/work-plan-requirements/requirements.docx b/wiki/work-plan-requirements/requirements.docx deleted file mode 100644 index df85ae9..0000000 Binary files a/wiki/work-plan-requirements/requirements.docx and /dev/null differ diff --git "a/wiki/work-plan-requirements/\320\224\320\276\320\263\320\276\320\262\321\226\321\200\320\246\320\237\320\245-\320\251\321\203\321\200\320\276\320\262.doc" "b/wiki/work-plan-requirements/\320\224\320\276\320\263\320\276\320\262\321\226\321\200\320\246\320\237\320\245-\320\251\321\203\321\200\320\276\320\262.doc" deleted file mode 100644 index 3ad5e07..0000000 Binary files "a/wiki/work-plan-requirements/\320\224\320\276\320\263\320\276\320\262\321\226\321\200\320\246\320\237\320\245-\320\251\321\203\321\200\320\276\320\262.doc" and /dev/null differ diff --git "a/wiki/work-plan-requirements/\320\251\321\203\321\200\320\276\320\262-\320\272\320\260\320\273-\320\277\320\273\320\260\320\275.doc" "b/wiki/work-plan-requirements/\320\251\321\203\321\200\320\276\320\262-\320\272\320\260\320\273-\320\277\320\273\320\260\320\275.doc" deleted file mode 100644 index e852d32..0000000 Binary files "a/wiki/work-plan-requirements/\320\251\321\203\321\200\320\276\320\262-\320\272\320\260\320\273-\320\277\320\273\320\260\320\275.doc" and /dev/null differ