Общепринятая модель - модель bag of words. Обычно используемая дистанционная мера в этом случае равна cosine similarity.
У вас есть список содержательных слов. Вероятно, вы хотите включить такие вещи, как «Hello» и «friend», но не такие, как «by» и «and».
Возможно, вы также захотите преобразовать свои входные слова, например. вы, вероятно, не хотите, чтобы случай имел значение, и в идеале вы можете избавиться от грамматического перегиба. Таким образом, вы хотите что-то вроде этого:
>>> content_words("Smith John: Hello my friend (super mega must see!)")
[ "smith", "john", "hello", "friend", "super", "mega", "must" ]
В другом ответе есть хорошие предложения по тому, как это сделать.
Каждая строка темы концептуально отображает высокомерный вектор с размером, соответствующим каждому содержательному слову. Существуют две небольшие вариации на модели (вы можете увидеть, какие из них лучше работает на ваших данных, если есть какая-либо существенная разница):
- элемент имеет 1 для вступления, если появляется слово, и 0, если оно не
- значение вектора при измерении является количеством раз, соответствующее слово появляется
косинуса сходство двух записей является скалярным произведением векторов, деленных на произведении нормы векторов.
Как вы можете видеть, вам не нужно фактически создавать в памяти эти огромные векторы (они разреженные - большинство записей будут равны нулю). Знать общее количество содержательных слов, а также то, что из них отображается в соответствующих записях, достаточно.