H7EBe

                  В выпускном классе школы на уроке информатики 
                  я выполнял задание по созданию небольшого сайта. 
                  https://lenta.ru/articles/2018/12/24/zealand/

### TEXT MINING (добыча текста)*
================================

------
*) редакция 2018/12/29
------

## I. ПОИСК
~~~~~~~~~~~

  1. Накопление информации с помощью тотального мониторинга -- каждое движение должно оставлять след в системе.

  2. Поиск информации:

  глобальный поиск:
    google
    yandex
    duckduckgo
    bing
    ..
    либо мощностью локального кластера.
    
  поиск на изображениях и в фильмах:
    face-recognition
    pattern-tracking (автоматическая раскраска черно/белых фильмов)

  поиск в аудио-файлах: 
    youtube transcribe
    распознавание речи на облаке (iot devices)
    pocketsphinx
    горыныч
    ..
    
  поиск браузером на странице:
    ctrl+f
    
  локальный поиск:
    find
    locate
  
  регулярные выражения:
    grep
    средствами текстового редактора
    интегрированные приложения, ncurses: midnight commander
    
  морфинг слова:
    включать в поиск только часть слова.
    aspell (см "Удаленный доступ по SSH. Играем с aspell.")
    
  кодировки:
    iconv
    base64
    uuencode, uudecode
    od, xxd, xxd & vi, xxd -r


## II. ПОДГОТОВКА ДЛЯ ОБЛЕГЧЕНИЯ ПОИСКА
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<< 
Что экранировать в linux grep?

  $ echo '^ $ ( ) [] {} . * + ? | " \'    | \
    grep '\^ \$ ( ) \[\] {} \. \* + ? | \" \\'
>>

## 0. Общие правила
~~~~~~~~~~~~~~~~~~~

  + Файл хранить в unix формате (\x0d) в кодировке utf-8 с BOM.

  + Между элементами всегда \n\n

  + tab-free: не содержит символов 0..\039

  + все символы, из таблицы ASCII-7 (кроме букв алфавита языка статьи и т. н. "полезных символов")
  
  ° √ Ξ Σ Π Δ
  Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω 
  α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω 
 
  + строки подчеркивания считать комментариями, при обработке текста не учитывать:
  
    echo '~~~~~~~~~~' | grep '^\(.\)\1\+'


## 1. ЭЛЕМЕНТЫ
~~~~~~~~~~~~~~

  1. Заголовок
  2. Параграф
  3. Картинка
  4. Исходник, стихи, неформатируемый текст
  5. Формула
  6. Список
  7. Таблица
  8. Врезка
  9. Подпись под таблицей или рисунком
  A. Сноска
  B. Ссылка
  C. Линк


# 1.1. Заголовок
----------------

^#\+[ ]\([0-9]\+\.\)\+ часть, глава, раздел, предисловие, послесловие, пролог, эпилог, приложение..

Пример:

  echo '## 22.37.124.5. О главном' | grep '^#\+[ ]\([0-9]\+\.\)\+'


# 1.2. Абзац
------------

Одно или несколько предложений.  Могут содержать сноски, ссылки, цитаты.

Сноска 

   echo 'blahblah*123' | grep '\*[0-9]\+'
   
Ссылка

  echo 'blahblah[123]' | grep '\[[0-9]\+\]'

Цитата: "blahblah". Признак начала '[ ]\"[^ ]' конца '[^ ]\"[ ]'

  echo 'he said "blahblah"[123]' | grep "\"[^\"]\+"\"


# 1.3. Картинка
---------------

  echo '`  pic.png' | grep '^`  [a-zA-Z0-9_-]\+\.\(jpg\|png\)'

  
# 1.4. Исходник, стихи, неформатируемый текст
---------------------------------------------

Эпиграф, как особый случай неформатируемого текста: отступ на 6 и более [ ]. 

Все отступы, кроме исходников помечаются малозаметым символом, например "`" в первой позиции строки (принцип Копипаста). 

  echo '`  Output: 2+2=4' | grep '^`.\+'

  
