Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
 
 package org.apache.ctakes.temporal.ae;
 
 import java.io.File;
 import java.net.URI;
 import java.util.List;
 
 import  org.cleartk.util.ViewUriUtil;
 import  org.cleartk.util.treebank.TreebankFormatParser;
 
 public class THYMETreebankReader extends JCasAnnotator_ImplBase {
 
 	public static Logger logger = Logger.getLogger(THYMETreebankReader.class);
 	public static final String TREEBANK_DIRECTORY = "treebankDirectory";
 	private static final Pattern headerPatt = Pattern.compile("\\[(meta|start|end) [^\\]]*?\\]"); //"\\[meta [^\\]]*\\]");
 	
 	@ConfigurationParameter(name = , mandatory = true)
 	protected File treebankDirectory;
 	File[] subdirs = null;
 
 	enum TOKEN_TYPE {WORD, PUNCT, SYMBOL, NUM, NEWLINE, CONTRACTION }
 	
 	public void initialize(UimaContext aContextthrows ResourceInitializationException {
 		super.initialize(aContext);
 			public boolean accept(File pathname) {
 				return pathname.isDirectory() && !pathname.isHidden();
 			}});
 	}
 
 	public void process(JCas jcasthrows AnalysisEngineProcessException {
 		URI uri = ViewUriUtil.getURI(jcas);
 		.info("Document id is: " + uri.toString());
 
 		String fn = uri.getPath().substring(uri.getPath().lastIndexOf('/')+1) + ".xml.tree";
 		File treeFile = null;
 		for(File subdir : ){
 			treeFile = new File(subdirfn);
 			if(treeFile.exists()) break;
 			treeFile = null;
 		}
 
 		if(treeFile == null){
 			this.getContext().getLogger().log(.,"Could not find treeFile: " + fn);
			// FIXME do automatic parse?
			return;
		}
		String tbText;
		try {
			tbText = FileUtils.file2String(treeFile);
catch (IOException e1) {
			// shouldn't do automatic parse here -- something wrong with file itself, not the parse
		}
		StringBuffer fileText = new StringBuffer(jcas.getDocumentText());
		// find and replace section headers with whitespace so the TreebankFormatParser skips over them...
		Matcher m = .matcher(fileText);
		while(m.find()){
			int headerLen = m.group().length();
			fileText.replace(m.start(), m.end(), getWhitespaceString(headerLen));
		}
		List<org.cleartk.util.treebank.TopTreebankNode> utilTrees;
		try {
			utilTrees = TreebankFormatParser.parseDocument(tbText, 0, fileText.toString());
catch (Exception e) {
					String.format("Skipping %s due to alignment problems"fn),
					e);
			// FIXME - do automatic parse here...
			return;
		}
		// if we get this far, the gold standard exists and we will let it do all of our tokenization.
		// first we need to remove sentence and token annotations
		List<Sentencesents = new ArrayList<Sentence>(JCasUtil.select(jcasSentence.class));
		for(Sentence sent : sents){
		}
		HashMap<String,TOKEN_TYPEtokMap = new HashMap<>();
		List<BaseTokentoks = new ArrayList<BaseToken>(JCasUtil.select(jcasBaseToken.class));
		for(BaseToken tok : toks){
		  String key = getAnnotationKey(tok);
		  
		  if(tok instanceof WordToken){
		    tokMap.put(key.);
		  }else if(tok instanceof PunctuationToken){
		    tokMap.put(key.);
		  }else if(tok instanceof SymbolToken){
		    tokMap.put(key.);
		  }else if(tok instanceof NumToken){
		    tokMap.put(key,  .);
		  }else if(tok instanceof NewlineToken){
		    tokMap.put(key.);
		  }else if(tok instanceof ContractionToken){
		    tokMap.put(key.);
		  }
		}
		// add Token, Sentence and TreebankNode annotations for the text
		for (org.cleartk.util.treebank.TopTreebankNode utilTree : utilTrees) {
			// create a Sentence and set its parse
			TopTreebankNode tree = convert(utilTreejcas);
			Sentence sentence = new Sentence(jcastree.getBegin(), tree.getEnd());
			sentence.addToIndexes();
			// create the Tokens and add them to the Sentence
			for (int i = 0; i < tree.getTerminals().size(); i++) {
				TreebankNode leaf = tree.getTerminals(i);
        if (leaf.getBegin() != leaf.getEnd()) {
          String key = getAnnotationKey(leaf);
          BaseToken token = null;
          if(tokMap.containsKey(key)){
            TOKEN_TYPE tokType = tokMap.get(key);
            switch(tokType){            
            case :
              token = new ContractionToken(jcasleaf.getBegin(), leaf.getEnd());
              break;
            case :
              token = new NewlineToken(jcasleaf.getBegin(), leaf.getEnd());
              break;
            case :
              token = new NumToken(jcasleaf.getBegin(), leaf.getEnd());
              break;
            case :
              token = new PunctuationToken(jcasleaf.getBegin(), leaf.getEnd());
              break;
            case :
              token = new SymbolToken(jcasleaf.getBegin(), leaf.getEnd());
              break;
            case :
              token = new WordToken(jcasleaf.getBegin(), leaf.getEnd());
              break;
            default:
              token = new BaseToken(jcasleaf.getBegin(), leaf.getEnd());
            }
          }else{
            token = new BaseToken(jcasleaf.getBegin(), leaf.getEnd());
          }
          token.setPartOfSpeech(leaf.getNodeType());
          token.addToIndexes();
        }
			}
		}
	}
	private static String getWhitespaceString(int headerLen) {
		char[] chars = new char[headerLen];
		Arrays.fill(chars' ');
		return new String(chars);
	}
	// the ctakes syntax typesystem was modeled after cleartk -- as a result, the following methods borrow very liberally from 
	// org.cleartk.syntax.constituent.util.TreebankNodeUtility, which has a convert method for going from
	// a "normal" tree to a cleartk/uima tree.  This does the same, except goes to a ctakes/uima tree.
	private static TopTreebankNode convert(org.cleartk.util.treebank.TopTreebankNode inTreeJCas jcas){
		TopTreebankNode outTree = new TopTreebankNode(jcasinTree.getTextBegin(), inTree.getTextEnd());
		outTree.setTreebankParse(inTree.getTreebankParse());
	    convert(inTreejcasoutTreenull);
	    initTerminalNodes(outTreejcas);
		outTree.addToIndexes();
		return outTree;
	}
	public static void initTerminalNodes(
			TopTreebankNode uimaNode,
			JCas jCas) {
		_initTerminalNodes(uimaNodeterminals);
		for (int i = 0; i < terminals.size(); i++) {
			TerminalTreebankNode terminal = terminals.get(i);
			terminal.setIndex(i);
		}
		FSArray terminalsFSArray = new FSArray(jCasterminals.size());
		terminalsFSArray.copyFromArray(
				terminals.toArray(new FeatureStructure[terminals.size()]),
				0,
				0,
				terminals.size());
		uimaNode.setTerminals(terminalsFSArray);
	}
	private static void _initTerminalNodes(
			List<TerminalTreebankNodeterminals) {
		FSArray children = node.getChildren();
		for (int i = 0; i < children.size(); i++) {
			TreebankNode child = (TreebankNodechildren.get(i);
			if (child instanceof TerminalTreebankNode) {
				terminals.add((TerminalTreebankNodechild);
else
				_initTerminalNodes(childterminals);
		}
	}
	public static TreebankNode convert(
			org.cleartk.util.treebank.TreebankNode pojoNode,
			JCas jCas,
			TreebankNode uimaNode,
			TreebankNode parentNode) {
		uimaNode.setNodeType(pojoNode.getType());
		uimaNode.setNodeTags(new StringArray(jCaspojoNode.getTags().length));
		FSCollectionFactory.fillArrayFS(uimaNode.getNodeTags(), pojoNode.getTags());
		uimaNode.setNodeValue(pojoNode.getValue());
		uimaNode.setLeaf(pojoNode.isLeaf());
		uimaNode.setParent(parentNode);
		List<TreebankNodeuimaChildren = new ArrayList<TreebankNode>();
		for (org.cleartk.util.treebank.TreebankNode child : pojoNode.getChildren()) {
			TreebankNode childNode;
			if (child.isLeaf()) {
				childNode = new TerminalTreebankNode(jCaschild.getTextBegin(), child.getTextEnd());
else {
				childNode = new TreebankNode(
						jCas,
						child.getTextBegin(),
						child.getTextEnd());
			}
			uimaChildren.add(convert(childjCaschildNodeuimaNode));
			childNode.addToIndexes();
		}
		FSArray uimaChildrenFSArray = new FSArray(jCasuimaChildren.size());
		uimaChildrenFSArray.copyFromArray(
				uimaChildren.toArray(new FeatureStructure[uimaChildren.size()]),
				0,
				0,
				uimaChildren.size());
		uimaNode.setChildren(uimaChildrenFSArray);
		return uimaNode;
	}
	public static AnalysisEngineDescription getDescription(File treebankDirectory)
		return AnalysisEngineFactory.createEngineDescription(
				treebankDirectory);
	}
	public static void main(String[] args){
		String testString = "[meta rev_date=\"02/20/2010\" start_date=\"02/20/2010\" rev=\"0002\"]\n\n" +
						    "[start section id=\"20112\"]\n\n" +
						    "#1 Dilated esophagus on CT-scan\n" +
						    "#2 Adenocarcinoma right colon\n" +
						    "#3 Symptomatic anemia\n" +
						    "#4 Hypothyroidism";
		Matcher m = .matcher(testString);
//		System.out.println("Matches = " + m.matches());
		while(m.find()){
			..println("FOund match at: " + m.start() + "-" + m.end());
		}
	}
	public static final String getAnnotationKey(Annotation a){
	  return a.getBegin() + "-" + a.getEnd();
	}
New to GrepCode? Check out our FAQ X