A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Procesamiento de texto plano desde Web

21/24
Recursos

Aportes 18

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

El script llamado html2text sirve para convertir p谩ginas HTML en texto plano (eliminando todos los tags de html) y as铆 obtener tokens que corresponden 煤nicamente al contenido del libro. A continuaci贸n les muestro c贸mo instalarlo en Google Colab y obtener los tokens. Funciona de maravilla!

!pip install -q html2text
import html2text
to_text = html2text.html2text(html)
print(to_text)

tokens = re.findall('\w+', to_text)
tokens[:50]

Por si se les buguea NLTK como a mi

text = nltk.Text(tokens)
print('; '.join(text.collocation_list()))

Para eliminar los signos de puntuaci贸n y los caracteres especiales es posible usar nltk.RegexpTokenizer

Mejorar el tokenizador

# bettering tokens with nltk
pattern = r'''(?x)                  # Flag para iniciar el modo verbose
              (?:[A-Z]\.)+          # Hace match con abreviaciones como U.S.A.
              | \w+(?:-\w+)*        # Hace match con palabras que pueden tener un gui贸n interno
              | \$?\d+(?:\.\d+)?%?  # Hace match con dinero o porcentajes como $15.5 o 100%
              | \.\.\.              # Hace match con puntos suspensivos
              | [][;"'?():-_`]      # Hace match con signos de puntuaci贸n
'''
tokens2 = nltk.regexp_tokenize(raw, pattern)
print(tokens2[:50]) 

Hice un filtro fino para los token y asi me quedo:

filter_tokens = []
for token in tokens:
  tokenize = nltk.regexp_tokenize(token, pattern)
  if tokenize and len(tokenize[0]) > 2:
    filter_tokens.append(tokenize[0])
pattern = r'''(?x)                  # Flag para iniciar el modo verbose
              (?:[A-Z]\.)+            # Hace match con abreviaciones como U.S.A.
              | \w+(?:-\w+)*         # Hace match con palabras que pueden tener un gui贸n interno
              | \$?\d+(?:\.\d+)?%?  # Hace match con dinero o porcentajes como $15.5 o 100%
              | \.\.\.              # Hace match con puntos suspensivos
              | [][.,;"'?():-_`]    # Hace match con signos de puntuaci贸n
              
              '''

tokens = nltk.regexp_tokenize(raw, pattern)
tokens[:20]

En mi caso uso la librer铆a re y el m茅todo sub para quitar los controls string.

import re

url = 'http://www.gutenberg.org/files/2554/2554-0.txt'

response = request.urlopen(url)
raw = response.read().decode('utf8')
raw = re.sub('[\n\r]+', '', raw)
raw
[(word, fdist[word]) for word in set(token) if len(word)>3 and fdist[word]>3]

URLs usadas:

url = 'http://www.gutenberg.org/files/2554/2554-0.txt'

url = 'https://www.gutenberg.org/files/2701/2701-h/2701-h.htm'

nice_tokens = [(word, freqdist[word]) for word in set(tokens) if len(word)>3 and freqdist[word]>5]
nice_tokens[:10]

Una patron que me funciona muy bien es texto en ingles es este:

r鈥橽w+|\S\w*鈥

Debido a que el idioma ingles tiene contracciones. Veamos un ejemplo:

texto = "I am big! It's the picture that got small."
print(re.findall(r'\w+', texto))

Salida:
[鈥業鈥, 鈥榓m鈥, 鈥榖ig鈥, 鈥業t鈥, 鈥榮鈥, 鈥榯he鈥, 鈥榩icture鈥, 鈥榯hat鈥, 鈥榞ot鈥, 鈥榮mall鈥橾

Que pas贸 aqui?
Perdi la informaci贸n de la contracci贸n It鈥檚 adem谩s de las puntiaciones, que dependendo del analise que estamos haciendo s铆 puede ser importante. Ahora veamos el otro patr贸n:

texto = "I am big! It's the picture that got small."
print(re.findall(r'\w+|\S\w*', texto))

Salida:
[鈥業鈥, 鈥榓m鈥, 鈥榖ig鈥, 鈥!鈥, 鈥業t鈥, 鈥's鈥, 鈥榯he鈥, 鈥榩icture鈥, 鈥榯hat鈥, 鈥榞ot鈥, 鈥榮mall鈥, 鈥.鈥橾

Que pas贸 aqui?
Tengo las puntuaciones (ojo que no siempre son neces谩rios). Pero tengo algo que s铆 es importante el 's .
Cada vez que encuentro un token junto a este caracter puede indicar que est茅 ligado con el token anterior. Y as铆 no pierdo la contracci贸n.

!pip install -q html2text
import html2text

url = 'https://www.gutenberg.org/files/2701/2701-h/2701-h.htm'
r = requests.get(url)
html = r.text

text = html2text.html2text(html)
print(text)

https://www.nltk.org/book/ch03.html
En este enlace encontrar谩n el paso a paso del ejercicio por si lo necesitan

No se si me equivoco pero el m茅todo de get_text() ya elimina las etiquetas de html, en mi experiencia al aplicar la expresi贸n regular \w+ no me muestra los h1,h2,h3 como en el video.

Uno medio chacaloso

text = re.sub('<?/.*>', '', text)
tokens = re.findall('\w+', text)