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.