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

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

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

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

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

Это же всё по сути нужно сделать уже при чтении. Рационально ли будет всё же получить сразу весь текст в string переменную, а потом уже с ним работать? Ведь если читать по строкам файла, то невозможно разобрать, где конец предложения. Прикладываю то, что сейчас есть:
Листинг программы
  1. class Loader
  2. {
  3. public static Text ReadFromFile(string filename)
  4. {
  5. Text text = new Text();
  6. //List<Sentence> sentences = new List<Sentence>();
  7. List<Word> sentWords = new List<Word>();
  8. string tempText;
  9. try
  10. {
  11. using (StreamReader streamReader = new StreamReader(filename))
  12. {
  13. while (!streamReader.EndOfStream)
  14. {
  15. //streamReader.ReadLine()
  16. //text.Sentences.Add(StringWork.SplitString(streamReader.ReadLine(), "(?![^\.]\s+)(?![^\.]\s+[\("`'])(["\`\']?[А-ЯA-Z][^\.\!\?]*(.)*?)(?=[\.\!\?](\s|\Z))"));
  17. tempText = streamReader.ReadToEnd();
  18. for (int i = 0; i < tempText.Length; i++)
  19. {
  20. }
  21.  
  22. }
  23. }
  24. }
  25. catch (System.IO.IOException e)
  26. {
  27. // ("An error occurred: '{0}'", e);
  28. }
  29. return text;
  30. }
  31. }

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

Листинг программы
  1. class Text
  2. {
  3. public List<Sentence> Text = new List<Sentence>();
  4. public Text(List<Sentence> sentences)
  5. {
  6. Text = sentences;
  7. }
  8. public Text()
  9. {
  10. }
  11. public void AddSentence(Sentence sentence)
  12. {
  13. Text.Add(sentence);
  14. }
  15. }
  16. class Sentence
  17. {
  18. public List<Word> Sent = new List<Word>();
  19. public PunctuationMark PunctMark = new PunctuationMark();
  20. public Sentence(List<Word> words)
  21. {
  22. Sent = words;
  23. }
  24. public Sentence()
  25. {
  26. }
  27. public void AddWord(Word word)
  28. {
  29. Sent.Add(word);
  30. }
  31. }
  32. class Word
  33. {
  34. public string Word;
  35. }
  36. public class StringWork
  37. {
  38. public static string[] SplitString(string input, string pattern)
  39. {
  40. string[] result = Regex.Split(input, pattern, RegexOptions.IgnoreCase);
  41. return result;
  42. }
  43. }

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

textual
Листинг программы
  1. static string[] GetProposals(string s)
  2. {
  3.     var proposals = new List<string>();
  4.     var lastIndex = 0;
  5.  
  6.     for (int i = 0; i < s.Length; i++)
  7.     {
  8.         if (s[i] == '.' && s.Length == i + 1)
  9.         {
  10.             var p = s.Substring(lastIndex, i - lastIndex + 1);
  11.             proposals.Add(p);
  12.             break;
  13.         }
  14.  
  15.         if (s[i] == '.' && s.Length > i + 2 && s[i + 1] == ' ' && char.IsUpper(s[i + 2]))
  16.         {
  17.             var p = s.Substring(lastIndex, i - lastIndex + 1);
  18.             proposals.Add(p);
  19.             lastIndex = i + 2;
  20.         }
  21.     }
  22.  
  23.     return proposals.ToArray();
  24. }
  25.  
  26. static string[] GetWords(string s)
  27. {
  28.     var split = Regex.Split(s, @"\b");
  29.     return split.Where(z => !string.IsNullOrWhiteSpace(z)).ToArray();
  30. }

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


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

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

9   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы