Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Excel/Word VBA中的连续段落中提取全名和姓氏_Excel_Vba_Ms Word_Nlp - Fatal编程技术网

从Excel/Word VBA中的连续段落中提取全名和姓氏

从Excel/Word VBA中的连续段落中提取全名和姓氏,excel,vba,ms-word,nlp,Excel,Vba,Ms Word,Nlp,第一件事:宏是从Excel VBA编辑器运行的,但它的大部分工作是在以前打开的Word文档上执行的,其目标是查找正在分析的协议中作为缔约方的人员的全名 我在代码中遇到的问题是,我需要从每个连续的段落中提取可变的字数。如果名字是Will SMITH,那么我需要用两个词,当它是Carrie Ann MOSS时,它是三个词,有时它可以是Anna Nicole SMITH BURKE,而不是它的四个词,但是当它是Anna Nicole SMITH-BURKE时,它比它的五个词还要多,依此类推 另一个获得

第一件事:宏是从Excel VBA编辑器运行的,但它的大部分工作是在以前打开的Word文档上执行的,其目标是查找正在分析的协议中作为缔约方的人员的全名

我在代码中遇到的问题是,我需要从每个连续的段落中提取可变的字数。如果名字是Will SMITH,那么我需要用两个词,当它是Carrie Ann MOSS时,它是三个词,有时它可以是Anna Nicole SMITH BURKE,而不是它的四个词,但是当它是Anna Nicole SMITH-BURKE时,它比它的五个词还要多,依此类推

另一个获得这个全名的想法是,它总是以昏迷结束,而这个昏迷总是本段中出现全名的第一个昏迷

注意!!!我们处理的段落不是
列表段落
。它们是普通/普通的,尽管有缩进和编号。我从那些不喜欢使用编号列表的人那里得到这些合同:-(
因此,最后一次:在我们处理的段落中,没有启用编号列表

这就是它在Word中的外观,所选单词是宏应该从文档中提取的名称和姓氏-不包括最后一个姓氏后的coma


在每个段落的
…下一个段落的
循环中,我需要你帮助写几行代码,识别提取全名/姓名+姓氏/姓氏需要提取多少单词,其他什么都没有-我们以第一个昏迷结束-这意味着排除最后一个姓氏后的昏迷。

这实际上是个问题关于自然语言处理——NLP(作为科学领域)——你已经解决了标记化问题,但你现在面临着:部分句子(词性)标记(以及语义块的构建)。个人身份识别问题是该学科诞生以来的第一个问题,因此,有许多库可用于此,但我怀疑您是否能从VBA中找到任何可以如此简单使用的工具。此外,要获得全面/可靠的解决方案,您将需要包含姓名和姓氏的适当词典(合适的资源将是形态词典/词典,仅为PName LName标签提取)

要解决这个问题,您必须对上面提到的关键字进行一些研究。我没有VBA方面的经验,但asume C#和.NET是最容易集成的。因此,Standford CoreNLP for.NET将是我确认的起点:

与英语高度相关的词汇来源:


您可以使用查询WordNet词典。我已经使用了这两种语言及其非常好的资源和库。

这实际上是自然语言处理的问题-NLP(作为科学领域)-您已经解决了标记化问题,但您现在面临的是:部分句子(POS)标记(以及语义块的构造)。个人身份识别问题是该学科诞生以来的第一个问题,因此,有许多库可用于此,但我怀疑您是否能从VBA中找到任何可以如此简单使用的工具。此外,要获得全面/可靠的解决方案,您将需要包含姓名和姓氏的适当词典(合适的资源将是形态词典/词典,仅为PName LName标签提取)

要解决这个问题,您必须对上面提到的关键字进行一些研究。我没有VBA方面的经验,但asume C#和.NET是最容易集成的。因此,Standford CoreNLP for.NET将是我确认的起点:

与英语高度相关的词汇来源:


您可以使用查询WordNet词典。我已经使用了这两种词典及其非常好的资源和库。

如果我理解正确,这可能会满足您的需要

如果
编号
不是段落的一部分,则要提取全名,可以使用:

Debug.Print Left(Para, InStr(Para, ",") - 1)
如果
编号
是段落的一部分,则:

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

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

如果要将名称的大写部分与其余部分分开,请将实际字符串的几个示例作为文本发布,因为我无法将您的屏幕截图复制/粘贴到Excel中。

如果我理解正确,这可能会满足您的要求

如果
编号
不是段落的一部分,则要提取全名,可以使用:

Debug.Print Left(Para, InStr(Para, ",") - 1)
如果
编号
是段落的一部分,则:

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

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

如果你想把名字的大写部分与其他部分分开,请将实际字符串的几个示例作为文本发布,因为我无法将你的截图复制/粘贴到Excel中。

我的第一个想法是使用
RegEx
RegEx解决方案不会给出可靠的结果*。在这方面有整个科学领域这个问题一点也不小。*想想:当你有一个来自荷兰或比利时的人时会发生什么?或者有两个姓的情况(在斯拉夫世界并不罕见)是的。我在华沙工作,所以斯拉夫国家是我的居住地,这里已婚女性的标准是双姓/姓。但有人能帮我使用另一种方法吗:从每一段的开头提取所有内容,直到正在处理的第一段。啊,你们有带k的结构化文本nown structure.Uf,我有很多想法,可以用C#解决这个问题,但不能用VBA。在这里,您还可以使用XML/XPath方法从文档的XML结构中仅获取列表项(docx实际上是一个zip,当您解压缩它时,您将看到~content.XML。从那里您可以获取每个项/节点的内部文本,并进行字符串搜索“,”获取子字符串。但无法在VBA中交谈,因此,我没有直接帮助:)获取列表项的XML节点(按标记名)