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