Создать несколько узлов с одинаковыми именами с подузлами - PullRequest
2 голосов
/ 12 марта 2019

У меня есть текстовый файл, я проанализировал его с помощью Python, используя библиотеку xml.etree.cElementTree. Во входных данных у меня есть параграф <p>, содержащий предложения <s>, в каждом предложении есть слова <w>, вот текстовый файл, как он выглядит:

This
is
my
first
sentence.
This
is
my
second
sentence.

В выводе я хотел бы иметь следующий XML-файл:

<p>
   <s>
      <w>this</w>
      <w>is</w>
      <w>my</w>
      <w>first</w>
      <w>sentence</w>
      <pc>.</pc>
   </s>
   <s>
      <w>this</w>
      <w>is</w>
      <w>my</w>
      <w>second</w>
      <w>sentence</w>
      <pc>.</pc>
   </s>
</p>

Я написал следующий код на python, который дает мне тэг абзаца и тэг слова, и я не знаю, как реализовать кейс, чтобы иметь несколько тэгов <s>. Предложение начинается с заглавной буквы и заканчивается точкой. Мой код Python:

source_file = open("file.txt", "r")
for line in source_file:
    # catch ponctuation : . and , and ! and ? and ()
    if re.match("(\(|\)|\.|\,|\!)", str(line)):
        ET.SubElement(p, "pc").text = line
    else:
        ET.SubElement(p, "w").text = line

tree.write("my_file.xml", encoding="UTF-8", xml_declaration=True)

следующий вывод xml:

<?xml version="1.0" encoding="UTF-8"?>
<p>
   <w>this</w>
   <w>is</w>
   <w>my</w>
   <w>first</w>
   <w>sentence</w>
   <pc>.</pc>
   <w>this</w>
   <w>is</w>
   <w>my</w>
   <w>second</w>
   <w>sentence</w>
   <pc>.</pc>
</p>

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу создать новый тег <s> для каждого нового предложения. Есть ли способ сделать это с помощью библиотеки xml, использующей python?

1 Ответ

1 голос
/ 12 марта 2019

В основном вам понадобится логика для определения нового предложения.Не обращая внимания на очевидные части, что-то вроде следующего должно сделать,

import os
eos = False
s = ET.SubElement(p, 's')
for line in source_file:
    line = str(line).rstrip(os.linesep) #to remove new line char at the end of each line
    # catch ponctuation : . and , and ! and ? and ()
    if re.match("(\(|\)|\.|\,|\!)", line):   #don't think this matches 'sentence.', you will need to verify
        ET.SubElement(s, "pc").text = line
        eos = True
    else:
        if eos and line.strip() and line[0].isupper():
            s = ET.SubElement(p, 's')
        eos = False
        ET.SubElement(s, "w").text = line

Кроме того, вашему регулярному выражению может потребоваться исправление

...