Здравствуйте!
Меня уже месяц мучает тема - как програмно разбить фразу на смысловые словосочетания? Обьясняю на примере.
У нас есть фраза - "Корова дает молоко каждый день". Допустим, мы хотим найти все трехзначные словосочетания из этой фразы. Мы получим что-то вроде:
1) "корова дает молоко"
2) "корова дает каждый"
3) "корова дает день"
4) "дает молоко каждый"
...
N) "молоко день корова"
Я просто взял все возможные перестановки слов, и получил набор словосочетаний. Легко заметить, что большинство из них неправильные ("молоко корова день").
Вопрос - как бы вы отсеяли такие некорректные словосочетания? Как определить, что словосочетание некорректно? То есть, человек видит, что это ерунда какая-то, но как формально определить, что словосочетание не несет смысла?
Грамматически "корова даёт день" ничуть не менее корректно, чем "корова даёт молоко". Выражение абсолютно грамматично - оно просто бессмысленно. Но никакая программа не сможет отличить осмысленные выражения от бессмысленных - для этого нужен уже искусственный интеллект, понимающий выражения (разумеется, в контексте).
Что касается отсева неграмматичных выражений, то для этого ваша программа должна включать в себя полный словарь языка, включающий для каждого слова все грамматические формы и исчерпывающую модель управления, а помимо такого словаря - ту или иную формальную модель синтаксиса. Тот факт, что автоматические переводчики в наши дни сплошь и рядом порождают неграмматичные предложения, уже должен вам намекать, что в достаточной мере эту задачу тоже никто пока не решил (основная загвоздка в синтаксисе).