Biblioteca para clasificar gramaticalmente palabras en inglés (sustantivos, verbos, adverbios, etc.)

Tengo esta lista con 1600 palabras en inglés donde no sé el tipo gramatical. Ahora me gustaría saber para cada palabra en esta lista si es un sustantivo, verbo, adverbio u otro tipo gramatical. Si una palabra se puede usar con varios tipos, prefiero tenerlos todos (pero el más común es suficiente).

¿Existe una biblioteca con un algoritmo de reconocimiento para este caso? Preferiría algo en lo que pueda comenzar fácilmente: leer un tutorial y escribir 20 líneas de código sería lo ideal.

Requisitos:

  • Adivina el tipo gramatical de una palabra en inglés
  • Cualquier lenguaje de programación
  • Cualquier licencia
  • Libre
¿No es esta pregunta más adecuada para los programadores ?
@Izzy No, los programadores son más teóricos. Sin embargo, no sé en qué sitio encajaría esta pregunta.
@Izzy Software Engineering gritaría ante una pregunta para recomendar un lenguaje de programación. Creo que la pregunta está bien aquí, en realidad, es más una recomendación de biblioteca en el núcleo, y el lenguaje de programación seguirá.
Las recomendaciones de @Gilles Library ya deberían tener un idioma. "Sugiérame una biblioteca en un idioma aleatorio que pueda hacer x" probablemente sea demasiado amplio, como señala Tim en su respuesta .
La respuesta de @Seth Tim no dice nada acerca de que las recomendaciones de la biblioteca tengan que especificar un idioma. Muchos idiomas tienen formas sencillas de enlaces entre idiomas, por lo que es bastante común poder usar una biblioteca escrita en el idioma A en un programa escrito en el idioma B. Tim dice que "Recomendar qué idioma debo usar para construir este proyecto es solo demasiado amplio”, pero el “proyecto” aquí es básicamente llamar a una función de biblioteca en un bucle.
He reescrito la pregunta en gran medida, y creo que ahora está en el tema :-)

Respuestas (7)

Está buscando un etiquetador POS (= etiquetador de parte del discurso).

Uno de los más precisos y ampliamente utilizados es el Stanford Part-Of-Speech Tagger :

  • gratis (excepto para el software comercial de código abierto)
  • código abierto, escrito en Java
  • bien documentada
  • Hay disponibles modelos capacitados para inglés, árabe, chino, francés y alemán.
  • Enlace disponible en muchos otros lenguajes: Ruby, Python (NLTK (2.0+) contiene una interfaz para el etiquetador de POS de Stanford), PHP, F#/C#/.NET, etc.

Ejemplo:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.List;

import edu.stanford.nlp.ling.Sentence;
import edu.stanford.nlp.ling.TaggedWord;
import edu.stanford.nlp.ling.HasWord;
import edu.stanford.nlp.tagger.maxent.MaxentTagger;

class TaggerDemo {

  private TaggerDemo() {}

  public static void main(String[] args) throws Exception {
    if (args.length != 2) {
      System.err.println("usage: java TaggerDemo modelFile fileToTag");
      return;
    }
    MaxentTagger tagger = new MaxentTagger(args[0]);
    List<List<HasWord>> sentences = MaxentTagger.tokenizeText(new BufferedReader(new FileReader(args[1])));
    for (List<HasWord> sentence : sentences) {
      List<TaggedWord> tSentence = tagger.tagSentence(sentence);
      System.out.println(Sentence.listToString(tSentence, false));
    }
  }

}

Otras herramientas: http://en.wikipedia.org/wiki/Part-of-speech_tagging

No es una función integrada, pero puede hacerlo con python y nltk .

Un código simple sería así:

import nltk

with open(file) as f:
    for line in f:
        tmp = nltk.word_tokenize(line)
        print nltk.pos_tag(tmp)

Puede encontrar una explicación para cada etiqueta aquí (figura 5.1).

