Определение слова без регулярных выражений
Можно ли обойтись словами без использования 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.