我想提取带删除线的单词,即 <w:delText>
标签。我使用了一个表达式,它成功提取了它,只是有些单词出现了损坏。例如单词"They"
显示为 'T'
和'hey'
。下面给出的是问题仍然存在的 xml 示例:
<w:delText
xml:space="preserve">.
</w:delText></w:r><w:r
w:rsidR="0020338C"
w:rsidDel="00147CFE"><w:rPr><w:rFonts
w:ascii="Times
New
Roman"
w:hAnsi="Times
New
Roman"/><w:sz
w:val="24"/></w:rPr><w:delText>T</w:delText></w:r><w:r
w:rsidR="00DF6A7D"
w:rsidDel="00147CFE"><w:rPr><w:rFonts
w:ascii="Times
New
Roman"
w:hAnsi="Times
New
Roman"/><w:sz
w:val="24"/></w:rPr><w:delText>hey</w:delText></w:r></w:del><w:ins
w:id="5"
w:author="Author"
w:date="2014-08-13T10:08:00Z"><w:r
w:rsidR="00147CFE"><w:rPr><w:rFonts
w:ascii="Times
New
Roman"
w:hAnsi="Times
New
Roman"/><w:sz
w:val="24"/></w:rPr><w:t
xml:space="preserve">
that
helps
them</w:t></w:r></w:ins>
我使用了以下代码:
find = etree.XPath("//w:p//.//*[local-name() = 'delText']//text()" ,namespaces={'w':"http://schemas.openxmlformats.org/wordprocessingml/2006/main"})
list_of_deleted_words = (find(lxml_tree))
我怎样才能解决这个问题?
编辑:
我意识到问题只出在包含大写字母的单词上,像“She”、“He”这样的单词也会被拆分。
最佳答案
It is the words.." They" should be counted as one word rather than two (that my code is doing currently).
问题的出现是因为文本片段被任意地放入多个所谓的“运行”中。在 OOXML 中,文本按 w:p
元素(段落)组织,如下所示(简化结构):
<w:p>
<w:r>
<w:t>Simpli</w:t>
</w:r>
<w:r>
<w:t>fied structures</w:t>
</w:r>
</w:p>
如您所见,实际文本位于 w:t
元素内,而这些元素又位于 w:r
元素(即“run”)内。不幸的是,这种单独运行的划分是如此随意,以至于它只能是任意的。据我所知,没有人知道如何选择开始新的运行。
现在,转向你的问题,w:delText
也在运行中。在那里,运行的碎片化似乎也纯粹是任意的。
使用您当前的方法,无法知道特定 w:delText
的文本内容是否是一个完整的单词。为此,您必须考虑整个运行序列,包括包含普通文本的运行序列和包含已删除文本的运行序列。
这很可能会起作用,因为已删除的文本仍在其被删除的位置上运行。显示 OpenXML 2003,略有不同,但这并不重要:
<w:r>
<w:t>Normal Text before deletion </w:t>
</w:r>
<aml:annotation aml:id="0"
w:type="Word.Deletion"
aml:author="Mathias Müller"
aml:createdate="2014-09-26T22:25:00Z">
<aml:content>
<w:r wsp:rsidDel="00F647B7">
<w:delText>T</w:delText>
</w:r>
</aml:content>
</aml:annotation>
<aml:annotation aml:id="1"
w:type="Word.Deletion"
aml:author="Mathias Müller"
aml:createdate="2014-09-26T22:24:00Z">
<aml:content>
<w:r wsp:rsidDel="00F647B7">
<w:delText>hey </w:delText>
</w:r>
</aml:content>
</aml:annotation>
<w:r>
<w:t>Normal Text after deletion </w:t>
</w:r>
换句话来说,
- 如果连续有两个“已删除的运行”(或更多),并且其中任何一个都没有空格,那么您就知道它们只是一个单词的一部分。
至于单词边界,
- 如果已删除的运行前面有一个正常的运行,并且它们之间有空格(无论是在正常运行的末尾还是已删除的运行的开头),您就知道已删除的运行开始了一个新单词
- 如果删除的词组前面有一个没有任何空格的正常词组,那么您应该得出结论,仅删除了单词的一部分,并且此删除的词组不是整个单词
- 对于紧随其后的正常运行的已删除运行,上述所有情况反之亦然,无论它们之间有或没有空格。
当然,我们都知道依靠空格来区分单词是一种粗略的方法,但在这种情况下可能就足够了。
关于python - 文本提取中的断词, Lxml Xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26057180/