пятница, 15 марта 2019 г.

Создание device-tree overlay для BBB

Установка на BBB ядра версии 4.1 с поддержкой CapeManager описана здесь, версии 4.4 - здесь. Убедиться, что ядро собрано с поддержкой CapeManager'а, можно проверив конфиги сборки:

zcat /proc/config.gz | grep CONFIG_BONE_CAPEMGR

Вывод, в случае поддержки CapeManager'а, должен быть следующий:

CONFIG_BONE_CAPEMGR=y

Установим пакет для сборки оверлеев на BBB:

sudo apt update ; sudo apt install bb-cape-overlays

Обновим скрипты:

cd /opt/scripts/tools
git pull

Посмотреть подключенные оверлеи можно либо через dmesg | grep bone_capemgr, либо выполнив:

cat /sys/devices/platform/bone_capemgr/slots

Устанавливаем на BBB исходники оверлеев (проект bb.org-overlays):

cd /opt/scripts/tools
git clone https://github.com/beagleboard/bb.org-overlays

Наш оверлей (dts-файл) надо положить в папку /opt/scripts/tools/bb.org-overlays/src/arm

Чтобы получить из имеющихся файлов dts в вышеназванной папке файлы dto, а затем скопировать их в папку /lib/firmware, вызываем:

cd /opt/scripts/tools/bb.org-overlays
make clean
./install.sh

Для вывода изображения мы используем пины p8.31-p8.45 (lcd_data0-lcd_data15), p8.27 (lcd_vsync), p8.28 (lcd_pclk), p8.29 (lcd_hsync), p8.30 (lcd_ac_bias_en). В дефолтном девайстри am335x-boneblack.dtb (am335x-boneblack.dts) эти пины используются hdmi-подсистемой (nxp_hdmi_bonelt_pins). Вместо стандартного мы будем использовать am335x-boneblack-emmc-overlay.dtb (am335x-boneblack-emmc-overlay.dts), в котором lcd-пины не связаны с hdmi-подсистемой. Для этого добавим следующую строчку в файл /boot/uEnv.txt:
dtb=am335x-boneblack-emmc-overlay.dtb

Для загрузки оверлея (например, BB-BONE-LCD7-01-00A1.dts из проекта bb.org-overlays) в режиме runtime надо набрать следующую команду в bash'е:

sudo sh -c "echo 'BB-BONE-LCD7-01:00A1' > /sys/devices/platform/bone_capemgr/slots"

У нас есть разные аппаратные конфигурации, которые ведут к появлению разных параллельных ветвлений оверлеев, выбором которых будет заниматься пользователь в расширенных настройках. Загрузку конкретного оверлея я буду производить в bash-скрипте, который запускается при старте системы (например, mystart.sh).

Настройка используемых интерфейсов uart1uart4i2c2spi0gpio1_16 (файл BB-STER-TEST-00A0.dts):

/*
 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
/dts-v1/;
/plugin/;

#include <dt-bindings/board/am335x-bbw-bbb-base.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/am33xx.h>

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black", "ti,beaglebone-green";

/* identification */
part-number = "BB-STER-01";
version = "00A0";

/* state the resources this cape uses */
exclusive-use =
"P9.24", // uart1_txd
"P9.26", // uart1_rxd
"uart1", // hardware ip used

"P9.13", // uart4_txd
"P9.11", // uart4_rxd
"uart4", // hardware ip used

/* the pin header uses */
"P9.19", /* i2c2_sda */
"P9.20", /* i2c2_scl */
/* the hardware ip uses */
"i2c2",

/* the pin header uses */
"P9.17", /* spi0_cs0 */
"P9.18", /* spi0_d1 */
"P9.21", /* spi0_d0 */
"P9.22", /* spi0_sclk */
/* the hardware ip uses */
"spi0",

  "P9.15",        // сигнал от платы поддержки питания на выключение
  "gpio1_16";

fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
bb_uart1_pins: pinmux_bb_uart1_pins {
pinctrl-single,pins = <
BONE_P9_24 (PIN_OUTPUT | MUX_MODE0) // uart1_txd.uart1_txd
BONE_P9_26 (PIN_INPUT | MUX_MODE0) // uart1_rxd.uart1_rxd
>;
};
};
};

fragment@1 {
target = <&uart1>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_uart1_pins>;
};
};

fragment@2 {
target = <&am33xx_pinmux>;
__overlay__ {
bb_uart4_pins: pinmux_bb_uart4_pins {
pinctrl-single,pins = <
BONE_P9_13 (PIN_OUTPUT | MUX_MODE6) // gpmc_wpn.uart4_txd_mux2
BONE_P9_11 (PIN_INPUT  | MUX_MODE6) // gpmc_wait0.uart4_rxd_mux2
>;
};
};
};

fragment@3 {
target = <&uart4>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_uart4_pins>;
};
};

fragment@4 {
target = <&am33xx_pinmux>;
__overlay__ {
bb_i2c2_pins: pinmux_bb_i2c2_pins {
pinctrl-single,pins = <
0x178 0x73 /* i2c2_sda, SLEWCTRL_SLOW | INPUT_PULLUP | MODE3 */
0x17c 0x73 /* i2c2_scl, SLEWCTRL_SLOW | INPUT_PULLUP | MODE3 */
>;
};
};
};

fragment@5 {
target = <&i2c2>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_i2c2_pins>;

/* this is the configuration part */
clock-frequency = <100000>;

#address-cells = <1>;
#size-cells = <0>;
};
};


fragment@6 {
target = <&am33xx_pinmux>;
__overlay__ {
/* default state has all gpios released and mode set to uart1 */
bb_spi0_pins: pinmux_bb_spi0_pins {
pinctrl-single,pins = <
0x150 0x30 /* spi0_sclk.spi0_sclk, INPUT_PULLUP | MODE0 */
0x154 0x30 /* spi0_d0.spi0_d0, INPUT_PULLUP | MODE0 */
0x158 0x10 /* spi0_d1.spi0_d1, OUTPUT_PULLUP | MODE0 */
0x15c 0x10 /* spi0_cs0.spi0_cs0, OUTPUT_PULLUP | MODE0 */
>;
};
};
};

fragment@7 {
target = <&spi0>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_spi0_pins>;

spidev0: spi@0 {
compatible = "spidev";
reg = <0>;
spi-max-frequency = <500000>;
};
};
};

fragment@8 {
target = <&am33xx_pinmux>;
__overlay__ {
pinmode_p9_15: pinmux_gpio_1_16 {
pinctrl-single,pins = < BONE_P9_15 0x3F >;
};
};
};

fragment@9 {
target = <&ocp>;
__overlay__ {
pinmux_gpio_1_16 {
pinctrl-0 = <&pinmode_p9_15>;
                 compatible = "bone-pinmux-helper";
status = "okay";
pinctrl-names = "default";
};
};
};

};


Для монитора Lilliput, работающего у нас на разрешении 640x480, оверлей будет выглядеть следующим образом (файл BB-STER-VGA-01-00A0.dts):

/*
 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
/dts-v1/;
/plugin/;

#include <dt-bindings/board/am335x-bbw-bbb-base.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/am33xx.h>

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black", "ti,beaglebone-green";

/* identification */
part-number = "BB-STER-VGA-01";
version = "00A0";

/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P8.45", /* lcd: lcd_data0 */
"P8.46", /* lcd: lcd_data1 */
"P8.43", /* lcd: lcd_data2 */
"P8.44", /* lcd: lcd_data3 */
"P8.41", /* lcd: lcd_data4 */
"P8.42", /* lcd: lcd_data5 */
"P8.39", /* lcd: lcd_data6 */
"P8.40", /* lcd: lcd_data7 */
"P8.37", /* lcd: lcd_data8 */
"P8.38", /* lcd: lcd_data9 */
"P8.36", /* lcd: lcd_data10 */
"P8.34", /* lcd: lcd_data11 */
"P8.35", /* lcd: lcd_data12 */
"P8.33", /* lcd: lcd_data13 */
"P8.31", /* lcd: lcd_data14 */
"P8.32", /* lcd: lcd_data15 */
"P8.27", /* lcd: lcd_vsync */
"P8.29", /* lcd: lcd_hsync */
"P8.28", /* lcd: lcd_pclk */
"P8.30", /* lcd: lcd_ac_bias_en */
"lcdc",
"tscadc";

fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {

bb_lcd_lcd_pins: pinmux_bb_lcd_lcd_pins {
pinctrl-single,pins = <
0xa0 0x08 /* lcd_data0.lcd_data0, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xa4 0x08 /* lcd_data1.lcd_data1, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xa8 0x08 /* lcd_data2.lcd_data2, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xac 0x08 /* lcd_data3.lcd_data3, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xb0 0x08 /* lcd_data4.lcd_data4, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xb4 0x08 /* lcd_data5.lcd_data5, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xb8 0x08 /* lcd_data6.lcd_data6, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xbc 0x08 /* lcd_data7.lcd_data7, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xc0 0x08 /* lcd_data8.lcd_data8, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xc4 0x08 /* lcd_data9.lcd_data9, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xc8 0x08 /* lcd_data10.lcd_data10, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xcc 0x08 /* lcd_data11.lcd_data11, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xd0 0x08 /* lcd_data12.lcd_data12, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xd4 0x08 /* lcd_data13.lcd_data13, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xd8 0x08 /* lcd_data14.lcd_data14, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xdc 0x08 /* lcd_data15.lcd_data15, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xe0 0x00 /* lcd_vsync.lcd_vsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
0xe4 0x00 /* lcd_hsync.lcd_hsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
0xe8 0x00 /* lcd_pclk.lcd_pclk, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
0xec 0x00 /* lcd_ac_bias_en.lcd_ac_bias_en, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
>;
};
};
};

fragment@1 {
target = <&lcdc>;
__overlay__ {
status = "okay";
};
};

fragment@2 {
target = <&tscadc>;
__overlay__ {

compatible = "ti,am3359-tscadc";
reg = <0x44e0d000 0x1000>;
interrupt-parent = <&intc>;
interrupts = <16>;
ti,hwmods = "adc_tsc";
status = "okay";

tsc {
compatible = "ti,am3359-tsc";
  };

adc {
compatible = "ti,am3359-adc";
ti,adc-channels = <0 1 2 3 4 5 6 7>;
};
};
};

fragment@3 {
target-path="/";
__overlay__ {

/* avoid stupid warning */
#address-cells = <1>;
#size-cells = <1>;

panel {
compatible = "tilcdc,panel";
pinctrl-names = "default";
pinctrl-0 = <&bb_lcd_lcd_pins>;
panel-info {
ac-bias           = <255>;
ac-bias-intrpt    = <0>;
dma-burst-sz      = <16>;
bpp               = <16>;
fdd               = <0x80>;
tft-alt-mode      = <0>;
stn-565-mode      = <0>;
mono-8bit-mode    = <0>;
sync-edge         = <0>;
sync-ctrl         = <1>;
raster-order      = <0>;
fifo-th           = <0>;
};
display-timings {
native-mode = <&timing0>;
timing0: 640x480 {
hactive         = <640>;
vactive         = <480>;
hback-porch     = <48>;
hfront-porch    = <16>;
hsync-len       = <96>;
vback-porch     = <33>;
vfront-porch    = <10>;
vsync-len       = <2>;
clock-frequency = <30000000>;
hsync-active    = <0>;
vsync-active    = <0>;
};
};
};
};
};
};

Для монитора HDMI (файл BB-STER-HDMI-01-00A0.dts):

/*
 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
/dts-v1/;
/plugin/;

#include <dt-bindings/board/am335x-bbw-bbb-base.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/am33xx.h>

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black", "ti,beaglebone-green";

/* identification */
part-number = "BB-STER-HDMI-01";
version = "00A0";

/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P8.45", /* lcd: lcd_data0 */
"P8.46", /* lcd: lcd_data1 */
"P8.43", /* lcd: lcd_data2 */
"P8.44", /* lcd: lcd_data3 */
"P8.41", /* lcd: lcd_data4 */
"P8.42", /* lcd: lcd_data5 */
"P8.39", /* lcd: lcd_data6 */
"P8.40", /* lcd: lcd_data7 */
"P8.37", /* lcd: lcd_data8 */
"P8.38", /* lcd: lcd_data9 */
"P8.36", /* lcd: lcd_data10 */
"P8.34", /* lcd: lcd_data11 */
"P8.35", /* lcd: lcd_data12 */
"P8.33", /* lcd: lcd_data13 */
"P8.31", /* lcd: lcd_data14 */
"P8.32", /* lcd: lcd_data15 */
"P8.27", /* lcd: lcd_vsync */
"P8.29", /* lcd: lcd_hsync */
"P8.28", /* lcd: lcd_pclk */
"P8.30", /* lcd: lcd_ac_bias_en */
"lcdc",
"tscadc";


fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {

nxp_hdmi_bonelt_pins: nxp_hdmi_bonelt_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x9b0, PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr0 */
AM33XX_IOPAD(0x8a0, PIN_OUTPUT | MUX_MODE0) /* lcd_data0.lcd_data0 */
AM33XX_IOPAD(0x8a4, PIN_OUTPUT | MUX_MODE0) /* lcd_data1.lcd_data1 */
AM33XX_IOPAD(0x8a8, PIN_OUTPUT | MUX_MODE0) /* lcd_data2.lcd_data2 */
AM33XX_IOPAD(0x8ac, PIN_OUTPUT | MUX_MODE0) /* lcd_data3.lcd_data3 */
AM33XX_IOPAD(0x8b0, PIN_OUTPUT | MUX_MODE0) /* lcd_data4.lcd_data4 */
AM33XX_IOPAD(0x8b4, PIN_OUTPUT | MUX_MODE0) /* lcd_data5.lcd_data5 */
AM33XX_IOPAD(0x8b8, PIN_OUTPUT | MUX_MODE0) /* lcd_data6.lcd_data6 */
AM33XX_IOPAD(0x8bc, PIN_OUTPUT | MUX_MODE0) /* lcd_data7.lcd_data7 */
AM33XX_IOPAD(0x8c0, PIN_OUTPUT | MUX_MODE0) /* lcd_data8.lcd_data8 */
AM33XX_IOPAD(0x8c4, PIN_OUTPUT | MUX_MODE0) /* lcd_data9.lcd_data9 */
AM33XX_IOPAD(0x8c8, PIN_OUTPUT | MUX_MODE0) /* lcd_data10.lcd_data10 */
AM33XX_IOPAD(0x8cc, PIN_OUTPUT | MUX_MODE0) /* lcd_data11.lcd_data11 */
AM33XX_IOPAD(0x8d0, PIN_OUTPUT | MUX_MODE0) /* lcd_data12.lcd_data12 */
AM33XX_IOPAD(0x8d4, PIN_OUTPUT | MUX_MODE0) /* lcd_data13.lcd_data13 */
AM33XX_IOPAD(0x8d8, PIN_OUTPUT | MUX_MODE0) /* lcd_data14.lcd_data14 */
AM33XX_IOPAD(0x8dc, PIN_OUTPUT | MUX_MODE0) /* lcd_data15.lcd_data15 */
AM33XX_IOPAD(0x8e0, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* lcd_vsync.lcd_vsync */
AM33XX_IOPAD(0x8e4, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* lcd_hsync.lcd_hsync */
AM33XX_IOPAD(0x8e8, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* lcd_pclk.lcd_pclk */
AM33XX_IOPAD(0x8ec, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* lcd_ac_bias_en.lcd_ac_bias_en */
>;
};
nxp_hdmi_bonelt_off_pins: nxp_hdmi_bonelt_off_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x9b0, PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr0 */
>;
};
};
};

fragment@1 {
target = <&lcdc>;
__overlay__ {
status = "okay";
port {
lcdc_0: endpoint@0 {
remote-endpoint = <&hdmi_0>;
};
};
};
};

fragment@2 {
target = <&i2c0>;
__overlay__ {
tda19988 {
compatible = "nxp,tda998x";
reg = <0x70>;
pinctrl-names = "default", "off";
pinctrl-0 = <&nxp_hdmi_bonelt_pins>;
pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>;

port {
hdmi_0: endpoint@0 {
remote-endpoint = <&lcdc_0>;
};
};
};
};
};

fragment@3 {
target = <&tscadc>;
__overlay__ {

compatible = "ti,am3359-tscadc";
reg = <0x44e0d000 0x1000>;
interrupt-parent = <&intc>;
interrupts = <16>;
ti,hwmods = "adc_tsc";
status = "okay";

tsc {
compatible = "ti,am3359-tsc";
  };

adc {
compatible = "ti,am3359-adc";
ti,adc-channels = <0 1 2 3 4 5 6 7>;
};
};
};
};

