Очистка текста и стоп-слова - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь завершить проект по обучению тексту для класса машинного обучения.Мой учитель дал мне следующую функцию, и я не понимаю, почему я получаю ошибку, которую я получаю.Предполагается, что эта функция берет строку слов, удаляет знаки пунктуации и стоп-слова и возвращает новую строку.

def review_to_words( raw_review ):
    # Function to convert a raw review to a string of words
    # The input is a single string (a raw movie review), and 
    # the output is a single string (a preprocessed movie review)
    #
    # 1. Remove HTML
    review_text = BeautifulSoup(raw_review).get_text() 
    #
    # 2. Remove non-letters (punctuation)       
    letters_only = re.sub("[^a-zA-Z]", " ", review_text) 
    #
    # 3. Convert to lower case, split into individual words
    words = letters_only.lower().split()                             
    #
    # 4. In Python, searching a set is much faster than searching
    #   a list, so convert the stop words to a set
    stops = set(stopwords.words("english"))                  
    # 
    # 5. Remove stop words
    meaningful_words = [w for w in words if not w in stops]   
    #
    # 6. Join the words back into one string separated by space, 
    # and return the result.
    return( " ".join( meaningful_words ))

clean_review = review_to_words(first1000["review"][0] )

В следующей строке указано, что произошла ошибка ключа 'review':1004 *

clean_review = review_to_words(first1000["review"][0] )

first1000 - это переменная, установленная на:

first1000 = data["review"][0:1000]

Мой набор данных - это файл .tsv, содержащий несколько тысяч обзоров фильмов из imdb.Переменная 'review' - это всего лишь одна проверка из этого набора данных.

Опять же, эта функция должна принимать строку слов, удалять знаки пунктуации и стоп-слова и возвращать новую строку.Я не уверен, что происходит, потому что я просмотрел код, и он выглядит хорошо для меня.

РЕДАКТИРОВАТЬ: Что я слышу из ответов до сих пор, мои данные словарьсписки.Это звучит правильно.Каждый отзыв представляет собой список слов, а весь набор данных представляет собой список отзывов.Но теперь мне нужно найти способ подсчитать количество списков в словаре.Сейчас у меня есть:

num_reviews = count(train_reviews["reviews"])
print(num_reviews)

, где train_reviews ["reviews"] - это подмножество моих данных.Это все еще словарь списков.Мне нужно посчитать, сколько списков есть в train_reviews.Я не получил ошибку с этим кодом, но я также не получил никакого вывода.Я точно знаю, что это должно было привести к выводу команды print, поэтому я в замешательстве.

PS Если мне нужно задать совершенно новый вопрос, чтобы написать о новой проблеме стот же код, пожалуйста, просто скажите мне, и я буду помнить это в будущем.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы, вероятно, получаете сообщение об ошибке, потому что data["review"][0:1000], скорее всего, list (или несколько повторяющихся), а не словарь.Если так, чтобы исправить это, просто сделайте first1000[0] вместо этого.Однако невозможно сказать, поскольку вы не предоставили MVCE.

Вот (меньший) пример:

In [4]: data = {'review': list(range(10000))}

In [5]: data['review'][0:10]
Out[5]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [6]: first10 = data['review'][0:10]

In [7]: first10[0]
Out[7]: 0

Итак, когда вы получаете доступ к элементу словаря с заданным ключом, тогдавы получаете все, что этот ключ указывает на , а не сам ключ.Поскольку это просто list, вы получите ошибку ключа, если попытаетесь использовать ключ 'review', поскольку list может принимать только целые индексы:

In [8]: first10['review'][0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-61dfa9e84754> in <module>()
----> 1 first10['review'][0]

TypeError: list indices must be integers or slices, not str

HTH.

0 голосов
/ 12 декабря 2018

Похоже, что у вас есть диктант data с различными записями данных, один из которых находится под ключом "review".Эти записи данных являются некоторой последовательностью, возможно, списком строк (строк).

Вы сместили первые 1000 строк в новый список, first1000.Это list, а не dict - у него нет ключей.У вас есть последовательность из 1000 строк в этой переменной - нет записи "review".

Удалите элемент ["review"] из вашего вызова и посмотрите, что вы получите.А еще лучше изучите базовую отладку: распечатайте значения, которые вы используете, чтобы убедиться, что они соответствуют тому, что вы думаете они держат.

См. Этот прекрасный отладчик блог за помощь.

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