оптимизация обработки кода Python (nltk) - PullRequest
0 голосов
/ 07 марта 2019

Я довольно новичок в обработке текста в nltk. Я написал блок кода для импорта, обработки, добавления нескольких текстовых файлов и, наконец, извлечения всех биграмм. В частности, предполагается, что код (1) уменьшает все слова в нижний регистр (2) удаляет знаки препинания (3) удаляет цифры (4) удаляет стоп-слова (5) удаляет односимвольные слова (6) стволовые слова (7) лемматизирует слова ( 8) извлекать биграммы.

Однако код медленный, и мне нужно зациклить его для нескольких файлов, поэтому я искал советы по его оптимизации (написание функции или замена циклов).

import nltk
from nltk import bigrams
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from nltk.stem import PorterStemmer

import pandas as pd
import os
import glob  
import numpy as np
import string
import re

path_PS_libraries= "/pathtothetext" #path to data

#Set stopwords for text processing
nltk.download('punkt')
nltk.download('stopwords')
stop_words = set(stopwords.words('english')) 

#Define Lemmatizer and Stemmer
lemmatizer=nltk.stem.WordNetLemmatizer()
nltk.download('wordnet')
stemmer= PorterStemmer()

#Create empty dataframe
d = {'col1': [1, 2], 'col2': [3, 4]}
newDF = pd.DataFrame(data=d)

#Loop to import, process and extract bigrams from text data
files=glob.glob(path_PS_libraries)   
for file in files: 
    f=open(file, 'r')
    content = f.read()
    content = content.lower()  #Text Pre-processing 1. ALL LOWER CASE
    content = content.translate(str.maketrans('','',string.punctuation)) #Text Pre-processing 2. THROW AWAY PUNCTUATION
    content = content.translate(str.maketrans('','','1234567890')) #Text Pre-processing 3. THROW AWAY NUMBERS
    tokens = word_tokenize(content)
    content = [i for i in tokens if not i in stop_words] #eliminate stop words
    tokens=[]
    for each in content:
        tokens.append(word_tokenize(each)[0])   #lemmatizer
    content =[]
    for each in tokens:
        content.append(lemmatizer.lemmatize(each))
    tokens=[]
    for each in content:
        tokens.append(word_tokenize(each)[0])  #stemmer
    content =[]
    for each in tokens:
        content.append(stemmer.stem(each))   
    content =' '.join(content)
    content=' '.join( [w for w in content.split() if len(w)>1] ) #eliminate 1 character words
    string_bigrams=list(bigrams(content.split())) #extract bigrams
    df = pd.DataFrame(np.array(string_bigrams))
    df.columns=['col1', 'col2']  
    newDF=newDF.append(df, ignore_index=True)    


#Drop elements from shell df    
newDF.drop(newDF.index[:2], inplace=True)


#Create bigrams
newDF['bigrams']=newDF['col1'].astype(str)+ " " +newDF['col2']


#Rename library dataframe
Political=newDF
Political= Political.reset_index(drop=True)

#Only bigrams
Pol_Bigrams=Political['bigrams']

#Turn it into Dataframe
Pol_Bigrams=pd.DataFrame(data=Pol_Bigrams)
...