Size: a a a

Natural Language Processing

2020 November 08

AK

Anton Kazennikov in Natural Language Processing
Проще всего через trie
источник

AK

Anton Kazennikov in Natural Language Processing
Если надо совсем быстро, то через алгоритм Кнута-Морриса-Пратта https://en.m.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm
источник

SZ

Sergey Zhuravlev in Natural Language Processing
Спасибо, а trie это что?
источник

AC

Anton Cherepkov in Natural Language Processing
Sergey Zhuravlev
Спасибо, а trie это что?
источник

SZ

Sergey Zhuravlev in Natural Language Processing
Спасибо, думаю теперь понятно куда двигаться, KMP вроде подходит
источник

9

9dogs🐍 in Natural Language Processing
Sergey Zhuravlev
Добрый день. Поделитесь плиз опытом. Есть задача в реальном времени быстро находить бренд в строке. Вопрос не в том каким образом его находить (через левенштейна, регулярки, словари и т.д.), а в том, какой способ позволит делать это максимально быстро, при условии что есть таблица в БД с брендами на несколько сотен тысяч записей. На вход подается строка, в которой может присутствовать бренд. Сейчас я для скорости подгружаю бренды в редис, чтобы искать в оперативке. Но может есть какой то  общий правильный подход чтобы было не O(n), а быстрее, может можно как то векторизовать это все и держать в заранее подгруженной модели. Из того что пробовал: https://bergvca.github.io/2017/10/14/super-fast-string-matching.html и его инструмент string_grouper https://github.com/Bergvca/string_grouper
Да, trie используется в частности в алгоритме Ахо-Корасик, позволяет находить все подстроки за один проход по тексту
источник

AC

Anton Cherepkov in Natural Language Processing
А за линию как-то можно найти все подстроки, т.ч. расстояние левенштейна <= const ?
Ну или хотя бы быстрее чем O(|text| * |total_patterns_length|) ?
источник

AC

Anton Cherepkov in Natural Language Processing
А есть какие-нибудь хэш-функции, которые монотонно зависят от расстояния левенштейна?
И которые можно быстро пересчитывать для подотрезков?
источник

DD

David Dale in Natural Language Processing
Sergey Zhuravlev
Добрый день. Поделитесь плиз опытом. Есть задача в реальном времени быстро находить бренд в строке. Вопрос не в том каким образом его находить (через левенштейна, регулярки, словари и т.д.), а в том, какой способ позволит делать это максимально быстро, при условии что есть таблица в БД с брендами на несколько сотен тысяч записей. На вход подается строка, в которой может присутствовать бренд. Сейчас я для скорости подгружаю бренды в редис, чтобы искать в оперативке. Но может есть какой то  общий правильный подход чтобы было не O(n), а быстрее, может можно как то векторизовать это все и держать в заранее подгруженной модели. Из того что пробовал: https://bergvca.github.io/2017/10/14/super-fast-string-matching.html и его инструмент string_grouper https://github.com/Bergvca/string_grouper
Если достаточно поиска по точному совпадению, то алгоритм Ахо-Корасика супер быстро работает: он компилирует все искомые строки в один граф, и все их вхождения за один проход выделяет. И есть удобная питонячья библиотека: https://pyahocorasick.readthedocs.io/en/latest/.
Ахо-Корасик - это обобщение КМП на случай, когда может быть много разных вхождений.
источник

SZ

Sergey Zhuravlev in Natural Language Processing
Круто, но точным пока и не пахнет) часто бывают опечатки или интерпретированное автором правильное написание на русском иностранного слова (э/е, о/ё и т.д.)
источник

DD

David Dale in Natural Language Processing
Sergey Zhuravlev
Круто, но точным пока и не пахнет) часто бывают опечатки или интерпретированное автором правильное написание на русском иностранного слова (э/е, о/ё и т.д.)
Как вариант, можно для каждого бренда заранее генерировать множество всевозможных способов его написания, а потом таки использовать поиск по точному совпадению с одним из этих вариантов.
источник

