Как вычислить сходство между двумя предложениями (синтаксическим и семантическим) - PullRequest
0 голосов
/ 07 сентября 2010

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

ВХОД 1: Обама подписывает закон.Обама подписал новый закон.

INPUT2: Автобус здесь остановлен.Транспортное средство останавливается здесь.

INPUT3: Пожар в Нью-Йорке.Нью-Йорк сгорел.

INPUT4: Пожар в Нью-Йорке.50 погибли в Нью-Йорке.

Я не хочу использовать дерево онтологий как душу.Я написал код для вычисления расстояния Левенштейна (LD) между предложениями и затем решил, можно ли игнорировать 2-е предложение:

  • (INPUT1 и 2),
  • следует заменить первое предложение (INPUT 3) или
  • сохранить вместе с первым предложением (INPUT4).

Я не доволен кодом, поскольку LD вычисляет только синтаксический уровень (какие еще методы?).Как можно включить семантику (например, автобус - это средство передвижения?).

Код здесь:

%# As the difference is computed, a decision is made on the new event
%# (string 2) to be ignored, to replace existing event (string 1) or to be
%# stored separately. The higher the LD metric, the higher the difference
%# between two strings. Of course, lower difference indices either identical
%# or similar events. However, the higher difference indicates the new event
%# as a fresh event.

%#.........................................................................
%# Calculating the LD between two strings of events.
%#.........................................................................
L1=length(str1)+1;
L2=length(str2)+1;
L=zeros(L1,L2);   %# Initializing the new length.

g=+1;             %# just constant
m=+0;             %# match is cheaper, we seek to minimize
d=+1;             %# not-a-match is more costly.

% do BC's
L(:,1)=([0:L1-1]*g)';
L(1,:)=[0:L2-1]*g;

m4=0;             %# loop invariant
%# Calculating required edits.
for idx=2:L1;
    for idy=2:L2
        if(str1(idx-1)==str2(idy-1))
            score=m;
        else
            score=d;
        end
        m1=L(idx-1,idy-1) + score;
        m2=L(idx-1,idy) + g;
        m3=L(idx,idy-1) + g;
        L(idx,idy)=min(m1,min(m2,m3)); % only minimum edits allowed.
    end
end
%# The LD between two strings.
D=L(L1,L2);

%#....................................................................
%# Making decision on what to do with the new event (string 2).
%#...................................................................
if (D<=4)     %# Distance is so less that string 2 seems identical to string 1.
    store=str1;        %# Hence string 2 is ignored. String 1 remains stored.
elseif (D>=5 && D<=15) %# Distance is larger to be identical but not enough to
    %# make string 2 an individual event.
    store= str2;       %# String 2 is somewhat similar to string 1.
                       %# So, string 1 is replaced with string 2 and stored.
else
    %# For all other distances, string 2 is stored along with string 1.
    store={str1; str2};
end

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 08 сентября 2010

"семантический". Нет простого учебника для этого.Естественный язык (особенно английский) очень сложный и непостоянный зверь. Давайте рассмотрим (лишь небольшую часть) приведенные случаи:

INPUT1: Obama signs the law. A new law is signed by Obama.

Подписание закона делает его «новым»закон.

INPUT2: A Bus is stopped here. A vehicle stops here.

Необходимо знать, что автобус является типом, если транспортное средство, а также какое-то временное соотношение.Кроме того, что если автобус остановился , но обычно не останавливается или больше не останавливается?Это может быть предпринято несколькими способами.

INPUT3: Fire in NY. NY is burnt down.

Необходимо знать, что пожары могут сжечь вещи.

INPUT4: Fire in NY. 50 died in NY fire.

Необходимо знать, что пожары могут убивать вещи (см. Далее).Нужно связать «новостной заголовок» (50 ЧТО?) С людьми.Мозг может сделать это несколько тривиально.Компьютерные программы не мозги.

И я не английский по специальности: -)

...