определение слова без регулярных выражений - PullRequest
1 голос
/ 23 февраля 2012

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

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

например.

input = "going"
output = "go"

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

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

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

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

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

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

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

2 голосов
/ 23 февраля 2012

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

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 без изменений.

...