Categorías
Natural Language Processing

Herramientas de proceso de lenguaje natural

La mayoría de software / bibliotecas que quiero hacer ya están hechos por otros. Del mismo modo, hay muchas herramientas en el área de proceso del lenguaje natural. Son gratuitos y mantenidos y han sido utilizados por varias personas. Vale la pena echarle un vistazo y explorar algunos de ellos. Aquí enumero algunas herramientas que pueden ser útiles para el área de investigación de procesos del lenguaje natural.

1. lingPipe

2. Lucene

3. SharpNLP <4. OpenNLP

Categorías
Natural Language Processing

Convierta los verbos a la forma base usando Wordnet en Java

Un verbo puede aparecer en una oración en varios formatos, como forma base, tiempo pasado, participio pasado, presente en tercera persona del singular, etc. Para tener una idea general de cómo ocurre cada palabra, a menudo necesitamos obtener la forma base de una palabra.

Este ejemplo muestra cómo convertir un verbo a su forma básica utilizando la API de Java para Wordnet – JAWS. Haré esto en el entorno eclipse y Ubuntu.

1. Cree un proyecto Java llamado «TestJAWS» en su espacio de trabajo.

2. Vaya a Wordnet (http://wordnet.princeton.edu/wordnet/download/current-version/) y descargue «tar-gzipped: WordNet-3.0.tar.gz».

Nota: no es solo un archivo de base de datos.

3. Descomprímalo y copie dict direction en su espacio de trabajo, digamos «/ home / mike / somedir / dict /». El directorio «dict» debe contener los siguientes archivos:

4. Descargue el archivo jar de JAWS: http://lyle.smu.edu/~tspell/jaws/jaws-bin.jar y agréguelo a la ruta de construcción de su proyecto. (haga clic con el botón derecho en el proyecto -> Ruta de compilación -> Configurar ruta de compilación -> Bibliotecas -> agregar jarras externas -> listo)

5. El siguiente es el código para encontrar la forma base del verbo «implements»

public static void main(String[] args) {
 
		System.setProperty("wordnet.database.dir", "/home/.../wordnet/dict/");
		WordNetDatabase database = WordNetDatabase.getFileInstance();
 
		Morphology id = Morphology.getInstance();
 
		String[] arr = id.getBaseFormCandidates("implements", SynsetType.VERB);
 
		System.out.println(arr.length);
 
		for(String a: arr)
			System.out.println(a);
 
	}

Si tiene curiosidad sobre qué otras cosas puede hacer JAWS, vaya a JAWS Java Doc: http://lyle.smu.edu/~tspell/jaws/doc/overview-summary.html.

Categorías
Natural Language Processing

Ejemplo de Java para usar Stanford POSTagger

El siguiente ejemplo muestra cómo utilizar Standford POSTagger. Lo que hace un POS Tagger es etiquetar cada palabra con su tipo, como verbo, sustantivo, etc. Por ejemplo, si desea encontrar todos los verbos en una oración, puede usar Stanford POS Tagger.

Estos son los pasos para usar Stanford POSTagger en su proyecto Java.

1. Descargue la versión 3.1.3 de Stanford Tagger en inglés básico [43 MB]

URL: http://nlp.stanford.edu/software/tagger.shtml

2. Busque una carpeta llamada «modelos», copie el modelo y su archivo «.props» correspondiente a un directorio con el que se sienta cómodo.

3. Cree un proyecto Java en su eclipse y agregue stanford-postagger.jar a la ruta de compilación de su proyecto

4. Aquí está el código para etiquetar una oración «Me gusta ver películas».

String a = "I like watching movies";
MaxentTagger tagger =  new MaxentTagger("lib/tagger/taggers/english-left3words-distsim.tagger");
String tagged = tagger.tagString(a);
System.out.println(tagged);

Producción:

I_PRP me gusta_VBP viendo_VBG películas_NNS

Categorías
Natural Language Processing Top 10

Las 8 mejores herramientas para el procesamiento del lenguaje natural

El texto en inglés se usa en casi todas partes. Sería mejor si nuestro sistema pudiera entenderlo y generarlo automáticamente. Sin embargo, comprender el lenguaje natural es una tarea complicada. Es tan complicado que muchos investigadores dedicaron toda su vida a hacerlo.

Hoy en día, se han publicado muchas herramientas para realizar trabajos de procesamiento del lenguaje natural. Las siguientes son 8 herramientas que he recopilado. También verifiqué que todas ellas son utilizadas por algunas aplicaciones al menos una vez, por lo que todas son ejecutables. Algunos de ellos de empresas del sector, otros de institutos de investigación. Proporciona funciones como analizar, buscar temas automáticamente, etc.

  • OpenNLP: un paquete de Java para realizar tokenización de texto, etiquetado de parte del discurso, fragmentación, etc. (tutorial)
  • Stanford Parser: una implementación Java de analizadores probabilísticos de lenguaje natural, tanto PCFG * altamente optimizados como analizadores de dependencia lexicalizados, y un analizador PCFG lexicalizado
  • ScalaNLP: procesamiento de lenguaje natural y aprendizaje automático.
  • Snowball: un lematizador, compatible con C y Java.
  • MALLET: un paquete basado en Java para procesamiento estadístico de lenguaje natural, clasificación de documentos, agrupamiento, modelado de temas, extracción de información y otras aplicaciones de aprendizaje automático a texto.
  • JGibbLDA: LDA en Java
  • Apache Lucene Core: una biblioteca de Java para la eliminación y derivación de palabras vacías
  • Caja de herramientas de modelado de temas de Stanford: algoritmo CVB0, etc.

* PCFG: Gramática libre de contexto probabilístico

Categorías
Natural Language Processing

Calcular la similitud de palabras usando Wordnet en Java

Esta es mi nota de uso WS4J calcular la similitud de palabras en Java.

Paso 1: Descarga los tarros

Descargue los siguientes dos frascos y agréguelos a la ruta de la biblioteca del proyecto.

jawjaw-1.0.2.jar: https://code.google.com/p/jawjaw/downloads/list
ws4j-1.0.1.jar: https://code.google.com/p/ws4j/downloads/list

Paso 2: Juega con el programa de demostración

Código:

package NLP;
 
import edu.cmu.lti.lexical_db.ILexicalDatabase;
import edu.cmu.lti.lexical_db.NictWordNet;
import edu.cmu.lti.ws4j.RelatednessCalculator;
import edu.cmu.lti.ws4j.impl.HirstStOnge;
import edu.cmu.lti.ws4j.impl.JiangConrath;
import edu.cmu.lti.ws4j.impl.LeacockChodorow;
import edu.cmu.lti.ws4j.impl.Lesk;
import edu.cmu.lti.ws4j.impl.Lin;
import edu.cmu.lti.ws4j.impl.Path;
import edu.cmu.lti.ws4j.impl.Resnik;
import edu.cmu.lti.ws4j.impl.WuPalmer;
import edu.cmu.lti.ws4j.util.WS4JConfiguration;
 
public class SimilarityCalculationDemo {
 
	private static ILexicalDatabase db = new NictWordNet();
	/*
	//available options of metrics
	private static RelatednessCalculator[] rcs = { new HirstStOnge(db),
			new LeacockChodorow(db), new Lesk(db), new WuPalmer(db),
			new Resnik(db), new JiangConrath(db), new Lin(db), new Path(db) };
	*/
	private static double compute(String word1, String word2) {
		WS4JConfiguration.getInstance().setMFS(true);
		double s = new WuPalmer(db).calcRelatednessOfWords(word1, word2);
		return s;
	}
 
	public static void main(String[] args) {
		String[] words = {"add", "get", "filter", "remove", "check", "find", "collect", "create"};
 
		for(int i=0; i<words.length-1; i++){
			for(int j=i+1; j<words.length; j++){
				double distance = compute(words[i], words[j]);
				System.out.println(words[i] +" -  " +  words[j] + " = " + distance);
			}
		}
	}
}

Artículos Relacionados:

  1. LeetCode – Subcadena con concatenación de todas las palabras (Java)
  2. LeetCode – Palabras inversas en una cadena (Java)
  3. Convierta los verbos a la forma base usando Wordnet en Java
  4. ¿Cómo calcular la diferencia horaria en Java?

Categorías
Java Natural Language Processing

¿Cómo determinar si una cadena es código en inglés o Java?

Considere las siguientes dos cadenas:
1. for (int i = 0; i < b.size(); i++) {

2. do something in English (not necessary to be a sentence).

El primero es código Java, el segundo es inglés. ¿Cómo detectar que el primero es código y el segundo es inglés?

Es posible que el código Java no se pueda analizar porque no es un método / declaración / expresión completa. Lo siguiente proporciona una solución para este problema. Como a veces, no hay una línea clara entre el código y el inglés, la precisión no puede ser del 100%. Sin embargo, con la siguiente solución, puede ajustar fácilmente el programa para que se adapte a sus necesidades. Puede descargar el código desde GitHub.

La idea básica es convertir la cadena en un conjunto de tokens. Por ejemplo, la línea de código anterior puede convertirse en «CLAVE, SEPARADOR, ID, ASIGNACIÓN, NÚMERO, SEPARADOR, …». Y luego podemos usar reglas simples para separar el código del inglés.

Una clase de tokenizador convierte una cadena en una lista de tokens.

package lexical;
 
import java.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Tokenizer {
	private class TokenInfo {
		public final Pattern regex;
		public final int token;
 
		public TokenInfo(Pattern regex, int token) {
			super();
			this.regex = regex;
			this.token = token;
		}
	}
 
	public class Token {
		public final int token;
		public final String sequence;
 
		public Token(int token, String sequence) {
			super();
			this.token = token;
			this.sequence = sequence;
		}
 
	}
 
	private LinkedList<TokenInfo> tokenInfos;
	private LinkedList<Token> tokens;
 
	public Tokenizer() {
		tokenInfos = new LinkedList<TokenInfo>();
		tokens = new LinkedList<Token>();
	}
 
	public void add(String regex, int token) {
		tokenInfos
				.add(new TokenInfo(Pattern.compile("^(" + regex + ")"), token));
	}
 
	public void tokenize(String str) {
		String s = str.trim();
		tokens.clear();
		while (!s.equals("")) {
			//System.out.println(s);
			boolean match = false;
			for (TokenInfo info : tokenInfos) {
				Matcher m = info.regex.matcher(s);
				if (m.find()) {
					match = true;
					String tok = m.group().trim();
					s = m.replaceFirst("").trim();
					tokens.add(new Token(info.token, tok));
					break;
				}
			}
			if (!match){
				//throw new ParserException("Unexpected character in input: " + s);
				tokens.clear();
				System.out.println("Unexpected character in input: " + s);
				return;
			}
 
		}
	}
 
	public LinkedList<Token> getTokens() {
		return tokens;
	}
 
	public String getTokensString() {
		StringBuilder sb = new StringBuilder();
		for (Tokenizer.Token tok : tokens) {
			sb.append(tok.token);
		}
 
		return sb.toString();
	}
}

Podemos obtener las palabras clave, separadores, operadores, identificadores de Java, etc. Si asignamos un valor de mapeo a los tokens, una cadena de inglés se puede convertir en una cadena de tokens.

package lexical;
 
import greenblocks.javaapiexamples.DB;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import org.apache.commons.lang.StringUtils;
 
import NLP.POSTagger;
 
public class EnglishOrCode {
 
	private static Tokenizer tokenizer = null;
 
	public static void initializeTokenizer() {
		tokenizer = new Tokenizer();
 
		//key words
		String keyString = "abstract assert boolean break byte case catch "
				+ "char class const continue default do double else enum"
				+ " extends false final finally float for goto if implements "
				+ "import instanceof int interface long native new null "
				+ "package private protected public return short static "
				+ "strictfp super switch synchronized this throw throws true "
				+ "transient try void volatile while todo";
		String[] keys = keyString.split(" ");
		String keyStr = StringUtils.join(keys, "|");
 
		tokenizer.add(keyStr, 1);
		tokenizer.add("(|)|{|}|[|]|;|,|.|=|>|<|!|~|"
						+ "?|:|==|<=|>=|!=|&&||||++|--|"
						+ "+|-|*|/|&|||^|%|'|"|n|r|$|#",
						2);//separators, operators, etc
 
		tokenizer.add("[0-9]+", 3); //number
		tokenizer.add("[a-zA-Z][a-zA-Z0-9_]*", 4);//identifier
		tokenizer.add("@", 4);
	}
 
	public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
		initializeTokenizer();
		String s = "do something in English";
		if(isEnglish(s)){
			System.out.println("English");
		}else{
			System.out.println("Java Code");
		}
 
		s = "for (int i = 0; i < b.size(); i++) {";
		if(isEnglish(s)){
			System.out.println("English");
		}else{
			System.out.println("Java Code");
		}
 
	}
 
	private static boolean isEnglish(String replaced) {
		tokenizer.tokenize(replaced);
		String patternString = tokenizer.getTokensString();
 
		if(patternString.matches(".*444.*") || patternString.matches("4+")){
			return true;
		}else{
			return false;
		}
	}
}

Producción:

English
Java Code

Referencias:
1. Escribir un analizador en Java: el Tokenizer