LINUX.ORG.RU

Поиск подстрок в строке

 


0

1

Собственно есть set с некоторыми уникальными значениями (это не только слова, но и группы слов, например 'visual studio'). Есть строки, приходяшие в цикле, надо искать в строках все вхождения всех подстрок из set-а. Как это сделать по людски не изобретая велосипедов? Например, в строке содержится «разработка на c# в visual studio», в set-е содержится 'c#', 'visual studio', 'java'. Надо найти факт наличия в строке и 'c#' и 'visual studio'. Просто цикл в цикле, который по штучке берёт и ищет элементы из set-а в строке забахать, наверное, не самый красивый вариант.

★★★★★

Просто цикл в цикле, который по штучке берёт и ищет элементы из set-а в строке забахать, наверное, не самый красивый вариант.

Из-за таких тэгов как «visual studio» вряд ли получится по другому.

tags = {'c#', 'visual studio', 'java'}
text = 'разработка на c# в visual studio'

print(tags & set(text.split(' ')))
print({*filter(lambda x: x in text, tags)})
{'c#'}
{'visual studio', 'c#'}
vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от peregrine
tags = {'c#', 'visual studio', 'visual', 'java', 'c', 'разработка на'}
text = 'разработка на c# в visual studio'

print(tags & set(text.split(' ')))
print({*filter(lambda x: f' {x} ' in f' {text} ', tags)})

{'c#', 'visual'}
{'c#', 'visual', 'visual studio', 'разработка на'}
vvn_black ★★★★★
()
Ответ на: комментарий от peregrine

Хотя странно как-то. На маленьких данных нормально работает, но на больших строках фигня получается. Возвращает просто set() vvn_black. И самое обидное, непонятно, откуда такое происходит и что виновно.

peregrine ★★★★★
() автор топика
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от i-rinat

ааа, если там предложение и тэг в конце, тогда да - не найдётся. Текст можно предварительно «приготовить», заменить на пробелы всю пунктуацию.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)

Если у тебя текста очень много, то лучше разбить его на слова, привести всё к одному регистру, а потом пройтись по словам слева направо, проверяя, нет ли совпадения от текущего слова в словаре тегов. Если среди тегов много таких, что начинаются с одинаковых слов, можно использовать что-то вроде Ахо-Корасик, только символы будут не отдельные буквы, а целые слова.

i-rinat ★★★★★
()
Ответ на: комментарий от vvn_black

заменить на пробелы всю пунктуацию.

работает до следующего

Салтыков-Щедрин, Михаил Евграфович

anonymous
()
Ответ на: комментарий от anonymous

КемелКейсом записывать в таких случаях.

anonymous
()
Ответ на: комментарий от anonymous

Ну мне 100% точность не требуется, т.к. я датасет скриптом собираю, который по определению не 100% точный, т.к. данные писали люди, в том числе и с ошибками. Запятые и точки слишком часто встречаются, чтобы их игнорировать.

peregrine ★★★★★
() автор топика
Ответ на: комментарий от vvn_black

Зачем ты адовый быддокод выдаёшь, когда сам знаешь, что следует юзать регулярки?

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

не эффективно

Пока устраивает O(N×M), сгодится, хоть и не эффективно. Но если станет не хватать, есть куда двигаться.

i-rinat ★★★★★
()

Создай FSM для каждого элемента в set и линейно иди по строке. Быстро, но по памяти будет не очень.

xpahos ★★★★★
()

По хорошему, если тегов будет действительно много и будет длинные строки, по которым ты ищешь теги, то стоит использовать что-нибудь вроде алгоритма Рабина-Карпа, который позволяет за один проход по строке искать в ней несколько подстрок одновременно. Может даже есть для питона что-то готовое.

anonymous
()
Ответ на: комментарий от anonymous

Всем спасибо. Данные уже собраны. Там всего-то пол гига текста перелопатить надо было и в скорости особой важности не было, т.к. всё упирается в скорость сайта, откуда берутся данные.

peregrine ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.