Разбивка текста на предложения и слова - 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();
}