Как исправить NameError: имя 'phrasedocs' не определено - PullRequest
0 голосов
/ 31 марта 2019

Я работаю над задачей классификации, используя набор обзоров фильмов из Kaggle. Часть, с которой я борюсь, представляет собой серию функций, в которых выход одного становится входом следующего.

В частности, в предоставленном коде функция «word_token» принимает входной сигнал «phraselist», маркирует его и возвращает токенизированный документ под названием «phrasedocs». Единственная проблема заключается в том, что он не работает, потому что, когда я беру этот теоретический документ "phrasedocs" и ввожу его в следующую функцию "process_token", я получаю:

NameError: имя '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

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Просто вы определили "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
0 голосов
/ 31 марта 2019

Вы только создали переменную phrasedocs в функции.Поэтому переменная не определена для всего вашего другого кода за пределами этой функции.Когда вы вызываете переменную в качестве входных данных для функции, python не может найти переменную с таким именем.Вы должны создать переменную phrasedocs в своем основном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...