Число повторений определенного слова в ячейке

Автор radius, 19 марта 2021, 12:04

0 Пользователи и 1 гость просматривают эту тему.

radius

Какой формулой можно подсчитать число повторений определенного слова в ячейке?

economist

#1
Читаю "определенного" как "нескольких определенных", поэтому сразу предлагаю полное решение:
- Текст по столбцам (слова вытянутся вправо)
- Транспонировать в столбец A (слова вытянутся вниз), именовать диапазон - "СЛОВА".
- Вставить 5 строк вверху и Расширенный фильтр - Только уникальные
- В первой уникальной строке - написать формула вида =СЧЁТЕСЛИ(СЛОВА;A5)
- Протянуть формулу вниз
- Получим  список всех уникальных слов и число их повторов.

Ежли слово и правда одно, то подстроку в строке ищет функция =НАЙТИ() и ПОИСК(), а чтобы найти число вхождений (если их немного) - можно их вложить функцию N раз для поиска N-го вхождения.

Можно использовать крайне быстрые и изощренные строковые методы Python в Calc, сведя задачу к:

'а б в а г д в а'.count('а') # = 3

UPD: После установки расширения pystring.oxt - в Calc можно писать такие формулы:


=PYSTRING("count";"тут много много слов";"слов")
=PYSTRING("count";A1;B1)


Помимо count реализовано еще 50 методов: изм. регистра, поиск, реверс, транслит, разбивка, партицирование итд. Расширение и примеры тут:   

https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=83856&p=389632
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

eeigor

Или реализовать макрос
=COUNT_WORDS(Текст;Слово)

Можно воспользоваться методикой "заменить – сравнить длину"
https://www.ablebits.com/office-addins-blog/2016/06/16/how-to-count-words-excel/
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

radius

Спасибо, узнал много нового, буду пробовать

rami

Формулой:
=(LEN(A1)-LEN(SUBSTITUTE(A1;B1;"")))/LEN(B1)
или
=(ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(A1;B1;"")))/ДЛСТР(B1)

eeigor

#5
По смыслу предложенной мной ссылки... но можно реализовать это чуть иначе:

Используем REGEX(РЕГВ), далее навскидку со смартфона:

A1="Текст из слов"
A2="Слово"
A3=REGEX(A1;"(?i)\b"&A2&"\b";"";"g")

A4=(LEN(A1)-LEN(A3))/LEN(A2)

UPD
Комментарий. Принцип тот же, как и у @rami
Регулярное выражение означает:
(?i)  без учёта регистра символов
\b  граница слова, в выражении этих границ – 2: до и после; "boundary" означает "граница"

Параметр функции "g" (по умолчанию) – глобальная замена по всему тексту всех слов на пустую строку (см. третий аргумент функции).


Вычитаем из длины исходного текста длину полученного (уже без слов), не забывая разделить результат на длину слова, и получаем количество слов.

В тексте: "Да, да, продано давно!" – найдём количество слов "да".
Мой вариант найдёт только два слова (и это первые два слова), формула от @rami, похоже, найдёт 4... нет 3 (с учётом регистра).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

А если по существу вопроса, то формула @rami и проще, и её, как правило, должно хватать.
Данные в поле (ячейке) должны быть атомарными, то есть неделимыми.
Усложнённая обработка текста косвенно свидетельствуют о том, что хранение ваших данных в таблице организовано неправильно.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

radius


rami

Протестируйте формулу на всех возможных вариантах данных, в некоторых случаях вы можете получить не тот результат что хотите. Если нужно учитывать только целые слова, то "SUBSTITUTE()", нужно заменить на "REGEX()" (как предложил eeigor).

radius

Странно, SUBSTITUTE работает REGEX - нет. Файл прилагаю.

rami

Функция REGEX появилась в LibreOffice 6.2. Если ваш офис новее, то должна работать следующая формула (для ячейки C2):
=(LEN(A2)-LEN(REGEX(A2;"(?i)\b" & D2 & "\b";"";"g")))/LEN(D2)

radius

Да, заработало как надо, спасибо. Офис 7.0.1.2

eeigor

#12
@radius, а такое выражение
(?i)\b(\w+)\b.*?\b\1\b
выявит все проблемные строки, в которых любое слово повторяется хотя бы один раз.

Но вы не говорите нам, что вы там отлавливаете... :)
К сожалению, выражение выше не работает как надо, если границы слова тоже заключить в группу, чтобы не дублировать их при обратной ссылке. Поэтому так.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

radius

Да, отлавливаю слова, дублирующиеся несколько раз в одной ячейке (в подавляющем большинстве - дважды). Таблица примерно 40000 строк, в каждой ячейке не более 350 символов. Пока планирую использовать сначала вот этот способ https://forumooo.ru/index.php/topic,7420.0/msg,48962.html , путем некоторых манипуляций найду самые часто повторяющиеся слова, затем при помощи формулы из этой темы отфильтровывать строки в которых конкретное слово повторяется 2 и более раза и вручную править. От ручной правки не уйти.

eeigor

#14
А в чём содержание правок и почему вручную? Объём приличный... Текст конфидециальный?
Распишите подробнее, что-нибудь предложим
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community