Использованный материал:
1) https://github.com/beagleboard/beaglebone-black/wiki/System-Reference-Manual
2) https://github.com/beagleboard/bb.org-overlays/blob/master/readme.md
3) https://learn.adafruit.com/introduction-to-the-beaglebone-black-device-tree/overview
4) http://www.jumpnowtek.com/beaglebone/BeagleBone-Black-pinmuxing-and-other-device-tree-notes.html
5) http://kilobaser.com/blog/2014-07-28-beaglebone-black-devicetreeoverlay-generator
6) http://elinux.org/EBC_Exercise_11a_Device_Trees
7) http://www.devicetree.org/specifications
8) http://elinux.org/Device_Tree_Reference
9) http://elinux.org/Device_Tree_Usage
10) http://elinux.org/Capemgr
11) https://mazdermind.wordpress.com/2016/07/31/bbblack-lcd-cape-with-the-latest-debian-jessie-kernel-4-4/
12) http://www.weigu.lu/sb-computer/bbb_device_tree/index.html

пятница, 1 марта 2019 г.

Автоматическое построение парадигмы форм глагола на основе словаря Зализняка

AOT, freeling:
1) FreeLing Home Page http://nlp.lsi.upc.edu/freeling/
2) Проект АОТ от выпускников РГГУ http://aot.ru/technology.html

Применения морфологичекого словаря Зализняка:
1) Море полезной информации, в том числе морфологический словарь Зализняка, по которому можно определить ударение в слове, в виде текстового файла и в виде dbf-файла http://starling.rinet.ru/intrab.php?lan=ru
2) Грамматический словарь (cоздатель программы rhymes)
http://rifmovnik.ru/dict_grammatical.htm
3) Про словарь Зализняка (создатель библиотеки mcr.dll) http://macrocosm.narod.ru/lingvo.html
(на сайте много контекстной рекламы)

Морфологические анализаторы:
1) Разбор естественного языка: грамматическая нотация https://habr.com/ru/post/255073/
2) Реализация морфологического поиска на Kohana (библиотека phpMorphy) 

синтаксис:
1) Синтаксический анализ в NLTK. Продолжение https://habr.com/ru/post/342162/
2) Google выложила на GitHub инструмент для создания систем, распознающих синтаксис естественных языков https://tproger.ru/news/google-amazing-parsey-mcparseface/

тональность:
1) Обучаем компьютер чувствам (sentiment analysis по-русски) https://habr.com/ru/post/149605/
2) Анализ тональности текста с помощью Azure Machine Learning
https://habr.com/ru/post/243705/

ntlk:
1) Знакомство с Python, машинным обучением и библиотекой NLTK https://www.ibm.com/developerworks/ru/library/os-pythonnltk/index.html
2) Natural Language Processing with Python http://www.nltk.org/book/

книги:
1) «Обработка естественного языка в действии» https://habr.com/ru/companies/piter/articles/512790/

работа с корпусами текстов:
1) «Он видел их семью своими глазами» (про разметку корпусов текстов)
https://habr.com/ru/post/152799/

разное:
1) Парсим русский язык https://habr.com/ru/post/148124/
2) Определение части речи слов в русском тексте (POS-tagging) на Python 3
https://habr.com/ru/post/125988/
4) Визуализация новостей рунета https://habr.com/ru/company/ods/blog/460287/
6) Lemmatizer for text in English https://github.com/yohasebe/lemmatizer
7) Заметки об NLP (часть 6) https://habr.com/ru/post/79923/
8) Языки России в Интернете https://habr.com/ru/post/408411/
9) Векторные модели и русская литература https://habr.com/ru/post/326380/
10) Языковой барьер и NLP. Почему чат-боты нас не понимают? https://habr.com/ru/company/binarydistrict/blog/422609/
11) Открытый курс «Deep Learning in NLP» от создателей DeepPavlov на базе курса cs224n
https://habr.com/ru/company/ods/blog/487172/

12) Война, мир и ABBYY Compreno: продолжение нашего романа с Толстым https://habr.com/ru/company/abbyy/blog/273301/
13) Нейросеть Google Translate составила единую базу смыслов человеческих слов https://habr.com/ru/post/369913/

14) Морфология: Памяти А. А. Зализняка. Часть IV https://sysblok.ru/nlp/morfologija-pamjati-a-a-zaliznjaka-chast-iv/
15) Парсим словарь русского языка Зализняка Андрея Анатольевича https://habr.com/ru/post/97440/

ml + nlp:

Ещё:
1) А. А. За­ли­з­няк Гра­м­ма­ти­че­с­кий сло­варь ру­с­с­ко­го язы­ка. Сло­во­и­з­ме­не­ние https://gramdict.ru/