Сейчас я работаю над проектом, в котором мне нужно выбрать наиболее распространенные фразы в огромном тексте. Например, скажем, у нас есть три предложения вроде следующего:
- Собака прыгнула над женщиной.
- Собака прыгнула в машину.
- Собака прыгнула по лестнице.
Из приведенного выше примера я бы хотел извлечь " собака прыгнула ", так как это самая распространенная фраза в тексте. Сначала я подумал: «О, давайте использовать ориентированный граф [с повторяющимися узлами]»:
направленный граф http://img.skitch.com/20091218-81ii2femnfgfipd9jtdg32m74f.png
РЕДАКТИРОВАТЬ : Извините, я допустил ошибку, когда сделал эту диаграмму "за", "в" и "вверх", все должны вернуться к "the".
Я собирался вести подсчет того, сколько раз слово встречалось в каждом объекте узла («the» будет 6; «dog» и «jumped», 3 и т. Д.), Но, несмотря на многие другие проблемы, главная из них появилось, когда мы добавили еще несколько примеров вроде (пожалуйста, игнорируйте плохую грамматику :-)):
- Собака прыгнула вверх и вниз.
- Собака прыгнула, как ни одна собака раньше не прыгала.
- Собака прыгнула счастливо.
У нас теперь есть проблема, поскольку " dog " запустит новый корневой узел (на том же уровне, что и "the"), и мы не будем идентифицировать " dog jumped " как сейчас это самая распространенная фраза. Так что теперь я думаю, что, возможно, я мог бы использовать неориентированный график, чтобы отобразить отношения между всеми словами и в конечном итоге выбрать общие фразы, но я не уверен, как это будет работать, так как вы потеряете важные отношения порядка слова.
Так же у кого-нибудь есть общие идеи о том, как определить общие фразы в большом тексте и какую структуру данных я бы использовал.
Спасибо,
Ben