#python #nlp
#python #nlp
Вопрос:
Я работаю над задачей классификации, используя набор данных обзоров фильмов из Kaggle. Часть, с которой я борюсь, представляет собой серию функций, в которых вывод одной становится входом следующей.
В частности, в предоставленном коде функция «word_token» принимает ввод «phraselist», маркирует его и возвращает маркированный документ под названием «phrasedocs». Единственная проблема в том, что это, похоже, не работает, потому что, когда я беру этот теоретический документ «phrasedocs» и ввожу его в следующую функцию «process_token», я получаю:
Ошибка имени: имя ‘phrasedocs’ не определено
Я полностью готов признать, что есть что-то простое, что я упустил из виду, но я занимался этим часами и не могу понять, что. Я был бы признателен за любую помощь.
Я пробовал корректировать и отлаживать код, но мой опыт работы с Python невелик.
# This function obtains data from train.tsv
def processkaggle(dirPath, limitStr):
# Convert the limit argument from a string to an int
limit = int(limitStr)
os.chdir(dirPath)
f = open('./train.tsv', 'r')
# Loop over lines in the file and use their first limit
phrasedata = []
for line in f:
# Ignore the first line starting with Phrase, then read all lines
if (not line.startswith('Phrase')):
# Remove final end of line character
line = line.strip()
# Each line has four items, separated by tabs
# Ignore the phrase and sentence IDs, keep the phrase and sentiment
phrasedata.append(line.split('t')[2:4])
return phrasedata
# Randomize and subset data
def random_phrase(phrasedata):
random.shuffle(phrasedata) # phrasedata initiated in function processkaggle
phraselist = phrasedata[:limit]
for phrase in phraselist[:10]:
print(phrase)
return phraselist
# Tokenization
def word_token(phraselist):
phrasedocs=[]
for phrase in phraselist:
tokens=nltk.word_tokenize(phrase[0])
phrasedocs.append((tokens, int(phrase[1])))
return phrasedocs
# Pre-processing
# Convert all tokens to lower case
def lower_case(doc):
return [w.lower() for w in doc]
# Clean text, fixing confusion over apostrophes
def clean_text(doc):
cleantext=[]
for review_text in doc:
review_text = re.sub(r"it 's", "it is", review_text)
review_text = re.sub(r"that 's", "that is", review_text)
review_text = re.sub(r"'s", "'s", review_text)
review_text = re.sub(r"'ve", "have", review_text)
review_text = re.sub(r"wo n't", "will not", review_text)
review_text = re.sub(r"do n't", "do not", review_text)
review_text = re.sub(r"ca n't", "can not", review_text)
review_text = re.sub(r"sha n't", "shall not", review_text)
review_text = re.sub(r"n't", "not", review_text)
review_text = re.sub(r"'re", "are", review_text)
review_text = re.sub(r"'d", "would", review_text)
review_text = re.sub(r"'ll", "will", review_text)
cleantext.append(review_text)
return cleantext
# Remove punctuation and numbers
def rem_no_punct(doc):
remtext = []
for text in doc:
punctuation = re.compile(r'[-_.?!/%@,":;'{}<>~`()|0-9]')
word = punctuation.sub("", text)
remtext.append(word)
return remtext
# Remove stopwords
def rem_stopword(doc):
stopwords = nltk.corpus.stopwords.words('english')
updatestopwords = [word for word in stopwords if word not in ['not','no','can','has','have','had','must','shan','do','should','was','were','won','are','cannot','does','ain','could','did','is','might','need','would']]
return [w for w in doc if not w in updatestopwords]
# Lemmatization
def lemmatizer(doc):
wnl = nltk.WordNetLemmatizer()
lemma = [wnl.lemmatize(t) for t in doc]
return lemma
# Stemming
def stemmer(doc):
porter = nltk.PorterStemmer()
stem = [porter.stem(t) for t in doc]
return stem
# This function combines all the previous pre-processing functions into one, which is helpful
# if I want to alter these settings for experimentation later
def process_token(phrasedocs):
phrasedocs2 = []
for phrase in phrasedocs:
tokens = nltk.word_tokenize(phrase[0])
tokens = lower_case(tokens)
tokens = clean_text(tokens)
tokens = rem_no_punct(tokens)
tokens = rem_stopword(tokens)
tokens = lemmatizer(tokens)
tokens = stemmer(tokens)
phrasedocs2.append((tokens, int(phrase[1]))) # Any words that pass through the processing
# steps above are added to phrasedocs2
return phrasedocs2
dirPath = 'C:/Users/J/kagglemoviereviews/corpus'
processkaggle(dirPath, 5000) # returns 'phrasedata'
random_phrase(phrasedata) # returns 'phraselist'
word_token(phraselist) # returns 'phrasedocs'
process_token(phrasedocs) # returns phrasedocs2
NameError Traceback (most recent call last)
<ipython-input-120-595bc4dcf121> in <module>()
5 random_phrase(phrasedata) # returns 'phraselist'
6 word_token(phraselist) # returns 'phrasedocs'
----> 7 process_token(phrasedocs) # returns phrasedocs2
8
9
NameError: name 'phrasedocs' is not defined
Комментарии:
1. Вы никогда не определяли его.
2. Вы никогда ничего не присваивали имени
phrasedocs
.3. Я просто предположил, что когда я запускаю функцию, она определяет содержащуюся в ней переменную и присваивает ей значение, заданное командой «return». Я отстой в Python, вот почему я продолжаю пытаться использовать его как R.
Ответ №1:
Просто вы определили «phrasedocs» внутри функции, которая не видна извне, и возвращаемый функцией результат должен быть записан в переменной, отредактируйте свой код:
dirPath = 'C:/Users/J/kagglemoviereviews/corpus'
phrasedata = processkaggle(dirPath, 5000) # returns 'phrasedata'
phraselist = random_phrase(phrasedata) # returns 'phraselist'
phrasedocs = word_token(phraselist) # returns 'phrasedocs'
phrasedocs2 = process_token(phrasedocs) # returns phrasedocs2
Ответ №2:
Вы создали только переменную phrasedocs в функции. Следовательно, переменная не определена для всего вашего другого кода вне этой функции. Когда вы вызываете переменную в качестве входных данных для функции, python не может найти ни одной переменной с таким именем. Вы должны создать переменную с именем phrasedocs в вашем основном коде.