используйте linq, чтобы написать новый файл - PullRequest
1 голос
/ 24 апреля 2019

Итак, я пытаюсь создать новый файл на основе информации, полученной из XDocument, который у меня есть

 XDocument doc = XDocument.Load(@"path.to.x.document");
        StreamWriter sw = new StreamWriter(WriteFile);
        var variabila = (from x in doc.Descendants("sentence").Elements("word")
                      select new
                      {
                          lemma = x.Attribute("lemma")?.Value,
                          postag = x.Attribute("postag")?.Value
                      }).ToSOMETHING; //Here i need to store it to something so later I can use that something like this

Так как лемма SOMETHING может иметь одно и то же значение для разных постагов, также постаг может иметь одинаковое значение для разных лемм, например:

lemma="somf" postag="S321"
lemma="areq" postag="O213"
lemma="somf" postag="O213"
lemma="werid" postag="S321"

Так что мне нужно записать в файл, как это. В основном, если это конец предложения, он будет идти в новой строке.

if(SOMETHING.lemma == "." || SOMETHING.lemma == "!")
{
    sw.WriteLine(SOMETHING.lemma);
}
else
{
    sw.Write(SOMETHING.lemma + " " + SOMETHING.postag);
}

Я пытался использовать Lookup и Dictionary, но если я использую словарь, я получаю исключение, так как словарь не может хранить один и тот же ключ дважды, и поиск избегает этого исключения, но мне нужны они в том порядке, в котором они появляются для формирования предложений на основе леммы и постаг только в новом файле.

1 Ответ

0 голосов
/ 24 апреля 2019

Если я вас правильно понимаю, то, например, у вас будет следующий xml:

<root>
    <sentence>
       <word lemma="somf" postag="S321" />
       <word lemma="areq" postag="O213" />
       <word lemma="somf" postag="O213" />
       <word lemma="werid" postag="S321" />
       <word lemma="." postag="" />
    </sentence>
    <sentence>
       <word lemma="areq" postag="O213" />
       <word lemma="somf" postag="S321" />
       <word lemma="werid" postag="S321" />
       <word lemma="somf" postag="O213" />
       <word lemma="." postag="" />
    </sentence>
</root>

И вы хотите, чтобы ваш файл записывался как:

somf S321 areq O213 somf O213 werid S321.
areq O213 somf S321 werid S321 somf O213.

Обратите внимание, что я предполагаю, что вы получаете . или ! в качестве последнего элемента, но вы можете играть с ним по мере необходимости.

Тогда вы можете просто перебрать каждый sentence и его word s( см. Скрипку ):

using(StreamWriter stream = new StreamWriter("result.txt"))
{
    XDocument doc = XDocument.Load(@"path.to.x.document");
    var sentences = doc.Descendants("sentence");
    foreach (var sentence in sentences)
    {
        var line = string.Empty;
        var words = sentence.Elements("word");
        var lastWord = words.LastOrDefault();
        foreach (var word in words.Take(words.Count()-1))
        {
            line = string.join(
               " ",
               line,
               word.Attribute("lemma").Value,
               word.Attribute("postag").Value
            );
        }
        line = string.Join(string.Empty, line, lastWord.Attribute("lemma").Value);
        stream.WriteLine(line);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...