SZ

Sergey Zhuravlev in Natural Language Processing
Это да
источник

AF

Alexander Fedorenko in Natural Language Processing
ИМХО, как вариант (несложный вариант) стоит проверить используя https://pypi.org/project/lexpy/ для trie (сам ее использую из-за простоты)
Учитывая что в опечатках может начало не совпадать с правильным написанием бренда, я бы выстраивал два дерева, для слов в прямом порядке(читаем слово слева -направо) и для тех же слов в инверсном (справа-налево) и уже полученные варианты брендов из обоих вариантов сверял бы с названиями в тексте
Хотя возможны варианты, что  опечатки настолько "опечатанны", что можно допустить и попадание  наименований нескольких брендов под одно анализируемое слово)
источник

DS

Damir Safix in Natural Language Processing
подскажите, пытаюсь поиграться с gpt-2, при запуске команды python src/interactive_conditional_samples.py --top_k 40
Traceback (most recent call last):
 File "src/interactive_conditional_samples.py", line 7, in <module>
   import tensorflow as tf
 File "C:\Users\Asus\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\__init__.py", line 24, in <module>
   from tensorflow.python import *
 File "C:\Users\Asus\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\__init__.py", line 52, in <module>
   from tensorflow.core.framework.graph_pb2 import *
 File "C:\Users\Asus\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\core\framework\graph_pb2.py", line 6, in <module>
   from google.protobuf import descriptor as _descriptor
 File "C:\Users\Asus\AppData\Local\Programs\Python\Python36\lib\site-packages\google\protobuf\descriptor.py", line 48, in <module>
   from google.protobuf.pyext import _message
ImportError: DLL load failed: Не найдена указанная процедура.
источник

YB

Yuri Baburov in Natural Language Processing
Trie, по словам, без опечаток -- это O(1), если у вас первичная проверка слов в bloom filter (а потом хеш-таблицы для подтверждения). Если надо варианты с 1 опечаткой проверять -- то просто удаляйте каждую букву по разу при поиске (и trie делайте со всеми вариантами удалений буквы) + вариант без удаления.
Ну и кеширование ещё можно добавить к такой схеме.
У нас если я правильно помню за 0.01 сек для новостного текста работала версия без опечаток по такой схеме в 2007 году.
источник

AO

Alex Orgish in Natural Language Processing
Если база помещается в память, то обычный dictionary работает практически не медленнее trie (посчитать хеш строки, взять его по модулю и и потом по этому индексу извлечь value). Если база в память не помещается, то вместо  redis можно попробовать взять embedded key-value db,  рекомендую lmdb (  https://lmdb.readthedocs.io/en/release/), можно ее форки типа roksdb и др. Не будет затрат на коммуникацию между процессами, по аналогии sqlite против серверных sql. И для ключей лучше использовать хеши вместо строк.
источник
2020 November 09

M

Mahima in Natural Language Processing
источник

BS

Bogdan Salyp in Natural Language Processing
Sergey Dulikov
$0.2 - 2080 Ti, до $0.5 Tesla V100, 3090
Посмотрел на выходных, посчитал - если использовать 24/7 (что имеет смысл, если машина используется как сервак), самый бюджетный вариант - $0.2 в час за 2080Ti
И при этом диска гигов 300 (при том, что датасеты весят обычно от дцати Гб до бесконечности, а одно сохранение модели - 1-2Гб)
$0.2/час == 188 000 р/год (при $1 == 80р), всё ещё очень дорого
Имхо, собрать комп с 3080 дешевле (они стоят 80к)
источник

SD

Sergey Dulikov in Natural Language Processing
Там не про серваки история, а быстро арендовать, посчитать и вырубить
источник

SD

Sergey Dulikov in Natural Language Processing
Сервак на каком-нибудь selectel можно посмотреть
источник