# 1.5. Формула
--------------

Признак формулы: ^[ ][ ](\([0-9]\+.\)\+)

Пример

  $ echo '`  (4.13.1.17.)   cos(a) = a*b/|a|/|b|'  | \
    grep '^`[ ][ ](\([0-9]\+.\)\+)'
    
  `  (4.13.1.17.)   cos(a) = a*b/|a|/|b|

  
# 1.6. Список
-------------

Перечисляемый и ненумерованный списки. Списки могут быть вложенные. Начинается с двух пробелов, затем номер пункта либо cимволы - -- + * # = ~

Пример

  1. Подчиняется правилам
     + один
       - подпункт
       - еще
     + два
     + ..
  2. ..

  
# 1.7. Таблица
--------------

Состоит из сплошного ряда строк, начинающихся с +- либо |

Пример

  Для устройства без monospace шрифта

  +-----
  | Nr. / Word
  +-----
  | 0   / ноль
  | 1   / один
  | 2   / два
  +-----

  Для устройства с monospace шрифтом

  +-----+------+
  | Nr. | Word |
  +-----+------+
  | 0   | ноль |
  | 1   | один |
  | 2   | два  |
  +-----+------+

  
# 1.8. Врезка
-------------

Пример

<< 
это врезка 
>>

Признак начала врезки: ^<<$

Признак окончания врезки: ^>>$


# 1.9. Подпись под таблицей или рисунком
----------------------------------------

Абзац, следующий сразу за таблицей или рисунком, считается подписью.


# 1.10. Сноска
--------------

Признак сноски: '^\*[0-9]\+)\.[ ]' .

   
# 1.11. Ссылка
--------------

Ссылки идут отдельным разделом.

Признак тела ссылки '\[[0-9]+\.[ ]'


# 1.12. Линк
------------

Признак линка: '^[ ][ ]\(ftp\|http\|https\)://'

Примеры

  echo '  https://whatever' | grep '^[ ][ ]\(ftp\|http\|https\)://'

  echo '  ftp://ufo.mars' | grep '^[ ][ ]\(ftp\|http\|https\)://'
  

## 2. ДОБЫЧА ТЕКСТА
~~~~~~~~~~~~~~~~~~~

          Главное -- метод, а не способ реализации.
          И в каждом конкретном случае: подумать.
          Если не лень, это "подумать" можно кешировать.

Исходные форматы DJVU, PDF, epub, fb2, html, docx, rtf.


# 2.1. Программное обеспечение
------------------------------

All

  Browser (Firefox, Chrome,..)
  wget (curl, nc,..)

Windows

  Fine Reader
  Microsoft Word 2016+*
  Calibre
  Sumatra PDF
  Notepad++
  Notepad2
  Briss (sf.net, java, crop pdf)

Linux

  awk
  sed
  grep
  bash
  vi
  pdftohtml
  pdftotext
  elinks (save formatted document)
------
*) Не рекомендуется делать copy-paste из word-документа (в особенности, полученного на finereader либо из pdf) в текстовый файл -- знаки переноса (физическое форматирование первоначального pdf либо djvu текста (невидимое при просмотре вордом) и дефисы -- смешаются. Только "сохранить как plain text, utf-8, linefeed only).
------


# 2.2. Полезные регулярные выражения
------------------------------------

  1. Привести цитаты вида «..» к "[^ ] .. [^ ]"

  `  $ echo -e '«all»\n«things»\n«must pass»' > tempa; cat tempa
  `  «all»
  `  «things»
  `  «must pass»
  `  $ sed -Ei 's/«/\"/g;s/»/\"/g' tempa; cat tempa
  `  "all"
  `  "things"
  `  "must pass"

  2. Убрать все переводы строк, показать файл одной строкой

  `  $ echo -e '«all»\n«things»\n«must pass»\n' | tr -d '\n' ; echo
  `  «all»«things»«must pass»

  3. Отделить все элементы одной и только одной пустой строкой ^$

  `  $ echo -e '«all»\n«things»\n\n«must»\n\n\n«pass»' | \
  `    tr '\n' @ | sed -E 's/@+/\n\n/g'
  `  «all»
  `
  `  «things»
  `
  `  «must»
  `
  `  «pass»

  4. искать .., заменить на ..

  `  s/ – / -- /g
  `  s/…/\.\./g
  `  s/«\([^ ]\)/\"\1/g
  `  s/\([^ ]\)»/\1\"/g

  5. Используемые символы

  `  cat my.txt | sed -E 's/(.)/\1\n/g' | sort | uniq | tr -d '\n'


  6. Вставить пустые строки между элементами текста (np++):

  `  ([^\n])\n([^\n]) ==> \1\n\n\2

     Не более одной пустой строки между элементами текста (np++):

  `  \n\n+ ==> \n\n

     Соединить рваные строки (обычно после конвертации pdf => txt)

  `  [а-я-]\n  # use with care

     Рваные строки (часто):

       -- начинаются с маленькой буквы ^[а-я]

       -- кончаются буквой ^.+[а-я]$

  7. Два пробела между предложениями (внутри абзаца)

  `  ([!\?\.])\s+(['"А-ЯA-Z\\]) ==> \1  \2

  8. Подчеркивания

    echo 'в чащах юга жил был цитрус да но фальшивый экземпляр' | \
    sed -E 's/[а-я ]/-/g'

  9. ASCII-7 не буквы и не цифры

    $ echo -e '!"#$%&\047()*+,-./:;<=>?@[\]^_`{|}~'
    !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
    --------------------------------
    00000000001111111111222222222233
    01234567890123456789012345678901

  A. Раскрыть (напечатать вычисленное значение) регулярное выражение

     Пример. Найти тэги

    cat index.html | \
        grep -E "&lt;[a-z\/0-9]+\s[a-z\/0-9:=\.\"\s]*&gt;" | \
        sed -E 's/^.*&lt;[a-z\/0-9]+\s[a-z\/0-9:=\.\"\s]*&gt;.*$/<\1>/'

  B. Составить словарь

    $ cat ou | tr ' ' '\n' | grep -v ^$ | sed -E 's/[^A-Za-z]+$//g' | \
      sed -E 's/^[^A-Za-z]+//g' | tr A-Z a-z | sort | uniq > boo


