Сходство предложений в n-граммах с измерением косинусного сходства - PullRequest
5 голосов
/ 27 октября 2010

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

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

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

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

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

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

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

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

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

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

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

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

СпасибоВы заранее.

1 Ответ

5 голосов
/ 28 октября 2010

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

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

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

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

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

...