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:
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 :
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.
Resource 'taggers/maxent_treebank_pos_tagger/english.pickle' not found.
y si comienzo nltk.download()
en la consola de python, ¿qué tengo que descargar?apt-get install python-nltk
nltk.download()
, seleccione all
y haga clic download
:) Sin embargo, tenga en cuenta que esto es muy excesivo para su tarea.book
allí 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í?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 NN
para el sustantivo, RB
, ... Por ejemplo: "amor" se resuelve comoIN: preposition or conjunction, subordinating
Puede usar la biblioteca Apache OpenNLP :
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 ):
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:
Instalación:
pip install -U textblob
python -m textblob.download_corpora
Puedes usar spaCy :
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:
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).
izzy
set
Gilles 'SO- deja de ser malvado'
set
Gilles 'SO- deja de ser malvado'
Nicolás Raúl