## Приложение A. ASCII-7, русские, греческие, эстонские буквы:
--------------------------------------------------------------
 
`   !"#$%&'()*+,-./0123456789:;<=>?
`  @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
`  `abcdefghijklmnopqrstuvwxyz{|}~

`  АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
`  абвгдежзийклмнопрстуфхцчшщъыьэюя

`  ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ
`  αβγδεζηθικλμνξοπρστυφχψω

`  ÄÕÖÜŠŽ
`  äõöüšž


## Приложение B. Работа с текстом
---------------------------------

# Пример 1: Задумавшийся. "Физика для чайников"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  1. Конвертируем fb2 в txt с помощью Calibre 3.4.

  2. Приводим к формату UTF-8 w BOM, Unix line endings.

  3. Убираем три пробела в начале строки: [^   ] ==> []

  4. Вставить пустые строки между элементами текста (np++):

    ([^\n])\n([^\n]) ==> \1\n\n\2

  5. Не более одной пустой строки между элементами текста:

    \n\n+ ==> \n\n

  6. искать .., заменить на ..

    [ - ]   ==> [ -- ]
    [«]     ==> ["]
    [»]     ==> ["]
    [&gt; ] ==> [>]
    [&lt; ] ==> [<]
    [©]     ==> [(c)]

  7. Два пробела между предложениями (внутри абзаца)

    ([!\?\.])\s+(['"А-ЯA-Z\\]) ==> \1  \2

  8. Символы, используемые в книге (\U !)

    $ cat z.txt | sed -E 's/(.)/\U\1\n/g' | sort | uniq | tr -d '\n'
    ^<=> -,;:!?/.'"()*\&%+﻿
    0123456789
    ABCDEFGHIKLMNOPQRSTUVWXYZ
    АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ

    ASCII-7 символы, неиспользуемые в книге

    $ echo -e '!"#$%&\047()*+,-./:;<=>?@[\]^_`{|}~' | \
      tr -d '^<=> -,;:!?/.\047\"()*\\&%+﻿'
    #$@[]_`{|}~

  9. Поищем уравнения и неравенства:

    -- содержит что-то из [=<>] И
    -- содержит что-то из арифметических операций [^-+*/()]
       где ^ возведение в степень.

Формул меньше, чем хотелось бы..

  $ cat z.txt | sed -E 's/[а-яА-Я-]+[\"\.\?,;:! ]//g' \
    | tr -d ' ' | grep -v '^$' # потом немного руками..

    v=v0+a*t           p/T=const
    s=v0*t+a*(t^2)/2   p*V=const
    F=G*m1*m2/(R^2)    ΔQ=ΔU+A
    F=m*g.             Q=c*m*ΔT
    F=-k*x             F=k*q1*q2/(r^2)
    P=m*(g-a)          E=k*q/(r^2)
    F=-мю*N            E=F/q
    E=m*(v^2)/2        E=q^2/(2*c)
    E=m*g*h            E=c*U^2/2=q*U/2
    A=F*s*cosa         I=q/t
    P=A/t(N)           I=q0*n*v*S
    x=x0*sin(wt+ф)     F=B*v*q*sinF
    p=2*n*m0*v^2/3     B=F/(q*v)=F/(I*l)
    p=2n*E/3           F=B*v*q*sinF
    E=3*k*T/2          T=2пи*(L*c)
    p*V=m*R*T/M        R=ро*l/S
    V/T=const

Но все же, было много полезных идей.

  1. минимальный алфавит книги

  2. греческие буквы словами:

       1. Α  ALPHA    α  alpha
       2. Β  BETA     β  beta
       3. Γ  GAMMA    γ  gamma
       4. Δ  DELTA    δ  delta
       5. Ε  EPSILON  ε  epsilon
       6. Ζ  ZETA     ζ  zeta
       7. Η  ETA      η  eta
       8. Θ  THETA    θ  theta
       9. Ι  IOTA     ι  iota
      10. Κ  KAPPA    κ  kappa
      11. Λ  LAMBDA   λ  lambda
      12. Μ  MU       μ  mu
      13. Ν  NU       ν  nu
      14. Ξ  XI       ξ  xi
      15. Ο  OMICRON  ο  omicron
      16. Π  PI       π  pi
      17. Ρ  RHO      ρ  rho
      18. Σ  SIGMA    σ  sigma
      19. Τ  TAU      τ  tau
      20. Υ  UPSILON  υ  upsilon
      21. Φ  PHI      φ  phi
      22. Χ  CHI      χ  chi
      23. Ψ  PSI      ψ  psi
      24. Ω  OMEGA    ω  omega

    Пример. оГречивание

      $ cat my.txt | \
        sed -E 's/ALPHA/Α/g;s/alpha/α/g;s/BETA/Β/g;s/beta/β/g' | \
        sed -E 's/GAMMA/Γ/g;s/gamma/γ/g';s/DELTA/Δ/g;s/delta/δ/g' | \
        sed -E 's/EPSILON/Ε/g;s/epsilon/ε/g;s/ZETA/Ζ/g;s/zeta/ζ/g' | \
        sed -E 's/ETA/Η/g;s/eta/η/g;s/THETA/Θ/g;s/theta/θ/g' | \
        sed -E 's/IOTA/Ι/g;s/iota/ι/g/s/KAPPA/Κ/g;s/kappa/κ/g' | \
        sed -E 's/LAMBDA/Λ/g;s/lambda/λ/g;s/MU/Μ/g;s/mu/μ/g' | \
        sed -E 's/NU/Ν/g;s/nu/ν/g;s/XI/Ξ/g;s/xi/ξ/g' | \
        sed -E 's/OMICRON/Ο/g;s/omicron/ο/g;s/PI/Π/g;s/pi/π/g' | \
        sed -E 's/RHO/Ρ/g;s/rho/ρ/g;s/SIGMA/Σ/g;s/sigma/σ/g' | \
        sed -E 's/TAU/Τ/g;s/tau/τ/g;s/UPSILON/Υ/g;s/upsilon/υ/g' | \
        sed -E 's/PHI/Φ/g;s/phi/φ/g;s/CHI/Χ/g;s/chi/χ/g' | \
        sed -E 's/PSI/Ψ/g;s/psi/ψ/g;s/OMEGA/Ω/g;s/omega/ω/g'
        
    Пример. обезГречивание

        sed -E 's/Α/ALPHA/g;s/α/alpha/g;s/Β/BETA/g;s/β/beta/g' | \
        sed -E 's/Γ/GAMMA/g;s/γ/gamma/g';s/Δ/DELTA/g;s/δ/delta/g' | \
        sed -E 's/Ε/EPSILON/g;s/ε/epsilon/g;s/Ζ/ZETA/g;s/ζ/zeta/g' | \
        sed -E 's/Η/ETA/g;s/η/eta/g;s/Θ/THETA/g;s/θ/theta/g' | \
        sed -E 's/Ι/IOTA/g;s/ι/iota/g/s/Κ/KAPPA/g;s/κ/kappa/g' | \
        sed -E 's/Λ/LAMBDA/g;s/λ/lambda/g;s/Μ/MU/g;s/μ/mu/g' | \
        sed -E 's/Ν/NU/g;s/ν/nu/g;s/Ξ/XI/g;s/ξ/xi/g' | \
        sed -E 's/Ο/OMICRON/g;s/ο/omicron/g;s/Π/PI/g;s/π/pi/g' | \
        sed -E 's/Ρ/RHO/g;s/ρ/rho/g;s/Σ/SIGMA/g;s/σ/sigma/g' | \
        sed -E 's/Τ/TAU/g;s/τ/tau/g;s/Υ/UPSILON/g;s/υ/upsilon/g' | \
        sed -E 's/Φ/PHI/g;s/φ/phi/g;s/Χ/CHI/g;s/χ/chi/g' | \
        sed -E 's/Ψ/PSI/g;s/ψ/psi/g;s/Ω/OMEGA/g;s/ω/omega/g'

  3. длинная горизональная черта* как деление с низким приоритетом операции -- вначале считаем числитель и знаменатель (ЧиЗ), затем делим.

------
*) ":" в некоторых тестах IQ
------

  + для определения границ ЧиЗ используем ()

  + заодно, поднимаем приоритет ЧиЗ, те же ()

`     R1*R2 горизонтальной чертой делить на R1+R2
`     (R1*R2):(R1+R2)

  4. хитрые операции: такие как функции, символические операции:

      корень, сумма, произведение, интеграл, дифференциал

`     1 + SIGMA( i=1, n, "1/n!")
`     # v это функция t, тогда
`     dv/dt записываем как dd( "v(t)", t)

  5. \"составной стандарт" как матрешка. Каждую куклу можно использовать автономно: физика для чайников, в начальной школе, гимназии, ВУЗе, ВТУЗе, универе..


# Пример 2. Перевод художественного произведения
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Скачиваем plain text Cory Doctorow \"Down and Out in the Magic Kingdom" (CC license, Хакер. Номер 5 за 2016 г.)

  http://craphound.com/down/download/

2. Делаем построчный автоперевод (выбрать подходящую нейронную сеть, например, для translate.google.com . Oбязательное условие: одно предложение -- одна строка)

3. Сливаем в один файл:

  paste -d '\n' en.txt ru.txt > enru.txt

вернуть к исходному виду можно жестко перенумеровав строки (cat -n ..), затем выбрать grep'ом только нечетные или четные (NB! там физический таб нужно ставить, а не \t):

  cat -n enru.txt | head -n 100 | grep '^ +[0-9]+[13579]	'
