2013-06-20 2 views
1

У меня есть список строк (тем на форуме), как:питон: алгоритм фильтрации почти такой же текст

"[John Smith] Hello my friend 1080p" 
"It was him! by Ronnie" 
"new: Hello, my friend, J. Smith" 
"Askade la bonko" 
... 
"Smith John: Hello my friend! (super mega must see!)" 
"Alibaba won that game by John Smith" 

Мне нужно фильтровать же содержание темы. Из этого списка я вижу, что 1,3 (имеют запятую в заголовке) и пред-последние (с! В заголовке) темы имеют одинаковый контент, но немного другое название («Привет, мой друг»).

Есть ли какой-либо алгоритм для их фильтрации? Я имею в виду, что я хочу иметь только один «Привет, друг мой» в моем списке строк. Спасибо, совет!

ответ

3

Общепринятая модель - модель 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, если оно не
  • значение вектора при измерении является количеством раз, соответствующее слово появляется

косинуса сходство двух записей является скалярным произведением векторов, деленных на произведении нормы векторов.

Как вы можете видеть, вам не нужно фактически создавать в памяти эти огромные векторы (они разреженные - большинство записей будут равны нулю). Знать общее количество содержательных слов, а также то, что из них отображается в соответствующих записях, достаточно.

0

Вы в основном ищете сходство двух предложений, попарно. Существуют разные методы измерения сходства двух предложений.

С bag of words model, вы можете пойти и использовать алгоритмы кластеризации как k-Nearest-Neighbour, k-Means и т.д.

Я надеюсь, что это может дать вам некоторое вдохновение

Смежные вопросы