All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aima.core.nlp.parsing.grammars.Rule Maven / Gradle / Ivy

package aima.core.nlp.parsing.grammars;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * A derivation rule that is contained within a grammar. This rule is probabilistic, in that it 
 * has an associated probability representing the likelihood that the RHS follows from the LHS, given 
 * the presence of the LHS.
 * @author Jonathon (thundergolfer)
 *
 */
public class Rule {
	
	public final float PROB;
	public final List lhs; // Left hand side of derivation rule
	public final List rhs; // Right hand side of derivation rule
	
	// Basic constructor
	public Rule( List lhs, List rhs, float probability ) {
		this.lhs = lhs;
		this.rhs = rhs;
		this.PROB = validateProb( probability );
	}
	
	// null RHS rule constructor
	public Rule( List lhs, float probability ) {
		this.lhs = lhs;
		this.rhs = null;
		this.PROB = validateProb( probability );
	}
	
	// string split constructor
	public Rule( String lhs, String rhs, float probability) {
		if( lhs.equals("")) {
			this.lhs = new ArrayList();
		} else {
			this.lhs = new ArrayList(Arrays.asList(lhs.split("\\s*,\\s*")));
		}
		if( rhs.equals("")) {
			this.rhs = new ArrayList();
		} else {
			this.rhs = new ArrayList(Arrays.asList(rhs.split("\\s*,\\s*")));
		}
		this.PROB = validateProb( probability );
		
	}
	
	/**
	 * Currently a hack to ensure rule has a valid probablity value.
	 * Don't really want to throw an exception.
	 */
	private float validateProb(float prob) {
		if( prob >= 0.0 && prob <= 1.0 ) {
			return prob;
		}
		else {
			return (float) 0.5; // probably should throw exception
		}
	}
	
	public boolean derives( List sentForm ) {
		if( this.rhs.size() != sentForm.size() ) {
			return false;
		}
		for( int i=0; i < sentForm.size(); i++ ) {
			if( this.rhs.get(i) != sentForm.get(i)) {
				return false;
			}
		}
		return true;
	}
	
	public boolean derives( String terminal ) {
		if( this.rhs.size() == 1 && this.rhs.get(0).equals(terminal)) {
			return true;
		}
		return false;
	}
	
	@Override 
	public String toString() {
		String output = "";
		for( int i=0; i < lhs.size(); i++) {
			output += lhs.get(i);
		}
		output += " -> ";
		for( int i=0; i < rhs.size(); i++) {
			output += rhs.get(i);
		}	
		output += " " + String.valueOf(PROB);
		return output;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy