C# 如何解析一个大的DOCX文件,并找出在python中出现n次的关键字/字符串?

C# 如何解析一个大的DOCX文件,并找出在python中出现n次的关键字/字符串?,c#,nlp,tokenize,docx,C#,Nlp,Tokenize,Docx,我有非常大的DOCX文件,我希望能够解析它们,并能够构建一个数据库,显示文档中单词/字符串的频率。据我所知,这绝对不是一项容易的任务。我只是希望能找到一个图书馆来帮助我解决这个问题 这是一个例子,一个人可能看起来像什么。结构不一致,因此也会使事情复杂化。任何方向都将不胜感激 基于Python的解决方案 如果(根据您的评论)能够在Python中实现这一点,请查看以下代码段: 所以首先要认识到的是,docx文件实际上是包含大量XML文件的.zip归档文件。大多数文本内容将存储在word/docum

我有非常大的DOCX文件,我希望能够解析它们,并能够构建一个数据库,显示文档中单词/字符串的频率。据我所知,这绝对不是一项容易的任务。我只是希望能找到一个图书馆来帮助我解决这个问题

这是一个例子,一个人可能看起来像什么。结构不一致,因此也会使事情复杂化。任何方向都将不胜感激

基于Python的解决方案 如果(根据您的评论)能够在Python中实现这一点,请查看以下代码段:

所以首先要认识到的是,docx文件实际上是包含大量XML文件的.zip归档文件。大多数文本内容将存储在
word/document.xml
中。Word使用编号列表执行一些复杂的操作,这将要求您也加载其他xml,如
style.xml

DOCX文件的标记可能是一个难题,因为文档的结构是w:p(段落)和任意w:r(运行)。这些运行基本上是“一点打字”,所以它可以是一个字母,也可以是几个单词

我们使用来自的UpdateableZipFile。这主要是因为我们还希望能够编辑文档,因此您可以使用其中的片段

import UpdateableZipFile
from lxml import etree

source_file = UpdateableZipFile(os.path.join(path, self.input_file))
nsmap = {'w': "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
         'mc': "http://schemas.openxmlformats.org/markup-compatibility/2006",
        } #you might need a few more namespace definitions if you get funky docx inputs

document = source_file.read_member('word/document.xml') #returns the root of an Etree object based on the document.xml xml tree.

# Query the XML element using xpaths (don't use Regex), this gives the text of all paragraph nodes:
paragraph_list = document.xpath("//w:p/descendant-or-self::*/text()", namespaces=self.nsmap)
然后,您可以将文本馈送到NLP,例如Spacy:

import spacy

nlp = spacy.load("en_core_web_sm")
word_counts = {}

for paragraph in paragraph_list:
    doc = nlp(paragraph)
    for token in doc:
        if token.text in word_counts:
            word_counts[token.text]+=1
        else:
            word_counts[token.text]=1    

将为您标记文本,并可以在命名实体识别、词类标注等方面做更多的工作。

您是否绑定到C++?我们在管道中也做了类似的事情,但主要是使用Python,因为Python有Spacy,这对于NLP来说非常快速和准确regex@T.Altena我想我不一定要使用c#,我们在.NET中还有其他项目组件,所以我认为它是主要的,因为我觉得以后可能会更容易。也许我会试试python路线!谢谢你的提示!