Найти ключевые слова в абзацах текста (в 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
Другие вопросы по тегам