У меня была похожая проблема (биграммы, триграммы, как ваши "облачные вычисления").Я сделал простой список n-грамм, word_3gram, word_2grams и т. Д., С граммой в качестве базовой единицы (cloud_computing).Предположим, у меня есть предложение «Я люблю облачные вычисления, потому что это дешево».Предложение_2gram: «I_like», «like_cloud», «cloud_computing», «computing_because» ... Сравнивая, что ваш список биграмм только «cloud_computing» распознается как допустимый биграмм;все остальные биграммы в предложении являются искусственными.Чтобы восстановить все другие слова, вы просто берете первую часть других слов,
"I_like".split("_")[0] -> I;
"like_cloud".split("_")[0] -> like
"cloud_computing" -> in bigram list, keep it.
skip next bi-gram "computing_because" ("computing" is already used)
"because_it's".split("_")[0]" -> "because" etc.
Чтобы также захватить последнее слово в предложении («дешево»), я добавил токен «EOL».Я реализовал это в Python, и скорость была в порядке (500 тыс. Слов за 3 минуты), процессор i5 с 8G.В любом случае, вы должны сделать это только один раз.Я нахожу это более интуитивным, чем официальный подход (в стиле spacy).Это также работает для не-пространственных структур.
Я делаю это перед официальным токенизацией / лемматизацией, так как вы получите «облачные вычисления» в качестве возможного биграмма.Но я не уверен, что это лучший / правильный подход.Предложения?
Андреас
PS: оставьте строку, если вы хотите полный код, я продезинфицирую код и выложу его здесь (и, возможно, github).