Я довольно новичок в обработке текста в 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)