나는 쿼리 방법을 제공하는 토큰 인덱스 기반 문서의 코퍼스를 가지고있다. 사용자가 수동으로 (!) 구문 분석 및 평가가 필요한 쿼리 문자열을 입력합니다. 코퍼스는 주어진 쿼리 문자열과 일치하는 모든 문서의 목록을 반환해야합니다. 쿼리 언어는 단순한 부울 연산자 AND, NOT 및 OR을 특징으로하며 괄호로도 우선 순위를 지정할 수 있습니다. 몇 가지 연구를 한 후에 ANTLR을 사용하여 주어진 쿼리 문자열을 구문 트리로 구문 분석했습니다. 예를 들어C#에서 간단한 문자열 구문 트리를 평가하고 처리하는 방법은 무엇입니까?
:
"Bill OR (John AND Jim) OR (NOT Simon AND Mike)"
는 다음과 같은 구문 트리로 번역되는 쿼리 :
편집 :
: 바트 Kiers 포스트에 정확한 그래프 (여기에 복사)를 참조하시기 바랍니다
트리의 모든 노드는 단순한 문자열이며 각 노드는 해당 부모를 알고 있습니다. 자녀가 아니라 형제가 아닙니다. 보시다시피, ANTLR 문법은 이미 작업을 실행해야하는 순서를 지정했습니다. 트리의 맨 아래에있는 것들이 먼저옵니다.
그래서 아마도 트리에서 모든 피연산자를 평가하는 것이 필요합니다. 일반적으로 트리의 각 리프에 대해 Get (문자열 용어) 메서드 (예 : "Bill"또는 "John")를 사용하여 내 코퍼스에서 간단한 검색을 수행 할 수 있습니다. Get()은 잎에 용어가 포함 된 문서 목록을 반환합니다. 또한 각 리프의 부모를 평가하여 가능한 NOT 연산자를 인식 한 다음 잎의 용어를 포함하지 않는 문서의 결과 목록으로 연결합니다 (Get() 대신 Not() 메서드 사용). 목록 1의 AND리스트 2에있는 문서의리스트를 반환
- AND 방법 인터 섹트 (리스트 1,리스트 2)를 호출한다 :
는 AND 및 OR 연산자 개의 파라미터가 필요 메소드 호출로 변환되어야 .
- OR은 list1 또는 list2에있는 문서 목록을 반환하는 Union (list1, list2) 메서드를 호출해야합니다.
매개 변수 list1과 list2에는 Get() 또는 Not()를 사용하기 전에받은 문서가 들어 있습니다.
내 질문은 : 어떻게 의미 론적으로 그리고 구문 론적으로 C#에서 - 모든 필요한 검색어를 평가하고이를 올바른 순서로 올바른 연산자 메소드를 호출하는 데 사용할 수 있습니까? 직관적으로 재귀처럼 들리지만 어쨌든 나는 그것을 묘사 할 수 없다. 특히 호출해야하는 모든 메소드가 동일한 양의 매개 변수를 가지고있는 것은 아니기 때문에. 아니면 이것을 수행 할 수있는 완전히 다른 방법이 있습니까? 의사 코드
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.
}
에서
주제를 완전히 벗어 났지만 그래픽을 만들기 위해 어떤 도구를 사용 했습니까? – Cameron
"Simon"이 아닌 Simon을 제외한 모든 사람의 집합 또는 Simon의 거짓을 평가하는 식을 반환해야합니까? –
@Cameron : 빠른 포맷이 포함 된 Microsoft PowerPoint 2010 : – Shackles