Разбивка текста на предложения и слова - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Мозги кипят, может кто поможет. Есть задача примерно следующего характера: прочитать из файла текст, разбив на предложения; предложения в свою очередь на слова. Загвоздка в том, что файл может быть достаточно большой, поэтому нужно сделать это всё как минимум с помощью регулярных выражений (что собсно не проблема).

Но никак не доходит до меня, как правильно засунуть сначала слова в предложения, а потом уже предложения в текст.

Это же всё по сути нужно сделать уже при чтении. Рационально ли будет всё же получить сразу весь текст в string переменную, а потом уже с ним работать? Ведь если читать по строкам файла, то невозможно разобрать, где конец предложения. Прикладываю то, что сейчас есть:
class Loader
    {
        public static Text ReadFromFile(string filename)
        {
            Text text = new Text();
            //List<Sentence> sentences = new List<Sentence>();
            List<Word> sentWords = new List<Word>();
            string tempText;
 
            try
            {
                using (StreamReader streamReader = new StreamReader(filename))
                {
                    while (!streamReader.EndOfStream)
                    {
                        //streamReader.ReadLine()
                        //text.Sentences.Add(StringWork.SplitString(streamReader.ReadLine(), "(?![^\.]\s+)(?![^\.]\s+[\("`'])(["\`\']?[А-ЯA-Z][^\.\!\?]*(.)*?)(?=[\.\!\?](\s|\Z))"));
                        tempText = streamReader.ReadToEnd();
 
                        for (int i = 0; i < tempText.Length; i++)
                        {
                            
                        }

                    }
                }
            }
            catch (System.IO.IOException e)
            {
                //  ("An error occurred: '{0}'", e);
            }
 
            return text;
        }
    }

Также вспомогательные классы:

class Text
    {
        public List<Sentence> Text = new List<Sentence>();
 
        public Text(List<Sentence> sentences)
        {
            Text = sentences;
        }
 
        public Text()
        {
 
        }
 
        public void AddSentence(Sentence sentence)
        {
            Text.Add(sentence);
        }
    }
 
class Sentence
    {
        public List<Word> Sent = new List<Word>();
        public PunctuationMark PunctMark = new PunctuationMark();
 
        public Sentence(List<Word> words)
        {
            Sent = words;
        }
 
        public Sentence()
        {
            
        }
 
        public void AddWord(Word word)
        {
            Sent.Add(word);
        }
    }
 
    class Word
    {
        public string Word;
    }
 
    public class StringWork
    {
        public static string[] SplitString(string input, string pattern)
        {
            string[] result = Regex.Split(input, pattern, RegexOptions.IgnoreCase);
 
            return result;
        }
    }

Решение задачи: «Разбивка текста на предложения и слова»

textual
Листинг программы
static string[] GetProposals(string s)
{
    var proposals = new List<string>();
    var lastIndex = 0;
 
    for (int i = 0; i < s.Length; i++)
    {
        if (s[i] == '.' && s.Length == i + 1)
        {
            var p = s.Substring(lastIndex, i - lastIndex + 1);
            proposals.Add(p);
            break;
        }
 
        if (s[i] == '.' && s.Length > i + 2 && s[i + 1] == ' ' && char.IsUpper(s[i + 2]))
        {
            var p = s.Substring(lastIndex, i - lastIndex + 1);
            proposals.Add(p);
            lastIndex = i + 2;
        }
    }
 
    return proposals.ToArray();
}
 
static string[] GetWords(string s)
{
    var split = Regex.Split(s, @"\b");
    return split.Where(z => !string.IsNullOrWhiteSpace(z)).ToArray();
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5
Похожие ответы