El problema es que devolverá la etiqueta más probable y no todas.

Si comienzo esto dice: Resource 'taggers/maxent_treebank_pos_tagger/english.pickle' not found.y si comienzo nltk.download()en la consola de python, ¿qué tengo que descargar?
Me temo que no puedo responder a esto, ya que descargué todo cuando comencé a usarlo.
como se descarga todo? solíaapt-get install python-nltk
Una vez que haya ingresado nltk.download(), seleccione ally haga clic download:) Sin embargo, tenga en cuenta que esto es muy excesivo para su tarea.
Seleccioné bookallí ahora, pero eso lleva mucho tiempo, ¡pero funcionó! el english.pickle allí. esto está almacenado en mi carpeta de usuario /home/rubo77/nltk_data. ¿Puedo eliminar las otras carpetas allí?
Utilicé su secuencia de comandos ahora (agregué esta línea: analyse=nltk.pos_tag(tmp)y print analyse[0][1]+';'+analyse[0][0]) y parece que el resultado es de alguna manera aleatorio: hay muchos errores en el resultado NNpara el sustantivo, RB, ... Por ejemplo: "amor" se resuelve comoIN: preposition or conjunction, subordinating

Puede usar la biblioteca Apache OpenNLP :

  • libre y de código abierto, escrito en Java
  • admite las tareas de NLP más comunes, como la tokenización, la segmentación de oraciones, el etiquetado de partes del discurso, la extracción de entidades nombradas, la fragmentación, el análisis y la resolución de correferencias.
  • incluye entropía máxima y aprendizaje automático basado en perceptrones.

Documentación del etiquetador de parte del discurso :

Cargando un modelo:

InputStream modelIn = null;

try {
  modelIn = new FileInputStream("en-pos-maxent.bin");
  POSModel model = new POSModel(modelIn);
}
catch (IOException e) {
  // Model loading failed, handle the error
  e.printStackTrace();
}
finally {
  if (modelIn != null) {
    try {
      modelIn.close();
    }
    catch (IOException e) {
    }
  }
}      

Etiquetado:

POSTaggerME tagger = new POSTaggerME(model);
String sent[] = new String[]{"Most", "large", "cities", "in", "the", "US", "had",
                             "morning", "and", "afternoon", "newspapers", "."};         
String tags[] = tagger.tag(sent);
double probs[] = tagger.probs(); // confidence scores for each tag
Sequence topSequences[] = tagger.topKSequences(sent); // Some applications need to retrieve the n-best pos tag sequences and not only the best sequence

Puede utilizar IBM LanguageWare ( Wikipedia ):

  • gratis (es necesario registrarse para poder descargarlo)
  • Java
  • No estoy seguro de qué tan activo es el proyecto, la última versión es 2011-10-21.
  • Tenga en cuenta que LanguageWare actualmente no proporciona desambiguación de parte del habla (POS) y, por lo tanto, todas las ambigüedades se devuelven a la aplicación de llamada.
  • Basado en UIMA (UIMA = Arquitectura de gestión de información no estructurada)
  • AFAIK a menudo no es la primera opción en los círculos académicos, pero IBM ha hecho algunas contribuciones importantes a la PNL.

También disponible, LanguageWare Resource Workbench es una aplicación de Eclipse para crear análisis de lenguaje personalizados en los recursos de IBM LanguageWare y sus anotadores UIMA asociados. UIMA (consulte también el proyecto Apache UIMA ) es el único estándar de la industria para el análisis de contenido y fue utilizado por IBM Watson para ganar el Jeopardy Challenge. UIMA fue desarrollado por primera vez por IBM y ahora es de código abierto.

Una buena presentación de IBM Languageware: Procesamiento del lenguaje natural y datos sucios modernos tempranos: aplicación de IBM Languageware a las declaraciones de 1641

Puede usar TextBlob (código abierto, licencia MIT):

