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

Vasar

Client
Регистрация
08.04.2010
Сообщения
150
Благодарностей
75
Баллы
28
Помогите пожалуйста запустить данный код в своём коде:

Код:
namespace NLP.Tokenizer
{
    public class Tokenizer
    {
        private int start = 0;

        //Основной метод. Принимает на текст, и возвращает список отдельных предложений
        public List<string> SplitText(string text)
        {
            List<string> resultSenteces = new List<string>();
            bool flag = true;
            start = GetPointIndex(text.Substring(start));
          
            //Цикл работает до тех пор, пока не будет получено последнее предложение.
            // После чего флаг устанавливается в false
            while (flag)
            {
                start = GetPointIndex(text);

                if (start != text.Length)
                { 
                    //Сохраняем предложение в списке. Обновляем текст. Теперь он не будет
                    //содержать сохраненное предложение, что позволит сокращать время
                    //работы с каждой итерацией.
                    resultSenteces.Add((text.Substring(start - start, start + 1)));
                    text = text.Substring(start + 1);
                }
                else
                {
                    resultSenteces.Add(text);
                    flag = false;
                }
            }

            return (SentecesJoiner(resultSenteces));
        }


        //Метод, склеивающий "ложные" предложения с реальным предложением,
        //то есть находятся очень короткие предложения, которые зачастую
        //являются сокращениями "т.е." и так далее.
        private List<string> SentecesJoiner(List<string> sentences )
        {
            List<string> shortWords = new List<string>();

            string result = "";

            foreach (string sentence in sentences)
            {
                if(sentence.Length <= 4 && sentence != "")
                {
                    shortWords.Add(sentence);
                }

            }
            foreach (string word in shortWords)
            {
                result = sentences[sentences.IndexOf(word) - 1] + word + sentences[sentences.IndexOf(word) + 1];

                sentences.Insert(sentences.IndexOf(word) + 2, result);
                sentences.RemoveRange(sentences.IndexOf(word) - 1, 3);
            }
            sentences.Remove("");
            return sentences;
        }
        //Метод нахождения ближайшего знака препинания.
        private int GetPointIndex(string text)
        { 
            //Сохраняем индексы ближайших знаков в массив, затем сортируем его.
            //Это позволит извлекать индекс ближайшего знака.
            List<int> result = new List<int>{text.IndexOf('.'), text.IndexOf('!'), text.IndexOf('?')};
            result.Sort();

            if (result[0] >= 0)
            {
                return result[0];
            }
            else if (result[1] >= 0)
            {
                return result[1];
            }
            else if (result[2] >= 0)
            {
                return result[2];
            }
            return text.Length;
        }
    }
}
Тут одна функция вызывает остальные две. Я так понимаю их нужно как-то склеить.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 454
Благодарностей
8 678
Баллы
113
может я не понял для чего и зачем этот монстроидальный код..

но вот такой простой регуляркой я из спарсенного текста выделяю предложения:
Код:
[А-Я].*?\.
берет из сплошной текстовки предложения (от заглавной буквы до точки)
заодно, по совместительству, "чистит" текст от мусорных частей, не являющихся предложениями (вернее не чистит, а обходит их, как бы).. можно дополнить регулярку и сделать чистку тегов внутри предложений, которые часто попадаются в спарсенном тексте.. заодно получается автоматически еще одна важная функция - обходятся стороной кракозябры в другой кодировке.
 
Последнее редактирование:

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 454
Благодарностей
8 678
Баллы
113
опять я не обратил внимание на то что тема про Снипеты..
прошу прощения..
но все же..
зачем делать сложно, если можно сделать просто?
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
Ахахах))) хороший вопрос) по сути кстати эта функция очень похожа на то, что делает регулярное выражение) ну т.е. алгоритм поиска)
 

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 310
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

опять я не обратил внимание на то что тема про Снипеты..
прошу прощения..
но все же..
зачем делать сложно, если можно сделать просто?
Если предложение закончилось на:
...
!
?
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
[А-Я].*?\. | [А-Я].*?\! | [А-Я].*?\?
Не?
 

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 310
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

[А-Я].*?\. | [А-Я].*?\! | [А-Я].*?\?
Не?
не!
а если инглишь будет?
проверял ее?
Проверь даже вариант A-Z:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu erat tempus, bibendum massa eget, adipiscing magna. Nulla ac metus venenatis tortor venenatis molestie eu eget ligula. Suspendisse ac eros at mauris placerat varius vitae eu sapien. Proin molestie varius risus, ac commodo neque volutpat ac. Phasellus tincidunt semper convallis. Nunc sed nibh risus. Sed rhoncus nibh sed vehicula commodo. Nullam bibendum, nunc at gravida sollicitudin, turpis orci tristique libero, eget tincidunt felis ipsum non lorem. In lacus metus, venenatis id sem id, tempus viverra sem. Sed volutpat non urna nec sollicitudin. Morbi sagittis, lacus eget ornare volutpat, nibh leo molestie quam, eget mattis tellus ante vel odio. Vivamus hendrerit placerat nulla rhoncus hendrerit. Sed egestas ultricies nisi, in pellentesque erat tempor ut. Praesent nec tristique nibh, non eleifend eros. Integer fermentum arcu interdum, blandit erat sit amet, sodales tortor.

