|
7 months ago | |
---|---|---|
.. | ||
solution | 7 months ago | |
README.md | 7 months ago | |
assignment.md | 7 months ago |
README.md
Анализ настроений на основе отзывов о гостиницах - обработка данных
В этом разделе вы будете использовать техники, изученные на предыдущих уроках, для проведения разведочного анализа данных большого набора. Как только вы получите хорошее представление о полезности различных столбцов, вы узнаете:
- как удалить ненужные столбцы
- как рассчитать новые данные на основе существующих столбцов
- как сохранить полученный набор данных для использования в финальном задании
Викторина перед лекцией
Введение
До сих пор вы узнали о том, как текстовые данные значительно отличаются от числовых типов данных. Если это текст, написанный или произнесенный человеком, его можно проанализировать для поиска шаблонов и частот, настроений и значений. Этот урок знакомит вас с реальным набором данных и реальной задачей: 515K отзывов о гостиницах в Европе, который включает в себя лицензию CC0: Public Domain. Данные были собраны с сайта Booking.com из публичных источников. Создателем набора данных является Цзяшень Лю.
Подготовка
Вам потребуется:
- Возможность запускать .ipynb блокноты с использованием Python 3
- pandas
- NLTK, который вы должны установить локально
- Набор данных, доступный на Kaggle 515K отзывов о гостиницах в Европе. Он занимает около 230 МБ после распаковки. Скачайте его в корневую папку
/data
, связанную с этими уроками по NLP.
Разведочный анализ данных
Эта задача предполагает, что вы создаете бота для рекомендаций гостиниц с использованием анализа настроений и оценок отзывов гостей. Набор данных, который вы будете использовать, включает отзывы о 1493 различных гостиницах в 6 городах.
Используя Python, набор данных отзывов о гостиницах и анализ настроений NLTK, вы можете выяснить:
- Какие слова и фразы наиболее часто используются в отзывах?
- Соответствуют ли официальные теги, описывающие гостиницу, оценкам отзывов (например, более негативные отзывы о конкретной гостинице от Семей с маленькими детьми по сравнению с Путешественниками-одиночками, возможно, указывая на то, что она лучше подходит для Путешественников-одиночек?)
- Согласуются ли оценки настроений NLTK с числовой оценкой рецензента гостиницы?
Набор данных
Давайте исследуем набор данных, который вы скачали и сохранили локально. Откройте файл в редакторе, таком как VS Code или даже Excel.
Заголовки в наборе данных следующие:
Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng
Вот они сгруппированы так, чтобы их было легче изучать:
Столбцы гостиницы
Hotel_Name
,Hotel_Address
,lat
(широта),lng
(долгота)- Используя lat и lng, вы можете построить карту с помощью Python, показывающую расположение гостиниц (возможно, с цветовой кодировкой для негативных и позитивных отзывов)
- Hotel_Address явно не полезен для нас, и мы, вероятно, заменим его на страну для более удобной сортировки и поиска
Столбцы мета-отзывов гостиницы
-
Average_Score
- Согласно создателю набора данных, этот столбец представляет собой Среднюю оценку гостиницы, рассчитанную на основе последнего комментария за последний год. Это кажется необычным способом расчета оценки, но это данные, собранные с сайта, так что мы можем принять это за чистую правду на данный момент.
✅ На основе других столбцов в этих данных, можете ли вы придумать другой способ расчета средней оценки?
-
Total_Number_of_Reviews
- Общее количество отзывов, полученных этой гостиницей - неясно (без написания кода), относится ли это к отзывам в наборе данных.
-
Additional_Number_of_Scoring
- Это означает, что оценка отзыва была дана, но рецензент не написал ни положительного, ни негативного отзыва.
Столбцы отзывов
Reviewer_Score
- Это числовое значение с максимумом в 1 десятичное место между минимальными и максимальными значениями 2.5 и 10
- Не объясняется, почему 2.5 - это самая низкая возможная оценка
Negative_Review
- Если рецензент ничего не написал, это поле будет содержать "No Negative"
- Обратите внимание, что рецензент может написать положительный отзыв в столбце Negative review (например, "в этом отеле нет ничего плохого")
Review_Total_Negative_Word_Counts
- Более высокие значения негативных слов указывают на более низкую оценку (без проверки настроения)
Positive_Review
- Если рецензент ничего не написал, это поле будет содержать "No Positive"
- Обратите внимание, что рецензент может написать негативный отзыв в столбце Positive review (например, "в этом отеле нет ничего хорошего")
Review_Total_Positive_Word_Counts
- Более высокие значения положительных слов указывают на более высокую оценку (без проверки настроения)
Review_Date
иdays_since_review
- Может быть применена мера свежести или устаревания к отзыву (старые отзывы могут быть не такими точными, как новые, из-за изменений в управлении гостиницей, проведенных ремонтов или добавления бассейна и т.д.)
Tags
- Это короткие дескрипторы, которые рецензент может выбрать, чтобы описать тип гостя, которым он был (например, одиночка или семья), тип номера, который у него был, продолжительность пребывания и способ, которым был представлен отзыв.
- К сожалению, использование этих тегов вызывает проблемы, смотрите раздел ниже, который обсуждает их полезность.
Столбцы рецензентов
Total_Number_of_Reviews_Reviewer_Has_Given
- Это может быть фактором в модели рекомендаций, например, если вы сможете определить, что более активные рецензенты с сотнями отзывов чаще дают негативные оценки. Однако рецензент любого конкретного отзыва не идентифицируется уникальным кодом, и, следовательно, не может быть связан с набором отзывов. Есть 30 рецензентов с 100 и более отзывами, но трудно увидеть, как это может помочь модели рекомендаций.
Reviewer_Nationality
- Некоторые люди могут считать, что определенные национальности более склонны оставлять положительные или негативные отзывы из-за национальной предрасположенности. Будьте осторожны, строя такие анекдотические взгляды в своих моделях. Это национальные (а иногда и расовые) стереотипы, и каждый рецензент был индивидуумом, который написал отзыв на основе своего опыта. Это могло быть отфильтровано через множество факторов, таких как их предыдущие гостиничные остановки, расстояние, которое они преодолели, и их личный темперамент. Сложно оправдать мнение, что их национальность была причиной оценки отзыва.
Примеры
Средняя оценка | Общее количество отзывов | Оценка рецензента | Негативный Отзыв |
Положительный отзыв | Теги |
---|---|---|---|---|---|
7.8 | 1945 | 2.5 | В данный момент это не гостиница, а строительная площадка. Я был запуган с раннего утра и весь день неприемлемым строительным шумом, пока отдыхал после долгой поездки и работал в номере. Люди работали весь день, т.е. с отбойными молотками в соседних номерах. Я просил сменить номер, но тихого номера не было доступно. Усложняя ситуацию, меня обманули с ценой. Я выехал вечером, так как мне нужно было покинуть отель очень рано, и получил соответствующий счет. На следующий день отель снова снял с меня деньги без моего согласия сверх забронированной цены. Это ужасное место. Не наказывайте себя, бронируя здесь. | Ничего. Ужасное место. Держитесь подальше. | Деловая поездка Пара. Стандартный двухместный номер. Пробыл 2 ночи. |
Как видите, этот гость не остался доволен своим пребыванием в этой гостинице. У гостиницы хорошая средняя оценка 7.8 и 1945 отзывов, но этот рецензент дал ей 2.5 и написал 115 слов о том, как негативно прошло его пребывание. Если бы он вообще ничего не написал в столбце Positive_Review, можно было бы предположить, что ничего положительного не было, но, увы, он написал 7 слов предупреждения. Если бы мы просто считали слова вместо их смысла или настроения, мы могли бы получить искаженное представление о намерениях рецензента. Странно, что его оценка 2.5 вызывает недоумение, потому что если пребывание в гостинице было таким плохим, почему бы не дать ей ни одного балла? Тщательно исследуя набор данных, вы увидите, что самая низкая возможная оценка составляет 2.5, а самая высокая - 10.
Теги
Как упоминалось выше, на первый взгляд, идея использовать Tags
для категоризации данных кажется разумной. К сожалению, эти теги не стандартизированы, что означает, что в одной гостинице варианты могут быть Одноместный номер, Двухместный номер и Стандартный номер, а в следующей гостинице - Делюкс Одноместный Номер, Классический Королевский Номер и Исполнительный Королевский Номер. Это могут быть одни и те же вещи, но существует так много вариаций, что выбор становится:
-
Попытаться изменить все термины на единственный стандарт, что очень сложно, потому что неясно, каким будет путь преобразования в каждом случае (например, Классический одноместный номер соответствует Одноместному номеру, но Улучшенный Королевский Номер с Видом на Двор или Город намного сложнее сопоставить).
-
Мы можем использовать подход NLP и измерить частоту определенных терминов, таких как Одиночка, Деловой путешественник или Семья с маленькими детьми, применительно к каждой гостинице и учесть это в рекомендации.
Теги обычно (но не всегда) представляют собой одно поле, содержащее список из 5-6 значений, разделенных запятыми, соответствующих Типу поездки, Типу гостей, Типу номера, Количество ночей и Типу устройства, на котором был представлен отзыв. Однако из-за того, что некоторые рецензенты не заполняют каждое поле (они могут оставить одно пустым), значения не всегда находятся в одном и том же порядке.
В качестве примера возьмите Тип группы. В этом поле в столбце Tags
есть 1025 уникальных возможностей, и, к сожалению, только некоторые из них относятся к группе (некоторые относятся к типу номера и т.д.). Если отфильтровать только те, которые упоминают семью, результаты содержат множество результатов типа Семейный номер. Если включить термин с, т.е. подсчитать значения Семья с, результаты становятся лучше, более 80,000 из 515,000 результатов содержат фразу "Семья с маленькими детьми" или "Семья с взрослыми детьми".
Это означает, что столбец тегов не полностью бесполезен для нас, но потребуется немного работы, чтобы сделать его полезным.
Средняя оценка гостиницы
С набором данных есть несколько странностей или несоответствий, которые я не могу выяснить, но они иллюстрируются здесь, чтобы вы были в курсе, когда будете строить свои модели. Если вы это поймете, пожалуйста, дайте нам знать в разделе обсуждений!
Набор данных содержит следующие столбцы, относящиеся к средней оценке и количеству отзывов:
- Hotel_Name
- Additional_Number_of_Scoring
- Average_Score
- Total_Number_of_Reviews
- Reviewer_Score
Единственная гостиница с наибольшим количеством отзывов в этом наборе данных - Britannia International Hotel Canary Wharf с 4789 отзывами из 515,000. Но если мы посмотрим на значение Total_Number_of_Reviews
для этой гостиницы, оно составляет 9086. Вы можете предположить, что есть много других оценок без отзывов, так что, возможно, нам следует добавить значение из столбца Additional_Number_of_Scoring
. Это значение составляет 2682, и добавление его к 4789 дает нам 7471, что все еще на 1615 меньше, чем Total_Number_of_Reviews
.
Если вы возьмете столбцы Average_Score
, вы можете предположить, что это среднее значение отзывов в наборе данных, но описание от Kaggle звучит как "Средняя оценка гостиницы, рассчитанная на основе последнего комментария за последний год". Это не кажется полезным, но мы можем рассчитать собственную среднюю оценку на основе оценок отзывов в наборе данных. Используя ту же гостиницу в качестве примера, средняя оценка гостиницы указана как 7.1, но рассчитанная оценка (средняя оценка рецензента в наборе данных) составляет 6.8. Это близко, но не одно и то же значение, и мы можем только догадываться, что оценки, указанные в отзывах Additional_Number_of_Scoring
, увеличили среднюю до 7.1. К сожалению, не имея возможности протестировать или подтвердить это утверждение, трудно использовать или доверять Average_Score
, Additional_Number_of_Scoring
и Total_Number_of_Reviews
, когда они основаны на данных, которых у нас нет.
Чтобы усложнить ситуацию, гостиница с вторым по величине количеством отзывов имеет рассчитанную среднюю оценку 8.12, а в наборе данных Average_Score
она составляет 8.1. Является ли это правильным значением совпадением или первая гостиница - это несоответствие?
Возможность того, что эти гостиницы могут быть выбросами, и что, возможно, большинство значений сходятся (но некоторые не сходятся по какой-то причине), мы напишем короткую программу, чтобы исследовать значения в наборе данных и определить правильное использование (или неиспользование) значений.
🚨 Примечание о предостережении
При работе с этим набором данных вы будете писать код, который рассчитывает что-то из текста, не читая и не анализируя текст самостоятельно. Это суть NLP - интерпретация смысла или настроения без необходимости, чтобы это делал человек. Однако возможно, что вы прочитаете некоторые негативные отзывы. Я бы настоятельно рекомендовал вам этого не делать, потому что вам не нужно. Некоторые из них абсурдны или неуместны, например, "Погода была не очень", что находится вне контроля гостиницы или, действительно, кого-либо. Но есть и темная сторона некоторых отзывов. Иногда негативные отзывы являются расистскими, сексистскими или дискриминационными по отношению к возрасту. Это, к сожалению, ожидаемо в наборе данных, собранном с публичного сайта. Некоторые рецензенты оставляют отзывы, которые вы могли бы посчитать неприятными, неудобными или тревожными. Лучше позволить коду измерить настроение, чем читать их самим и расстраиваться. Тем не менее, это меньшинство, которое пишет такие вещи, но они все равно существуют.
Упражнение - Исследование данных
Загрузка данных
На этом достаточно визуального анализа данных, теперь вы напишете немного кода и получите некоторые ответы! Этот раздел использует библиотеку pandas. Ваша первая задача - убедиться, что вы можете загрузить и прочитать данные CSV. Библиотека pandas имеет быстрый загрузчик CSV, и результат помещается в dataframe, как и в предыдущих уроках. CSV, который мы загружаем, содержит более полумиллиона строк, но только 17 столбцов. Pandas предоставляет множество мощных способов взаимодействия с dataframe, включая возможность выполнять операции над каждой строкой.
С этого момента в этом уроке будут приведены фрагменты кода и некоторые объяснения кода, а также обсуждение того, что означают результаты. Используйте включенный notebook.ipynb для вашего кода.
Давайте начнем с загрузки файла данных, который вы будете использовать:
# Load the hotel reviews from CSV
import pandas as pd
import time
# importing time so the start and end time can be used to calculate file loading time
print("Loading data file now, this could take a while depending on file size")
start = time.time()
# df is 'DataFrame' - make sure you downloaded the file to the data folder
df = pd.read_csv('../../data/Hotel_Reviews.csv')
end = time.time()
print("Loading took " + str(round(end - start, 2)) + " seconds")
Теперь, когда данные загружены, мы можем выполнять некоторые операции над ними. Сохраните этот код в верхней части вашей программы для следующей части.
Исследование данных
В этом случае данные уже чистые, это означает, что они готовы к работе и не содержат символов на других языках, которые могут помешать алгоритмам, ожидающим только английские символы.
строки имеют значения в столбце Positive_Review
"Нет положительного" 9. Рассчитайте и выведите, сколько строк имеют значения в столбце Positive_Review
"Нет положительного" и значения в Negative_Review
"Нет отрицательного" ### Ответы к коду 1. Выведите размер загруженного вами датафрейма (размер - это количество строк и столбцов) ```python
print("The shape of the data (rows, cols) is " + str(df.shape))
The shape of the data (rows, cols) is (515738, 17)
2. Рассчитайте частоту национальностей рецензентов: 1. Сколько различных значений есть в столбце `Reviewer_Nationality` и какие они? 2. Какая национальность рецензента наиболее распространена в наборе данных (выведите страну и количество отзывов)?
python
value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality
nationality_freq = df["Reviewer_Nationality"].value_counts() print("There are " + str(nationality_freq.size) + " different nationalities")
print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data
print(nationality_freq)
There are 227 different nationalities
United Kingdom 245246
United States of America 35437
Australia 21686
Ireland 14827
United Arab Emirates 10235
...
Comoros 1
Palau 1
Northern Mariana Islands 1
Cape Verde 1
Guinea 1
Name: Reviewer_Nationality, Length: 227, dtype: int64
3. Каковы следующие 10 наиболее часто встречающихся национальностей и их частота?
python
print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.")
# Notice there is a leading space on the values, strip() removes that for printing
# What is the top 10 most common nationalities and their frequencies?
print("The next 10 highest frequency reviewer nationalities are:")
print(nationality_freq[1:11].to_string())
The highest frequency reviewer nationality is United Kingdom with 245246 reviews.
The next 10 highest frequency reviewer nationalities are:
United States of America 35437
Australia 21686
Ireland 14827
United Arab Emirates 10235
Saudi Arabia 8951
Netherlands 8772
Switzerland 8678
Germany 7941
Canada 7894
France 7296
``` 3. Какой отель был наиболее часто рецензируемым для каждой из 10 наиболее популярных национальностей рецензентов? ```python
What was the most frequently reviewed hotel for the top 10 nationalities
Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow)
for nat in nationality_freq[:10].index:
# First, extract all the rows that match the criteria into a new dataframe
nat_df = df[df["Reviewer_Nationality"] == nat]
# Now get the hotel freq
freq = nat_df["Hotel_Name"].value_counts()
print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.")
The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews.
The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews.
The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews.
The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews.
The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews.
The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews.
The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews.
The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews.
The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews.
The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews.
4. Сколько отзывов на один отель (частота отзывов на отель) в наборе данных?
python
First create a new dataframe based on the old one, removing the uneeded columns
hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1)
Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found
hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')
Get rid of all the duplicated rows
hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"])
display(hotel_freq_df)
| Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found | | :----------------------------------------: | :---------------------: | :-----------------: | | Britannia International Hotel Canary Wharf | 9086 | 4789 | | Park Plaza Westminster Bridge London | 12158 | 4169 | | Copthorne Tara Hotel London Kensington | 7105 | 3578 | | ... | ... | ... | | Mercure Paris Porte d Orleans | 110 | 10 | | Hotel Wagner | 135 | 10 | | Hotel Gallitzinberg | 173 | 8 | Вы можете заметить, что результаты *подсчитанные в наборе данных* не совпадают со значением в `Total_Number_of_Reviews`. Неясно, представляло ли это значение в наборе данных общее количество отзывов, которые имел отель, но не все были собраны, или это было какое-то другое вычисление. `Total_Number_of_Reviews` не используется в модели из-за этой неясности. 5. Хотя для каждого отеля в наборе данных есть столбец `Average_Score`, вы также можете рассчитать средний балл (получив среднее значение всех оценок рецензентов в наборе данных для каждого отеля). Добавьте новый столбец в ваш датафрейм с заголовком столбца `Calc_Average_Score`, который содержит это рассчитанное среднее значение. Выведите столбцы `Hotel_Name`, `Average_Score` и `Calc_Average_Score`.
python
define a function that takes a row and performs some calculation with it
def get_difference_review_avg(row): return row["Average_Score"] - row["Calc_Average_Score"]
'mean' is mathematical word for 'average'
df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
Add a new column with the difference between the two average scores
df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1)
Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel)
review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"])
Sort the dataframe to find the lowest and highest average score difference
review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"])
display(review_scores_df"Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name")
Вы также можете задаться вопросом о значении `Average_Score` и почему оно иногда отличается от рассчитанного среднего балла. Поскольку мы не можем знать, почему некоторые значения совпадают, а другие имеют разницу, в этом случае безопаснее использовать оценки отзывов, которые у нас есть, чтобы самостоятельно рассчитать среднее значение. Тем не менее, различия обычно очень небольшие, вот отели с наибольшим отклонением от среднего значения набора данных и рассчитанного среднего: | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name | | :----------------------: | :-----------: | :----------------: | ------------------------------------------: | | -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria | | -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery | | -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans | | -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel | | -0.5 | 7.0 | 7.5 | Hotel Royal Elys es | | ... | ... | ... | ... | | 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre | | 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur | | 0.9 | 6.8 | 5.9 | Villa Eugenie | | 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux | | 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar | Поскольку только 1 отель имеет разницу в оценке больше 1, это означает, что мы, вероятно, можем проигнорировать разницу и использовать рассчитанное среднее значение. 6. Рассчитайте и выведите, сколько строк имеют значения в столбце `Negative_Review` "Нет отрицательного" 7. Рассчитайте и выведите, сколько строк имеют значения в столбце `Positive_Review` "Нет положительного" 8. Рассчитайте и выведите, сколько строк имеют значения в столбце `Positive_Review` "Нет положительного" **и** значения в `Negative_Review` "Нет отрицательного"
python
with lambdas:
start = time.time() no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1) print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index)))
no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1) print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index)))
both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1) print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index))) end = time.time() print("Lambdas took " + str(round(end - start, 2)) + " seconds")
Number of No Negative reviews: 127890
Number of No Positive reviews: 35946
Number of both No Negative and No Positive reviews: 127
Lambdas took 9.64 seconds
## Другой способ Другой способ подсчета элементов без Лямбд и использования sum для подсчета строк:
python
without lambdas (using a mixture of notations to show you can use both)
start = time.time() no_negative_reviews = sum(df.Negative_Review == "No Negative") print("Number of No Negative reviews: " + str(no_negative_reviews))
no_positive_reviews = sum(df["Positive_Review"] == "No Positive") print("Number of No Positive reviews: " + str(no_positive_reviews))
both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive")) print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews))
end = time.time() print("Sum took " + str(round(end - start, 2)) + " seconds")
Number of No Negative reviews: 127890
Number of No Positive reviews: 35946
Number of both No Negative and No Positive reviews: 127
Sum took 0.19 seconds
``` Вы могли заметить, что есть 127 строк, которые имеют как "Нет отрицательного", так и "Нет положительного" значения для столбцов Negative_Review
и Positive_Review
соответственно. Это означает, что рецензент дал отелю числовую оценку, но отказался писать либо положительный, либо отрицательный отзыв. К счастью, это небольшое количество строк (127 из 515738, или 0,02%), поэтому это, вероятно, не исказит нашу модель или результаты в каком-либо конкретном направлении, но вы могли не ожидать, что набор данных отзывов будет содержать строки без отзывов, поэтому стоит исследовать данные, чтобы обнаружить такие строки. Теперь, когда вы исследовали набор данных, на следующем уроке вы отфильтруете данные и добавите некоторый анализ настроений. --- ## 🚀Вызов Этот урок демонстрирует, как мы видели в предыдущих уроках, насколько критически важно понимать ваши данные и их особенности перед выполнением операций с ними. Данные на основе текста, в частности, требуют тщательного анализа. Исследуйте различные наборы данных с большим количеством текста и посмотрите, сможете ли вы обнаружить области, которые могут ввести предвзятость или искаженное восприятие в модель. ## Викторина после лекции ## Обзор и самостоятельное изучение Пройдите этот учебный путь по NLP, чтобы узнать о инструментах, которые можно попробовать при создании моделей на основе речи и текста. ## Задание NLTK Пожалуйста, напишите вывод слева направо.
Отказ от ответственности:
Этот документ был переведен с использованием услуг машинного перевода на основе ИИ. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на родном языке следует считать авторитетным источником. Для критически важной информации рекомендуется профессиональный человеческий перевод. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникающие в результате использования этого перевода.