Первым шагом будет создание функции, которая может генерировать n-грамму для заданной строки. Один из способов сделать это в векторной форме — использовать умную индексацию.
function [subStrings, counts] = n_gram(fullString, N)
if (N == 1)
[subStrings, ~, index] = unique(cellstr(fullString.')); %.'# Simple case
else
nString = numel(fullString);
index = hankel(1:(nString-N+1), (nString-N+1):nString);
[subStrings, ~, index] = unique(cellstr(fullString(index)));
end
counts = accumarray(index, 1);
end
При этом используется функция HANKEL, чтобы сначала создать матрицу индексов, которая будет выбрать каждый набор уникальных подстрок длины N из данной строки. Индексация данной строки с помощью этой индексной матрицы создаст массив символов с одной подстрокой N-длины на строку. Затем функция CELLSTR помещает каждую строку массива символов в ячейку. массива ячеек. Затем функция UNIQUE удаляет повторяющиеся подстроки, а функция ACCUMARRAY используется для подсчета вхождений каждой уникальной подстроки (если они необходимы для какой-либо причине).
С помощью приведенной выше функции вы можете легко подсчитать количество n-грамм, разделенных между двумя строками, используя ПЕРЕСЕЧЕНИЕ:
subStrings1 = n_gram('tool',2);
subStrings2 = n_gram('fool',2);
sharedStrings = intersect(subStrings1,subStrings2);
nShared = numel(sharedStrings);
person
gnovice
schedule
27.07.2009