2017-04-18 3 views
1

Python-Neuling hier, arbeiten an meiner ersten Web Scraping/Wort-Frequenz-Analyse mit BeautifulSoup und NLTK.Wie man mehrere Listen für Python verbindet - BeautifulSoup NLTK Analysis

Ich kratze Texas 'Dept of Justice Archiv der letzten Aussagen der Straftäter.

Ich bin zu dem Punkt gekommen, wo ich in der Lage bin, den Text, den ich analysieren möchte, von der Seite jedes Täters zu extrahieren und die Wörter aller Absätze zu tokenisieren, aber es gibt eine Liste von in Token geschriebenen Wörtern pro Absatz zurück. Ich möchte die Listen kombinieren und eine Liste der in Token zerlegten Wörter zurückgeben, die pro Täter analysiert werden sollen.

Ich dachte ursprünglich, mit .join würde mein Problem lösen, aber es gibt immer noch eine Liste pro Absatz zurück. Ich habe auch Iertools ausprobiert. Kein Glück.

Hier ist der gesamte Code, um das häufigste Wort in einer Aussage eines Täters zu finden, aber es gibt das häufigste Wort aus jedem Absatz zurück. Jede Hilfe würde sehr geschätzt werden!

from bs4 import BeautifulSoup 
import urllib.request 
import re 
import nltk 
from nltk import FreqDist 
from nltk.tokenize import sent_tokenize, word_tokenize 
from nltk.corpus import stopwords 

resp = urllib.request.urlopen 
("https://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html") 
soup = BeautifulSoup(resp,"lxml", 
from_encoding=resp.info().get_param('charset')) 

for link in soup.find_all('a', href=re.compile('last'))[1:2]: 
    lastlist = 'https://www.tdcj.state.tx.us/death_row/'+link['href'] 
    resp2 = urllib.request.urlopen(lastlist) 
    soup2 = BeautifulSoup(resp2,"lxml", 
from_encoding=resp2.info().get_param('charset')) 
    body = soup2.body 

    for paragraph in body.find_all('p')[4:5]: 
     name = paragraph.text 
     print(name) 

    for paragraph in body.find_all('p')[6:]: 
     tokens = word_tokenize(paragraph.text) 
     addWords = 
     ['I',',','Yes','.','\'m','n\'t','?',':', 
     'None','To','would','y\'all',')','Last','\'s'] 
     stopWords = set(stopwords.words('english')+addWords) 
     wordsFiltered = [] 

     for w in tokens: 
      if w not in stopWords: 
       wordsFiltered.append(w) 

     fdist1 = FreqDist(wordsFiltered) 
     common = fdist1.most_common(1) 
     print(common) 

Antwort

0
from bs4 import BeautifulSoup 
import urllib.request 
import re 
import nltk 
from nltk import FreqDist 
from nltk.tokenize import sent_tokenize, word_tokenize 
from nltk.corpus import stopwords 

resp = urllib.request.urlopen("https://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html") 
soup = BeautifulSoup(resp,"lxml", from_encoding=resp.info().get_param('charset')) 
wordsFiltered = [] 
for link in soup.find_all('a', href=re.compile('last'))[1:2]: 
    lastlist = 'https://www.tdcj.state.tx.us/death_row/'+link['href'] 
    resp2 = urllib.request.urlopen(lastlist) 
    soup2 = BeautifulSoup(resp2,"lxml", from_encoding=resp2.info().get_param('charset'))  
    body = soup2.body 

    for paragraph in body.find_all('p')[4:5]: 
     name = paragraph.text 
     print(name) 


    for paragraph in body.find_all('p')[6:]: 
     tokens = word_tokenize(paragraph.text) 
     addWords = ['I',',','Yes','.','\'m','n\'t','?',':','None','To','would','y\'all',')','Last','\'s'] 
     stopWords = set(stopwords.words('english')+addWords) 


     for w in tokens: 
      if w not in stopWords: 
       wordsFiltered.append(w) 

fdist1 = FreqDist(wordsFiltered) 
common = fdist1.most_common(1) 
print(common) 

Ich habe den Code bearbeitet gebräuchlichste Wort pro Erklärung zu bekommen. Fühlen Sie sich frei zu kommentieren, wenn Sie etwas nicht verstehen. Denken Sie auch daran, Listen nicht innerhalb einer Schleife zu deklarieren, wenn Sie in jeder Iteration daran anhängen.

+0

Yup - das ist es! Danke Devaraj! – MHolmer

+1

Aber warum bautest du das 'stopWords'-Set für Every neu auf. Verdammt. Absatz? Das ist eine gigantische Zeitverschwendung. – alexis

+0

@alexis hat Recht. Die Liste der Stoppwörter sollte außerhalb der Hauptschleife liegen. –

Verwandte Themen