2015-08-05 5 views
1

Имеет ли CoreNLP API для получения nграмм с позицией и т. Д.?API CoreNLP для N-граммов с положением

Например, у меня есть строка «У меня есть лучший автомобиль». если я использую mingrams = 1 и maxgrams = 2. Я должен получить следующее, как показано ниже. Я знаю stringutil с функцией ngram, но как получить позицию.

(I,0) 
(I have,0) 
(have,1) 
(have the,1) 
(the,2) 
(the best,2) etc etc 

на основе строки, которую я передаю.

Любая помощь действительно оценена.

Thanks

ответ

1

Я ничего не вижу в утилях. Вот пример кода, который может помочь:

import java.io.*; 
import java.util.*; 
import edu.stanford.nlp.io.*; 
import edu.stanford.nlp.ling.*; 
import edu.stanford.nlp.pipeline.*; 
import edu.stanford.nlp.trees.*; 
import edu.stanford.nlp.semgraph.*; 
import edu.stanford.nlp.trees.TreeCoreAnnotations.*; 
import edu.stanford.nlp.util.*; 


public class NGramPositionExample { 


    public static List<List<String>> getNGramsPositions(List<String> items, int minSize, int maxSize) { 
     List<List<String>> ngrams = new ArrayList<List<String>>(); 
    int listSize = items.size(); 
    for (int i = 0; i < listSize; ++i) { 
     for (int ngramSize = minSize; ngramSize <= maxSize; ++ngramSize) { 
     if (i + ngramSize <= listSize) { 
      List<String> ngram = new ArrayList<String>(); 
      for (int j = i; j < i + ngramSize; ++j) { 
      ngram.add(items.get(j)); 
      } 
        ngram.add(Integer.toString(i)); 
      ngrams.add(ngram); 
     } 
     } 
    } 
    return ngrams; 
    } 


     public static void main (String[] args) throws IOException { 
      String testString = "I have the best car"; 
      List<String> tokens = Arrays.asList(testString.split(" ")); 
      List<List<String>> ngramsAndPositions = getNGramsPositions(tokens,1,2); 
      for (List<String> np : ngramsAndPositions) { 
       System.out.println(Arrays.toString(np.toArray())); 
      } 
     } 
} 

Вы можете просто вырезать и вставлять этот полезный метод.

Это может быть полезной функциональностью для добавления, поэтому я поместит это в наш список вещей, над которыми нужно работать.

1

просто потратить некоторый код, чтобы переписать его в scala. его только что приведенный выше код меняет его на scala. Из пут будет как

NgramInfo(I,0)NgramInfo(I have,0)NgramInfo(have,1)NgramInfo(have the,1)NgramInfo(the,2)NgramInfo(the best,2)NgramInfo(best,3)NgramInfo(best car,3)NgramInfo(car,4) 

Ниже приведен метод с футляром класса

def getNgramPositions(items: List[String], minSize: Int, maxSize: Int): List[NgramInfo] = { 
     var ngramList = new ListBuffer[NgramInfo] 
     for (i <- 0 to items.size by 1) { 
      for (ngramSize <- minSize until maxSize by 1) { 
      if (i + ngramSize <= items.size) { 
       var stringList = new ListBuffer[String] 
       for (j <- i to i + ngramSize by 1) { 
       if (j < items.size) { 
        stringList += items(j) 
        ngramList += new NgramInfo(stringList.mkString(" "), i) 
       } 
       } 
      } 
      } 
     } 
     ngramList.toList 
     } 

case class NgramInfo(term: String, termPosition: Int) extends Serializable 

Благодаря