Определение слова без регулярных выражений

Можно ли обойтись словами без использования Regex в F#?

Я хочу знать, как я могу написать функцию F#, которая вводит строку и связывает ее.

например.

input = "going"
output = "go"

Я не могу найти способ написать код без использования регулярного выражения: .* Ing\b и функции замены, что было бы почти как в C# без каких-либо преимуществ.

Полупсевдокод того, что я пытаюсь написать:

let stemming word = 
   match word
    |(word-"ing")+ing -> (word-"ing")

2 ответа

Решение

Вот функция, применяющая простейшее правило стволов:

let (|Suffix|_|) (suffix: string) (s: string) =
    if s.EndsWith(suffix) then
        Some(s.Substring(0, s.Length - suffix.Length))
    else
        None

let stem = function
    | Suffix "ing" s -> s
    | _ -> failwith "Not ending with ing"

Параметризованные активные шаблоны делают сопоставление с образцом более читабельным и более удобным в этом случае. Если сложные правила усложняются, вы можете обновить активные шаблоны, чтобы сохранить stem функция без изменений.

Небольшая попытка поиска в Google показывает, насколько сложным является определение: http://en.wikipedia.org/wiki/Stemming

Похоже, что стандартом является "Алгоритм Портера", кажется, что некоторые люди перенесли его на.NET, я считаю две версии C# и версию VB.net на домашней странице "Алгоритм портерации Портера": http://tartarus.org/martin/PorterStemmer/

Я бы использовал одну из этих библиотек из F#, чтобы сделать stemming.

Другие вопросы по тегам