вытащить полные имена и фамилии / фамилии из последовательных абзацев в Excel / Word VBA - PullRequest
0 голосов
/ 31 января 2020

Перво наперво: макрос запускается из редактора Excel VBA, но выполняет большую часть своей работы над ранее открытым документом Word, где его цель - найти полные имена людей, которые являются договаривающимися сторонами в анализируемое соглашение.

Проблема, с которой я столкнулся при работе с кодом, заключается в том, что это переменное количество слов, которое мне нужно извлечь из каждого последующего абзаца. Если зовут Уилл СМИТ, то два слова, которые мне нужно вытащить, когда это Карр ie Энн МОСС, тогда это три слова, иногда это может быть Анна Николь СМИТ БЕРК, чем четыре слова, но когда это Анна Николь СМИТ… BURKE, чем его пять слов и т. Д.

Другая идея получить это полное имя состоит в том, что оно всегда заканчивается комой, и эта кома всегда является первой комой в этой абзац, где появляется полное имя.

ВНИМАНИЕ !!! Параграфы, с которыми мы работаем, не ListParagraphs. Они нормальные / обычные, хотя с отступом и номером. Я получаю эти контракты от людей, которые не хотят использовать нумерованный список: - (
Так в последний раз: нумерованный список не включен в тех абзацах, с которыми мы работаем.

Вот как это выглядит как в Word, а выбранные слова - это имена и фамилии, которые макрос должен извлечь из документа - исключая кому после последней фамилии.

enter image description here

Sub FindNamesCleanDraftWithLoop()
    'Variables declaration
    Dim WordApp As Word.Application
    Dim WordDoc As Word.Document
    Dim ExcelApp As Excel.Application
    Dim MySheet As Excel.Worksheet
    Dim Para As Word.Paragraph
    Dim Rng As Word.Range
    Dim RngStart As Word.Range
    Dim RngEnd As Word.Range

    Dim TextToFind1 As String
    Dim TextToFind2 As String
    Dim firstName As String
    Dim startPos As Long
    Dim endPos As Long

    Application.ScreenUpdating = False

    'Assigning object variables
    Set WordApp = GetObject(, "Word.Application")
    Set ExcelApp = GetObject(, "Excel.Application")
    Set WordDoc = WordApp.ActiveDocument
    Set MySheet = Application.ActiveWorkbook.ActiveSheet
    'Set MySheet = ExcelApp.ActiveWorkbook.ActiveSheet
    Set Rng = WordApp.ActiveDocument.Content
    TextToFind1 = "REGON 364061169, NIP 951-24-09-783,"
    TextToFind2 = "- ad."

    'InStr function returns a Variant (Long) specifying the position of the first occurrence of one string within another.
    startPos = InStr(1, Rng, TextToFind1) - 1    'here we get 1421, we're looking 4 "TextToFind1"
    endPos = InStr(1, Rng, TextToFind2) - 1      'here we get 2246, we're looking 4 "- ad."
    If startPos = 0 Or endPos = 0 Then Exit Sub
    Rng.SetRange Start:=startPos, End:=endPos
    Debug.Print Rng.Paragraphs.Count

    If startPos = 0 Or endPos = 0 Then
        MsgBox ("Client's names were not found!")
    Else
        'somewhere here I need your help to write some lines that will
        'recognize how many words need to be pulled to extract the full
        'name/names + surname/surnames and nothing else - we end on the first coma.
        For Each Para In Rng.Paragraphs
            firstName = Trim$(Para.Range.Words(3))
            Debug.Print Para.Range.Words(1) & Para.Range.Words(2) & _
                        Para.Range.Words(3) & Para.Range.Words(4) & _
                        Para.Range.Words(5) & Para.Range.Words(6)
        Next Para
    End If
End Sub

Там, в For Each Para ... Next Para l oop, мне нужна ваша помощь, чтобы написать несколько строк, которые распознают, сколько слов нужно извлечь, чтобы извлечь полное имя / имена + фамилию / фамилии и ничего больше - мы заканчиваем первой комой - это означает исключение комы после последней фамилии.

Ответы [ 2 ]

1 голос
/ 31 января 2020

Это может сделать то, что вы хотите, если я правильно понял.

Если Number и Dot являются НЕ частью абзаца, то для извлечения полного имени , вы можете использовать:

Debug.Print Left(Para, InStr(Para, ",") - 1)

Если Number и Dot ARE часть абзаца, то:

   Dim Start As Long, Length As Long
Start = InStr(Para, ".") + 1
Length = InStr(Para, ",") - Start

Debug.Print Trim(Mid(Para, Start, Length))

Если вы хотите отделите заглавную часть имени от остальных, опубликуйте несколько образцов реальных строк как TEXT , поскольку я не могу скопировать / вставить ваши скриншоты в Excel.

1 голос
/ 31 января 2020

Это на самом деле вопрос об обработке естественного языка - НЛП (как поле scientifi c) - проблема токенизации, которую вы уже решили, но сталкиваетесь с: Часть тегов предложения (POS) (и создание semanti c Chunk-s). Проблема распознавания личных данных является одной из первых с самого зарождения дисциплины, поэтому для этого есть много библиотек, но я скептически настроен c, вы найдете все, что вы можете использовать в VBA, так просто. Кроме того, для комплексного / надежного решения вам понадобится правильная лексика с именами и фамилиями (подходящим ресурсом будет Morpho-sintacti c Lexicon / Dictionary, извлеченный только для тегов PName LName).

Чтобы решить эту проблему Вам нужно будет провести исследование по ключевым словам, упомянутым выше. У меня нет опыта работы с VBA, но asume C# и. NET будет проще всего интегрировать. Таким образом, Standford CoreNLP для. NET будет отправной точкой, которую я считаю: https://sergey-tihon.github.io/Stanford.NLP.NET/StanfordCoreNLP.html

Весьма релевантный лексический источник для Engli sh: https://wordnet.princeton.edu/

Вы можете запросить Wor dNet лексику, используя Wor dNet. NET. Я использовал оба, и это очень хороший ресурс и библиотека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...