алгоритмы, стеммер, техничка5, c#
- понедельник, ноября 16, 2009 - 3 коммент.
Выделение основы слова. Стеммер Портера
Привет!
Сегодня, я расскажу про стемминг и его применение.
Что такое стемминг?
Стемминг - это процесс нахождения основы слова. Например, для слова "приставка" основой будет "приставк", а корнем слова "став".
Далее... Зачем нужен стемминг?
Обычно в простых поисковых системах, в которых не требуется учет морфологии, применяется стемминг для обобщения пользовательских запросов.
В этих поисковых системах документы разбиваются на множества основ слов.
Поиск осуществляется по основам слова.
Реализация алгоритма стемминга на C#
Применение стеммера
Источники
Стемминг
Russian stemming algorithm
Эвристическое (без словаря) извлечение корня из русского слова
Вероятностный морфологический анализатор русского и украинского языков
Сегодня, я расскажу про стемминг и его применение.
Что такое стемминг?
Стемминг - это процесс нахождения основы слова. Например, для слова "приставка" основой будет "приставк", а корнем слова "став".
Далее... Зачем нужен стемминг?
Обычно в простых поисковых системах, в которых не требуется учет морфологии, применяется стемминг для обобщения пользовательских запросов.
В этих поисковых системах документы разбиваются на множества основ слов.
Поиск осуществляется по основам слова.
Реализация алгоритма стемминга на C#
- using System.Text.RegularExpressions;
- using System;
- namespace Stemmer.RU
- {
- /// <summary>
- /// Stemmer
- /// </summary>
- class Porter
- {
- public const string VERSION = "0.2";
- private const string VOWEL = "аеиоуыэюя";
- private const string PERFECTIVEGROUND = "((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))$";
- private const string REFLEXIVE = "(с[яь])$";
- private const string ADJECTIVE = "(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|еых|ую|юю|ая|яя|ою|ею)$";
- private const string PARTICIPLE = "((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)))$";
- private const string VERB = "((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$";
- private const string NOUN = "(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|и|ы|ь|ию|ью|ю|ия|ья|я)$";
- private const string RVRE = "^(.*?[аеиоуыэюя])(.*)$";
- private const string DERIVATIONAL = "[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?$";
- private const string SUPERLATIVE = "(ейше|ейш)?";
- /// <summary>
- /// Parses stemm of the word
- /// </summary>
- /// <param name="word"></param>
- /// <returns>Stemm of the word</returns>
- public string Stemm(string word)
- {
- word = word.ToLower();
- word = word.Replace("ё", "е");
- if (IsMatch(word, RVRE))
- {
- // Step 1
- if (!Replace(ref word, PERFECTIVEGROUND, "")) {
- Replace(ref word, REFLEXIVE, "");
- if (Replace(ref word, ADJECTIVE, "")) {
- Replace(ref word, PARTICIPLE, "");
- }
- else {
- if (!Replace(ref word, VERB, "")) {
- Replace(ref word, NOUN, "");
- }
- }
- }
- // Step 2
- Replace(ref word, "и$", "");
- // Step 3
- if (IsMatch(word, DERIVATIONAL)) {
- Replace(ref word, "ость?$", "");
- }
- // Step 4
- if (!Replace(ref word, "ь$", "")) {
- Replace(ref word, SUPERLATIVE, "");
- Replace(ref word, "нн$", "н");
- }
- }
- return word;
- }
- private bool IsMatch(string word, string matchingPattern)
- {
- return new Regex(matchingPattern).IsMatch(word);
- }
- private bool Replace(ref string replace, string cleaningPattern, string by)
- {
- string original = replace;
- replace = new Regex(cleaningPattern,
- RegexOptions.ExplicitCapture|
- RegexOptions.Singleline
- ).Replace(replace, by);
- return original != replace;
- }
- }
- }
- using System;
- using Stemmer.RU;
- namespace Stemmer
- {
- class Program
- {
- static void Main(string[] args)
- {
- Porter p = new Porter();
- while (true) {
- Console.WriteLine("Введите слово:");
- string input = Console.ReadLine();
- if (input != "выйти") {
- Console.WriteLine("Основа слова \"" + input + "\": " + p.Stem(input));
- }
- else {
- break;
- }
- }
- }
- }
- }
Стемминг
Russian stemming algorithm
Эвристическое (без словаря) извлечение корня из русского слова
Вероятностный морфологический анализатор русского и украинского языков
Выявлен баг. Класс неправильно выделяет основу слова.
Баг исправлен
Спасибо за стеммер! Очень выручили!