TextBlob es una biblioteca de Python (2 y 3) para procesar datos textuales. Proporciona una API simple para sumergirse en tareas comunes de procesamiento de lenguaje natural (NLP), como el etiquetado de partes del discurso, la extracción de frases nominales, el análisis de sentimientos, la clasificación, la traducción y más.

Ejemplo:

from textblob import TextBlob

text = '''
The titular threat of The Blob has always struck me as the ultimate movie
monster: an insatiably hungry, amoeba-like mass able to penetrate
virtually any safeguard, capable of--as a doomed doctor chillingly
describes it--"assimilating flesh on contact.
Snide comparisons to gelatin be damned, it's a concept with the most
devastating of potential consequences, not unlike the grey goo scenario
proposed by technological theorists fearful of
artificial intelligence run rampant.
'''

blob = TextBlob(text)
blob.tags           # [('The', 'DT'), ('titular', 'JJ'),
                    #  ('threat', 'NN'), ('of', 'IN'), ...]

blob.noun_phrases   # WordList(['titular threat', 'blob',
                    #            'ultimate movie monster',
                    #            'amoeba-like mass', ...])

for sentence in blob.sentences:
    print(sentence.sentiment.polarity)
# 0.060
# -0.341

blob.translate(to="es")  # 'La amenaza titular de The Blob...'

Características:

  • extracción de frases nominales
  • Etiquetado de parte del discurso
  • Análisis de los sentimientos
  • Clasificación (Naive Bayes, árbol de decisión)
  • Traducción y detección de idiomas con la tecnología de Google Translate
  • Tokenización (división de texto en palabras y oraciones)
  • Frecuencias de palabras y frases
  • análisis
  • n-gramas
  • Inflexión de palabras (pluralización y singularización) y lematización
  • Corrección ortográfica
  • Agregar nuevos modelos o idiomas a través de extensiones
  • Integración de WordNet

Instalación:

pip install -U textblob
python -m textblob.download_corpora

Puedes usar spaCy :

  • Pitón
  • Fuente abierta
  • gratis para investigación (GNU Affero General Public License v3), 5kUSD/año para producción
  • Linux/Mac OS X. Windows no es compatible.
  • primer lanzamiento en enero de 2015

Instalar:

pip install spacy
python -m spacy.en.download

O:

conda install spacy
python -m spacy.en.download

Manifestación:

from spacy.parts_of_speech import ADV

def is_adverb(token):
    return token.pos == spacy.parts_of_speech.ADV

# These are data-specific, so no constants are provided. You have to look
# up the IDs from the StringStore.
NNS = nlp.vocab.strings['NNS']
NNPS = nlp.vocab.strings['NNPS']
def is_plural_noun(token):
    return token.tag == NNS or token.tag == NNPS

def print_coarse_pos(token):
    print(token.pos_)

def print_fine_pos(token):
    print(token.tag_)

Puede usar el paquete Polyglot de Python , que es una canalización de lenguaje natural que admite aplicaciones multilingües masivas:

  • gratis (licencia GPLv3)
  • fuente abierta

Hace etiquetado de parte del discurso:

import polyglot
from polyglot.text import Text, Word

text = Text(u"O primeiro uso de desobediência civil em massa ocorreu em setembro de 1906.")

print("{:<16}{}".format("Word", "POS Tag")+"\n"+"-"*30)
for word, tag in text.pos_tags:
    print(u"{:<16}{:>2}".format(word, tag))
Word            POS Tag
------------------------------
O               DET
primeiro        ADJ
uso             NOUN
de              ADP
desobediência   NOUN
civil           ADJ
em              ADP
massa           NOUN
ocorreu         ADJ
em              ADP
setembro        NOUN
de              ADP
1906            NUM
.               PUNCT

El modelo de etiquetador POS se explica en Al-Rfou, Rami, Bryan Perozzi y Steven Skiena. "Políglota: representaciones de palabras distribuidas para PNL multilingüe". preimpresión de arXiv arXiv:1307.1662 (2013).