Алгоритм обнаружения и сравнения фраз - PullRequest
6 голосов
/ 30 июня 2011

У меня есть пара неанглийских текстов. Я хотел бы провести на них стилистические сравнения.

Один из способов сравнения стиля - поиск похожих фраз. Если я нахожу в одной книге «Рыбалка, катание на лыжах и походы» пару раз, а в другой книге «Рыбалка, походы и катание на лыжах» сходство в стиле указывает одному автору. Я должен также быть в состоянии найти "рыбалку и даже катание на лыжах или походы", хотя. В идеале я бы также нашел "рыбалку, походы и катание на лыжах", но поскольку они не являются текстами на английском языке (греческий язык Koine), синонимы сложнее учесть, и этот аспект не важен.

Каков наилучший способ (1) найти такие фразы и затем (2) найти их так, чтобы они не были слишком жесткими в других текстах (чтобы найти «рыбалку и даже катание на лыжах или походы») «)

Ответы [ 3 ]

8 голосов
/ 30 июня 2011
  • Возьмите все свои тексты и составьте список слов.Простой способ: взять все слова.Трудный путь: возьмите только соответствующий (то есть: в английском языке «the» никогда не является подходящим словом, поскольку оно используется слишком часто).Допустим, в вашем словаре есть V слов.
  • Для каждого текста постройте матрицу смежности A, размер которой равен V * V.Строка A (i) указывает, насколько близки слова в вашем словаре к i-му слову V (i).Например, если V (i) = «кататься на лыжах», то A (i, j) - насколько близко слово V (j) к слову «кататься на лыжах».Вы бы предпочли небольшой словарь!

Технические детали: Для словаря у вас есть несколько возможностей получить хороший словарь.К сожалению, я не могу вспомнить имена.Один из них состоит в удалении слов, которые присутствуют часто и везде.Напротив, вы должны хранить редкие слова, которые присутствуют в нескольких текстах.Однако нет смысла сохранять слова, присутствующие точно в одном тексте.

Для матрицы смежности измеряется смежность путем подсчета того, как далеко находятся слова, которые вы рассматриваете (подсчитывая количество слов, разделяющих их).Например, давайте используем ваш текст =)

Один метод сравнения стилей - это поиск похожих фраз.Если я нахожу в одной книге «Рыбалка, катание на лыжах и походы» пару раз, а в другой книге «Рыбалка, походы и катание на лыжах» сходство 1015 * по стилю указывает на одного автора.Я должен также быть в состоянии найти "рыбалку и даже катание на лыжах или походы", хотя.В идеале я бы также нашел "рыбалку, походы и катание на лыжах", но поскольку они не являются английскими текстами (Koine Greek ), синонимы сложнее учесть, и этот аспект не является жизненно важным.

Это полностью составленные значения:
A (метод, сравнение) + = 1,0
A (метод, сходство) + = 0,5
A (метод, греческий) + = 0,0

Вам в основном нужно «типичное расстояние».Например, вы можете сказать, что после 20 разделительных слов слова больше нельзя считать смежными.

После некоторой нормализации просто установите расстояние L2 между матрицей смежности двух текстов, чтобы увидеть, какблизко ониПосле этого вы можете делать более интересные вещи, но это должно привести к приемлемым результатам.Теперь, если у вас есть синонимы, вы можете обновить смежность хорошим способом.Например, если вы вводите «Beautiful Maiden», то
A (красивая, девичья) + = 1,0
A (великолепная, девичья) + = 0,9
A (прекрасная, девичья) + = 0,8
A (возвышенное, девичье) + = 0,8
...

2 голосов
/ 30 июня 2011

Вам, вероятно, следует использовать некоторую меру сходства строк, например Jaccard , Dice или косинусное сходство .Вы можете попробовать их на словах, на (словесном или символьном уровне) n -грамм или на леммах.(Для языков с сильным перегибом, таких как греческий язык Koinè, я бы предложил использовать леммы, если у вас есть хороший лемматизатор для него.)

Ловить синонимы сложно, если у вас нет чего-то вроде WordNet, которое сопоставляет синонимы.*

1 голос
/ 30 июня 2011

Я бы следовал двум принципам:

  • Остерегайтесь преждевременной оптимизации в алгоритме сопоставления. Начните с широкого подхода, а затем уточните его по мере необходимости (т. Е. Проверьте, дает ли простой тест "близости" достаточно хорошие результаты для набора данных, который вы знаете, ответь, а если нет, подправь, пока не получится). Во многих случаях вы обнаружите, что высоко оптимизированное решение не даст результатов, значительно отличающихся от вашей первой грубой попытки.
  • Используйте какой-то алгоритм самообучения. Таким образом, вы могли бы кормить ИИ рядом текстов, которые могут сделать его умнее. Вдохновившись вашим примером: перед тем, как попытаться сравнить два целевых текста, я бы написал текст о жизни на открытом воздухе. Таким образом, ИИ, скорее всего, сам узнает, что angling очень близко соответствует fishing.

В качестве самообучающегося ИИ я бы использовал (по крайней мере для начала) нейронную сеть . Существует простой и полностью рабочий пример (в Python), который можно найти здесь , и он предназначен именно для «интеллектуального анализа данных». Вы можете реализовать на другом языке, конечно.

О ваших двух конкретных вопросах:

Как лучше всего обнаружить такие фразы

Другие ответы на ваш вопрос были подробно описаны по этому поводу (и их авторы, кажется, знают намного больше, чем я по этому вопросу!), Но опять же: я бы начал легко и просто использовал нейронную сеть, которая говорит вам, насколько близко два условия Затем я приступил бы к «волнам» оптимизации (например, если это был текст на английском языке), используя только корень слова, или, может быть, он полезен для настройки оценки в соответствии с некоторыми другими метаданными текста, такими как год или или автор, или географическое происхождение, или все же меняющий алгоритм сопоставления ...), пока вы не будете удовлетворены результатом.

Как лучше всего искать их так, чтобы они не были слишком жесткими в других текстах (чтобы найти "рыбалку и даже катание на лыжах или походы"

Я бы сказал, что это равносильно тому, чтобы попросить ИИ вернуть все фразы, у которых «показатель близости» превышает заданный порог.

НТН!

...