Большое спасибо Конраду за начало решения!
Я попробовал ваш код и получил следующий результат:
Text = "Hello I am a test Also I am a test"
(I also included whitespace as a separator)
frequencies now has 9 items:
---------------------
Keys: "Hello", "I"
Value: 1
---------------------
Keys: "I", "am"
Value: 1
---------------------
Keys: "am", "a"
Value: 1
---------------------
Keys: "a", "test"
Value: 1
---------------------
Keys: "test", "Also"
Value: 1
---------------------
Keys: "Also", "I"
Value: 1
---------------------
Keys: "I", "am"
Value: 1
---------------------
Keys: "am", "a"
Value: 1
---------------------
Keys: "a", "test"
Value: 1
---------------------
Мой первый вопрос: не должны ли 3 последние пары ключей получить значение 2, поскольку они встречаются в тексте два раза?
Второе: причина, по которой я попал в n-граммный подход, заключается в том, что я не хочу ограничивать количество слов (n) определенной длиной. Есть ли способ создать динамический подход, который сначала пытается найти соответствие самой длинной фразы, а затем перейти к последнему количеству слов в 2?
Моя цель для приведенного выше примера запроса:
---------------------
Match: "I am a test"
Frequency: 2
---------------------
Match: "I am a"
Frequency: 2
---------------------
Match: "am a test"
Frequency: 2
---------------------
Match: "I am"
Frequency: 2
---------------------
Match: "am a"
Frequency: 2
---------------------
Match: "a test"
Frequency: 2
---------------------
Для этого существует аналогичный подход C ++, написанный Хатемом Мостафой на codeproject.com: Алгоритм N-граммы и быстрого извлечения паттерна
К сожалению, я не эксперт по C ++ и не знаю, как преобразовать этот бит кода, поскольку он включает в себя большую обработку памяти, чего нет в .Net. Единственная проблема в этом примере состоит в том, что вы должны указать минимальную длину словарного массива, и я хочу, чтобы она была динамической от 2 до максимально найденной.