Найти ключевые слова в абзацах текста (в Excel)
Изменить: Все ответы работают отлично, но для большого набора данных макро подход работал лучше. Попробуйте все из них и посмотрите, что работает лучше для вас.
Я пытаюсь решить эту проблему в Excel для повышения производительности (я сделал это в R, но это медленно). По сути, мне нужно сопоставить каждое ключевое слово (из списка ключевых слов) с текстом (по существу, абзацами) в столбце. Вот иллюстрация:
Приведенные выше данные находятся в источнике этого вопроса в текстовом виде, пригодном для копирования и вставки.
Я искал некоторые текстовые функции (такие как НАЙТИ и ПОИСК, но они только возвращают позиции), поэтому я не уверен, что это можно сделать в Excel.
3 ответа
Отказ от ответственности:
Сложно оценить эффективность следующей "формулы массива" для огромного набора ключевых слов. Он работает с разумным набором данных и дает "правильные" результаты.
Формула массива для E2
(Тогда автозаполнение столбца E):
E2:
=TEXTJOIN(", ",TRUE,REPT(C$2:C$99999,ISNUMBER(SEARCH(C$2:C$99999,A2))))
CTRL SHIFT ENTER
Как я уже говорил, он был протестирован на "достаточно большом" наборе, скажем, несколько тысяч, поэтому я опубликовал его в качестве общего решения для подобных ситуаций, но у меня есть сомнения по поводу вашего огромного набора в 700 КБ (!).
Также, вероятно, рекомендуется не сохранять формулы, а только использовать их для расчета, затем фиксировать значения и, наконец, удалять пустые ячейки. НТН
Я предполагаю, что ваш дисплей показывает вывод для A6
в E5
(потому что выход для A5
это "нет"), это ошибка, и вы действительно хотите вывод для A6
в E6
,
Я нахожу это неестественным, имея ключевые слова в столбце. Выход для Ai
в Ei
и значение в Ci
на самом деле не имеет ничего общего с другими вещами в Роу i
, Это скорее ситуация m × n, где у вас есть m ячеек (абзацев) текста для поиска и n ключевых слов для поиска. Ну, у нас есть способы справиться с этим.
Мое решение использует n +1 вспомогательных столбцов. Поскольку n здесь равно 5, это означает 6 вспомогательных столбцов, которые могут быть столбцами F
через K
, (Как обычно с помощью вспомогательных столбцов, вы можете поместить их в любое место - вы можете поместить их в столбцы AA
через AF
если хочешь - и можешь их спрятать.)
Первый (F
) оставлено пустым. Войти
=OFFSET($C$1, COLUMN()-COLUMN($F:$F), 0)
в камеру G1
и перетащите / заполните вправо, чтобы K1
, При этом используется текущий номер столбца (относительно начала блока вспомогательных столбцов) в качестве индекса в столбце. C
ключевые слова, тем самым реплицируя ключевые слова в строке 1 (ячейки G1
через K1
).
Далее введите
=F2 & IF(ISNUMBER(SEARCH(G$1, $A2)), ", " & G$1, "")
в камеру G2
, Перетащите / заполните вправо, в ячейку K2
, а затем вниз, чтобы покрыть m строк, которые имеют данные в столбце A
, Это ищет абзац в столбце A
текущей строки для i- го ключевого слова, которое находится в строке 1 текущего столбца. Если он находит это (то есть, если SEARCH(…)
возвращает номер; т.е. если ISNUMBER(SEARCH(…))
это правда), он генерирует ключевое слово, которому предшествует запятая и пробел. Если он не находит ключевое слово, IF(…)
Функция оценивается как нулевая строка. (Если вы хотите сравнение с учетом регистра, замените SEARCH
с FIND
.) Затем в любом случае результат объединяется со значением из ячейки слева. Это дает в столбце K
, разделенный запятыми список ключевых слов, присутствующих в абзаце в столбце A
текущего ряда.
Затем введите
=IF(K2="", "", RIGHT(K2, LEN(K2)-2))
в E2
и перетащите / заполните вниз, чтобы покрыть строки, которые имеют данные в столбце A
, Это говорит, если значение в столбце K
является нулевым, затем оцените как нулевое, в противном случае удалите ,
с начала значения в столбце K
,
Вот изображение результата, который я получил для ваших входных данных:
(Нажмите для увеличения изображения.)
Примечание в клетке E6
(выход для A6
) что мое решение перечисляет соответствующие ключевые слова в порядке их появления в столбце C
тогда как ваша иллюстрация перечисляет их в порядке их появления в ячейке A6
, Если это проблема, отредактируйте свой вопрос, чтобы сказать так, и я посмотрю, смогу ли я это исправить.
Попробуйте этот короткий макрос:
Sub KeyWord()
Dim Na As Long, Nc As Long, ary, s As String
Dim r As Range, a, i As Long, outpt As String
Na = Cells(Rows.Count, "A").End(xlUp).Row
Nc = Cells(Rows.Count, "C").End(xlUp).Row
ReDim ary(1 To Nc)
i = 1
For Each r In Range("C1:C" & Nc)
ary(i) = r.Text
i = i + 1
Next r
For i = 1 To Na
s = Cells(i, "A").Value
outpt = ""
For Each a In ary
If InStr(1, s, a) > 0 Then
outpt = outpt & "," & a
End If
Next a
If outpt = "" Then
Else
Cells(i, "E").Value = Mid(outpt, 2)
End If
Next i
End Sub
например:
EDIT#1:
Наш маленький трюк, чтобы захватить только полные слова, состоит в том, чтобы окружить каждое ключевое слово пробелами и каждое предложение пробелами.
Это означает, что [пробел] [пробел] не будет соответствовать театру!
Sub KeyWord_II_TheSequel()
Dim Na As Long, Nc As Long, ary, s As String
Dim r As Range, a, i As Long, outpt As String
Na = Cells(Rows.Count, "A").End(xlUp).Row
Nc = Cells(Rows.Count, "C").End(xlUp).Row
ReDim ary(1 To Nc)
i = 1
For Each r In Range("C1:C" & Nc)
ary(i) = r.Text
ary(i) = " " & ary(i) & " "
i = i + 1
Next r
For i = 1 To Na
s = Cells(i, "A").Value
s = " " & s & " "
outpt = ""
For Each a In ary
If InStr(1, s, a) > 0 Then
outpt = outpt & "," & a
End If
Next a
If outpt = "" Then
Else
Cells(i, "E").Value = Mid(outpt, 2)
End If
Next i
End Sub