Разбивка текста на предложения и слова - 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();
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д