Сходство предложений n-граммов с измерением сходства косинусом

Я работал над проектом о схожести предложений. Я знаю, что об этом много раз спрашивали в SO, но я просто хочу знать, может ли моя проблема быть решена с помощью метода, который я использую тем, как я это делаю, или я должен изменить свой подход к проблеме. Грубо говоря, система должна разбивать все предложения статьи и находить похожие предложения среди других статей, которые вводятся в систему.

Я использую косинусное сходство с весами tf-idf, и именно так я это сделал.

1. Сначала я разбиваю все статьи на предложения, затем создаю триграммы для каждого предложения и сортирую их (следует ли?).

2- Я вычисляю веса tf-idf триграмм и создаю векторы для всех предложений.

3- Я вычисляю скалярное произведение и величину исходного предложения и предложения, которое нужно сравнить. Затем вычислите косинусное подобие.

Однако система работает не так, как я ожидал. У меня в голове есть несколько вопросов.

Насколько я читал о весах tf-idf, думаю, они более полезны для поиска похожих «документов». Поскольку я работаю над предложениями, я немного изменил алгоритм, изменив некоторые переменные в формуле определений tf и idf (вместо документа я попытался придумать определение на основе предложений).

tf = количество вхождений триграммы в предложении / количество всех триграмм в предложении

idf = количество всех предложений во всех статьях / количество предложений, в которых встречается триграмма

Как вы думаете, можно ли использовать такое определение для этой проблемы?

Другой - я видел, что нормализация упоминается много раз при вычислении косинусного подобия. Я предполагаю, что это важно, потому что векторы триграмм могут быть разного размера (что в моем случае случается редко). Если вектор триграммы имеет размер x, а другой - x + 1, то я рассматриваю первый вектор так, как это был размер x + 1 с последним значением 0. Это то, что подразумевается под нормализацией? Если нет, как мне сделать нормализацию?

Помимо этого, если я выбрал неправильный алгоритм, что еще можно использовать для решения такой проблемы (желательно с подходом n-граммов)?

Заранее спасибо.


person Ahmet Keskin    schedule 27.10.2010    source источник


Ответы (1)


Я не уверен, почему вы сортируете триграммы для каждого предложения. Все, о чем вам нужно заботиться при вычислении косинусного сходства, - это то, встречается ли одна и та же триграмма в двух предложениях или нет и с какой частотой. С концептуальной точки зрения вы определяете фиксированный и общий порядок всех возможных триграмм. Помните, что порядок всех предложений должен быть одинаковым. Если количество возможных триграмм равно N, то для каждого предложения вы получаете вектор размерности N. Если определенная триграмма не встречается, вы устанавливаете соответствующее значение в векторе равным нулю. На самом деле вам не нужно хранить нули, но нужно позаботиться о них, когда вы определяете скалярное произведение.

Сказав это, триграммы - не лучший выбор, поскольку шансы на совпадение намного меньше. Для высоких k вы получите лучшие результаты, если будете использовать наборы из k последовательных слов, а не k-граммы. Обратите внимание, что порядок внутри сумки не имеет значения, это набор. Вы используете k = 3 k-грамма, но, похоже, это слишком много, особенно для предложений. Либо опуститесь до биграммов, либо используйте пакеты разной длины, начиная с 1. Желательно использовать оба.

Я уверен, что вы заметили, что предложения, в которых не используется точная триграмма, не имеют сходства в вашем методе. K-мешок слов несколько облегчит ситуацию, но не решит ее полностью. Потому что теперь вам нужны предложения, чтобы делиться реальными словами. Два предложения могут быть похожими без использования одних и тех же слов. Есть несколько способов исправить это. Либо используйте LSI (скрытое семантическое индексирование), либо кластеризацию слов и используйте метки кластера, чтобы определить свое косинусное сходство.

Чтобы вычислить косинусное сходство между векторами x и y, вы вычисляете скалярное произведение и делите его на нормы x и y. 2-норма вектора x может быть вычислена как квадратный корень из суммы квадратов компонентов. Однако вам также следует попробовать свой алгоритм без какой-либо нормализации для сравнения. Обычно это работает нормально, потому что вы уже учитываете относительные размеры предложений при вычислении частот терминов (tf).

Надеюсь это поможет.

person srean    schedule 27.10.2010
comment
@Ahmet Если есть что-то, что вы хотите, чтобы я прояснил, дайте мне знать. - person srean; 28.10.2010
comment
Спасибо за ваш ответ. Во-первых, я сортирую вектор потому, что получаю лучшие результаты. Я пробовал то, что вы предлагаете, но безуспешно. Но я только что понял, что похожие слова, как правило, имеют одинаковую длину. Это косинусное сходство кажется мне немного случайным, поскольку мы не проверяем связь между n-граммами, вместо этого мы проверяем частоту n-граммов, не учитывая, что они собой представляют. Может быть, я что-то упускаю. - person Ahmet Keskin; 29.10.2010
comment
Конечно, косинусное подобие будет выглядеть случайным, если вы не позаботитесь о том, чтобы они совпадали или нет, потому что то, что вы вычисляете в этом случае, не имеет ничего общего с косинусным подобием. Вы делаете это неправильно, и в этом случае он будет случайным по определению. Попробуйте еще раз и внимательно следуйте инструкциям, это сработает. - person srean; 29.10.2010
comment
Привет, спасибо за совет. Теперь работает. Это была важная деталь, о которой я должен был позаботиться. На самом деле способ, которым я реализовал алгоритм, был неправильным, и это был ответ, который я искал. Алгоритм, который я где-то читал (точно не помню, где именно), не упоминал совпадающую часть. Итак, я как бы ждал чего-то волшебного из-за этапа сортировки. Затем я подумал об использовании Dice Coefficient, потому что это имело гораздо больше смысла. Теперь косинусное сходство работает нормально. Еще раз спасибо. - person Ahmet Keskin; 31.10.2010
comment
@AhmetKeskin Можете ли вы пояснить, что на самом деле означает tf в данном контексте? количество вхождений триграммы в предложение, разве не 1 почти все время ?? Пожалуйста, не могли бы вы объяснить мне больше? - person John; 20.03.2019