Nulla eleifend non nisi a venenatis. Mauris non sem a urna ornare luctus et in felis. Quisque sollicitudin felis sed congue placerat. Proin tristique, mauris fringilla accumsan rutrum, risus turpis porta massa, eget placerat metus turpis nec magna. Pellentesque et tortor sed erat gravida adipiscing. Proin id vulputate sapien, et posuere metus. Cras id felis viverra, lobortis tellus non, laoreet enim. Vivamus diam velit, ultrices at placerat tincidunt, sollicitudin ac erat. Sed est risus, sollicitudin sed viverra a, scelerisque at nisi. Morbi porttitor tortor non ligula ornare hendrerit. Nulla ut rutrum augue. Quisque ac nibh purus. Curabitur pulvinar, libero nec malesuada vehicula, lacus orci fringilla nibh, ut hendrerit tortor justo at velit. Ut a egestas elit, a mollis sem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam mattis tortor sit amet risus pellentesque tincidunt.

Nulla facilisi. Fusce imperdiet eu sapien sit amet dictum. Morbi mollis bibendum dolor, at ullamcorper lorem bibendum nec. Nulla nisi eros, convallis ut nibh ac, venenatis bibendum urna. Sed dolor elit, rhoncus eget lectus sit amet, porta dignissim eros. Vivamus quis diam libero. Morbi aliquet sapien ac enim dignissim, sit amet scelerisque mauris rhoncus. Duis eget nunc felis. Nam egestas mauris vitae enim fermentum vehicula. Suspendisse feugiat turpis a lectus dictum lacinia. Donec pretium augue sit amet metus semper, quis malesuada arcu interdum. Morbi interdum rhoncus arcu sed eleifend. Sed et augue ante. Fusce ultricies pulvinar rhoncus.
 
Последнее редактирование:

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 310
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

ну и уже для полноты картины регулярок, давай распарсим такой вариант:

Некий псевдоним родился на р.Мокрая. Жил по ул. Имени некого д.5.кв.10. Учился в институте им.Некого ученого.
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
Елки))) ну вы мне прямо устроили курс молодого регулярщика)))
([А-ЯA-Z].{15,}?\. | [А-ЯA-Z].{15,}?\! | [А-ЯA-Z].{15,}?\?)
http://joxi.ru/PYFPU_3JTJDeaE0AthY

Да можно регулярками эту функцию заменить))) можно)))
 
  • Спасибо
Реакции: GreenWay

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 880
Баллы
113
[А-ЯA-Z].{15,}?(\.|\!|\?)(\ |\r|\n|$)
Вот так больше подходит.
Но ход мысли правильный. Зачем городить такие страшные коды, когда всё решается одной регуляркой? )
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
Да) Ваша регулярка намного техничнее))) я все ту первую накручивал, когда стоило написать новую))))
 

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 310
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

Вы писали регулярку под конкретный пример, что я привел выше.
Это был показательный пример возможного текста.
Стоит поменять предложения местами или изменить и регулярка не подойдет уже.
Основная проблема, что регулярки четко привязаны.

Регулярки не подходят для таких задач. Если нужна 100% точность результата.
 
  • Спасибо
Реакции: KirillOFF

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
Да и функция, которая написана выше, мягко говоря не очень то отличается высокой точностью...
все что короче 4 символов прилепит, но от ошибок не спасет и у неё будут ложные срабатывания. Я как то писал под TextPipe обработчик спаршенного текста, там как раз тоже надо было предложения вычленить, так там было около 30 регулярных выражений для обработки различных случаев, и все равно были ложные срабатывания.
Как бы речь не о том, что лучше)))) речь о том что проще в данной конкретной ситуации)))
 

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 310
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

тот код тоже не варик. он кривой, как и работа регулярок выше в данной задаче.
если тс достаточно такой точности, то покатит любой вариант.
если нужна точность, тот тут нормальный код нужен C#+регулярки.
хотя думаю, если погуглить по вопросу, то есть более изящные методики разбора текста.

п.с. че зацепился за тему. у самого на повестке задача подобного рода. еще не изучал вопрос решения. в сео сейчас топорные варианты боком выходят.
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
задача разбить текст на предложения, или просто получить предложения по теме?
 
Последнее редактирование модератором:

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Благодарностей
1 310
Баллы
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 7make какие-либо сделки.

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
891
Баллы
113
Ого. спасибо за ссылочки, почитаю)
Генерация текста - тоже думал над этим, но у меня возникла сложность с логической составляющей текста.... Можно Панченко налепить предложений, но это будет не то)))
 

Vasar

Client
Регистрация
08.04.2010
Сообщения
150
Благодарностей
75
Баллы
28

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 651
Благодарностей
655
Баллы
113
А может есть у кого то решение не плохое, если парсятся сниппеты поисковиков, лучше регулярочками или есть какой то код гениальный для хорошого текста?
 

GreenWay

Client
Регистрация
11.05.2012
Сообщения
428
Благодарностей
132
Баллы
43
Если и есть, то навряд ли кто поделится, самому нужно фантазировать :-)
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 942
Благодарностей
4 334
Баллы
113

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)