Bir sorgu yöntemi sunan bir token-indeks tabanlı belgeler kümesi var. Kullanıcı (!) Elle ayrıştırılması ve değerlendirilmesi gereken bir sorgu dizesi girer. Korpus, verilen sorgu dizesiyle eşleşen tüm belgelerin bir listesini döndürmelidir. Sorgu dili, parantez ile önceliklendirilebilen basit boole işleçleri AND, NOT ve OR'yi içerir. Bazı araştırmalardan sonra, belirli bir sorgu dizesini bir sözdizimi ağacına ayrıştırmak için ANTLR kullanmıştım. ÖrneğinC# içinde basit bir dize sözdizimi ağacı nasıl değerlendirilir ve işlenir?
:
"Bill OR (John AND Jim) OR (NOT Simon AND Mike)"
aşağıdaki sözdizimi ağacındaki çevrilmiştir sorgusu:
DÜZENLEME:
: Bart Kiers yayınında doğru grafiği (burada kopyalanan) bakın
Ağdaki tüm düğümler basit dizelerdir ve her düğüm ebeveynini bilir ve çocuklar değil, kardeşleri. Gördüğünüz gibi, ANTLR dilbilgisi, işlemlerin yürütülmesinin gerektiği sıralamayı zaten belirledi: ağacın altındakiler önce gelir.
Bu yüzden muhtemelen yapmam gereken şey, (?) Ağacındaki tüm işlenenleri değerlendirmek. Genel olarak, (Yaprak "ya da" John "gibi) ağacındaki her yaprak için bir yöntem (dize terimi) kullanarak benim corpus üzerinde basit bir arama yapabilirsiniz. Get(), yapraktaki terimi içeren belgelerin bir listesini döndürür. Ayrıca her bir yaprağın ebeveyni, olası bir NOT işlecini tanımak için değerlendirebilirim. Bu, daha sonra yapraktaki terimi içermeyen bir sonuç listesine (Get() yöntemi yerine Not() yöntemini kullanarak) yollayacaktır. Liste1 AND list2 olan belgelerin listesini döndürür
- VE yöntemidir Intersect'i (list1, list2) çağırmalıdır:
AND ve OR operatörü iki parametre ihtiyaç yöntem çağrıları haline getirilmelidir .
- VEYA liste1 VEYA list2 listesindeki belgelerin listesini veren bir yöntem (liste1, liste2) çağırmalıdır.
parametreleri list1 ve list2 I() veya değil() Get kullanmadan önce alınan belgeleri içermektedir.
Soruma şu sorularım var: C# içinde semantik ve sözdizimsel olarak nasıl olabilir - gerekli tüm arama terimlerini değerlendirebilir ve doğru sırada doğru operatör yöntemlerini çağırmak için bunları kullanabilirler? Sezgisel olarak özyinelemeye benziyor ama bir şekilde onu görüntüleyemiyorum - özellikle çağrılması gereken tüm yöntemlerin aynı miktarda parametresi olmadığı için. Ya da bunu gerçekleştirmek için belki de başka yollar var mı? Sözde Kod
Set Eval (Tree t) {
switch (t.Operator) {
case OR:
Set result = emptySet;
foreach(child in T.Children) {
result = Union(result, Eval(child));
}
return result;
case AND:
Set result = UniversalSet;
foreach(child in T.Children) {
result = Intersection(result, Eval(child));
}
return result;
case blah: // Whatever.
}
// Unreachable.
}
yılında
Tamamen konu dışı, ancak bu grafiği yapmak için hangi aracı kullandınız? – Cameron
"DEĞİL Simon", bir dizi kişiyi, ancak Simon'u ya da Simon için yanlış değerlendirecek bir ifadeyi döndürmeli mi, yoksa ...? –
@Cameron: Microsoft PowerPoint 2010, tümleşik hızlı biçimlendirmeyle :) – Shackles