Как я могу проанализировать большой файл DOCX и выбрать ключевые слова / строки, которые появляются n раз в python? - PullRequest
1 голос
/ 09 января 2020

У меня есть очень большие файлы DOCX, которые я собирался проанализировать, и смог создать базу данных, которая показывает частоту слова / строки в документах. Из того, что я понял, это определенно непростая задача. Я просто надеялся на какое-то направление относительно библиотеки, которую я мог бы использовать, чтобы помочь мне с этим.

enter image description here

Это пример того, что можно выглядит как. Структура не согласована, поэтому это также усложнит ситуацию. Любое направление будет оценено !!!

1 Ответ

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

Python решение на основе

Если (согласно вашему комментарию) вы можете сделать это в Python, посмотрите на следующие фрагменты:

Итак, первое, что нужно понять в том, что файлы docx на самом деле являются архивами .zip, содержащими несколько XML файлов. Большая часть текстового контента будет храниться в word/document.xml. Word делает некоторые сложные вещи с нумерованными списками, что потребует от вас также загрузки других XML-файлов, таких как styles.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    

Spacy будет размечать текст для вас и может многое сделать с точки зрения распознавания именованных объектов, тегов части речи и т. Д. c.

...