def load_spell_checker(): """Return spell checker""" if not os.path.exists("data/unigrams.txt"): sents = [normalize_text(" ".join(x)).split() for x in floresta.sents()] sents += [normalize_text(" ".join(x)).split() for x in machado.sents()] sents += [ normalize_text(" ".join(x)).split() for x in mac_morpho.sents() ] unigrams = [item for sublist in sents for item in sublist] unigrams = nltk.probability.FreqDist(unigrams) file = open("data/unigrams.txt", "w") for k, v in unigrams.items(): file.write(f"{k} {v}\n") file.close() bigrams = [] for sent in sents: bigrams += list(nltk.bigrams(sent)) bigrams = nltk.probability.FreqDist(bigrams) file = open("data/bigrams.txt", "w") for k, v in bigrams.items(): file.write(f"{' '.join(k)} {v}\n") file.close() result = SymSpell() result.load_dictionary("data/unigrams.txt", 0, 1) result.load_bigram_dictionary("data/bigrams.txt", 0, 2) return result
def concordance(word, context=30): for sent in mac_morpho.sents(): if word in sent: pos = sent.index(word) left = ' '.join(sent[:pos]) right = ' '.join(sent[pos + 1:]) print('%*s %s %-*s' %\ (context, left[-context:], word, context, right[:context]))
def get_test_data(num_brown=200, num_mac=20): test_list = [] file_list = [] for file in brown.fileids()[:num_brown]: test_list.append(list(brown.sents(file))) file_list.append(file) for file in mac_morpho.fileids()[:num_mac]: test_list.append(list(mac_morpho.sents(file))) file_list.append(file) zip_shuffler = list(zip(test_list, file_list)) random.shuffle(zip_shuffler) test_list, file_list = zip(*zip_shuffler) return test_list, file_list
def pos_features(sentence, i): features = { "suffix(1)": sentence[i][-1:], "suffix(2)": sentence[i][-2:], "suffix(3)": sentence[i][-3:] } if i == 0: features["prev-word"] = "<START>" else: features["prev-word"] = sentence[i - 1] return features pos_features(mac_morpho.sents(), 8) tagged_sents = mac_morpho.tagged_sents() featuresets = [] for tagged_sent in tagged_sents: untagged_sent = nltk.tag.untag(tagged_sent) for i, (word, tag) in enumerate(tagged_sent): featuresets.append((pos_features(untagged_sent, i), tag)) size = int(len(featuresets) * 0.1) train_set, test_set = featuresets[size:], featuresets[:size] classifier = nltk.NaiveBayesClassifier.train(train_set) print('pos') print(pos_features(doc, 8)) print('mac classify') #print(nltk.classify.accuracy(classifier, test_set))
import nltk import nltk.tag import itertools from nltk.corpus import mac_morpho mac_tagged_sents = mac_morpho.tagged_sents() mac_sents = mac_morpho.sents() size = int(len(mac_tagged_sents) * 0.9) train_sents = mac_tagged_sents[:size] test_sents = mac_tagged_sents[size:] unigram_tagger = nltk.UnigramTagger(train_sents) print(unigram_tagger.evaluate(test_sents)) #unigram_tagger = nltk.UnigramTagger(mac_tagged_sents) #print(unigram_tagger.tag(mac_sents[2007])) #print(unigram_tagger.evaluate(mac_tagged_sents)) #tags = [tag for (word, tag) in mac_morpho.tagged_words()] #print(nltk.FreqDist(tags).max())
* **Ambiguidade**: uma mesma palavra pode ter papéis diferentes de acordo com o contexto (e.g., "Ele deu um parecer" - "O verbo parecer") * **Palavras fora do vocabulário**: quando nosso corpus não contém alguma palavra, fica difícil para o POS-Tagger "adivinhar" o valor morfológico da palavra. Isso é especialmente comum quando utilizar um POS-Tagger treinado em um domínio em textos de algum domínio específico, por exemplo, utilizar um POS-Tagger treinado em textos jornalísticos para marcação de um texto de prontuários de pacientes. #### Corpus anotado MacMorpho É um corpus de notícias em português, com mais de um milhão de palavras de textos jornalísticos da Folha de São Paulo. Todo o corpus foi taggeado/etiquetado com os valores morfológicos para cada palavra """ from nltk.corpus import mac_morpho #nltk.download('mac_morpho') # Palavras no corpus mac_morpho.words() # Sentenças mac_morpho.sents() # A palavras e suas tags mac_morpho.tagged_words() mac_morpho.tagged_sents() # Vamos contar a quantidade de tokens len(mac_morpho.words()) # Palavras únicas len(nltk.FreqDist(mac_morpho.words())) # Palavra mais frequente nltk.FreqDist(mac_morpho.words()).max() """#### Treinando o POS-Tagging do NLTK
# - remover stopwords # - remover numerais # - stemming return [remove_diacritics(term).lower() for term in terms] def remove_diacritics(text, encoding='utf8'): """Remove diacritics from bytestring or unicode, returning an unicode string""" nfkd_form = unicodedata.normalize('NFKD', to_unicode(text, encoding)) only_ascii = nfkd_form.encode('ASCII', 'ignore') return only_ascii.decode(encoding) def to_unicode(text, encoding='utf8'): """Convert a string (bytestring in `encoding` or unicode), to unicode.""" if isinstance(text, six.text_type): return text return text.decode(encoding) # nltk.download('mac_morpho') # `news` é uma list que contém listas de tokens news = [normalize_terms(sentence) for sentence in mac_morpho.sents()] print(repr(news[0])) # Estou utilizando os 1000 primeiros pra exemplificar. Processar todos os 51397 demora um tempinho bm25 = BM25(news[:1000]) query = normalize_terms(nltk.word_tokenize('inflacao')) for position, index in enumerate(bm25.ranked(query, 5)): print('{} - {}'.format(position, ' '.join(news[index])))