本文概述
- 绝对加权词频:简介
- 后续步骤和改进
一些例子:
- 推文及其各自的参与数量。
- 网址及其浏览量和跳出。
- 电影标题及其总收入。
- 关键字及其印象, 点击和转化。
- 你将首先完成创建简单函数的过程, 该函数计算并比较文档语料库中单词的绝对出现次数和加权出现次数。有时, 通过查看前十个左右的值, 可以发现不一定清晰的隐藏趋势和汇总。它们通常也可能与绝对词频不同。
- 然后, 你将看到真实的数据集(电影标题和总收入), 并希望发现隐藏的趋势。一个预告片:爱情会以某种方式出现!
- 你将使用Python作为编程语言, 并使用collections模块的defaultdict数据结构进行繁重的工作, 并使用pandas DataFrames管理最终输出。
推文 | 观看次数 |
---|---|
西班牙 | 800 |
法国 | 200 |
此处的加权频率明显不同, 并且分割为80:20。换句话说, 尽管” 西班牙” 和” 法国” 在你的推文中都出现过一次, 但从读者的角度来看, 前者出现了800次, 而后者出现了200次。有很大的不同!
使用defaultdict的简单单词频率
现在考虑一组类似的文档的示例:
文献 | 观看次数 |
---|---|
法国 | 200 |
西班牙 | 180 |
西班牙海滩 | 170 |
法国海滩 | 160 |
西班牙最好的海滩 | 160 |
from collections import defaultdictimport pandas as pdtext_list = ['france', 'spain', 'spain beaches', 'france beaches', 'spain best beaches']word_freq = defaultdict(int)for text in text_list:
for word in text.split():
word_freq[word] += 1pd.DataFrame.from_dict(word_freq, orient='index') \
.sort_values(0, ascending=False) \
.rename(columns={0: 'abs_freq'})
abs_freq | |
---|---|
西班牙 | 3 |
海滩 | 3 |
法国 | 2 |
最好 | 1 |
当你尝试为word_freq [word]分配值时, 有两种可能的情况:
- 关键字存在:在这种情况下, 分配已完成(加一)
- 关键字不在word_freq中, 在这种情况下defaultdict调用它在首次定义时分配给它的默认函数, 在这种情况下为int。
尽管在第一张表中最重要的单词是” france” , 但在对每个文档中的所有单词进行计数之后, 我们可以看到” spain” 和” beaches” 并列第一。这对于发现隐藏趋势非常重要, 尤其是当你要处理的文档列表为数以万计时。
加权词频
现在你已经计算了文档语料库中每个单词的出现次数, 现在你想要查看加权频率。也就是说, 你希望查看单词在读者中出现的次数, 与你使用它们的次数相比。
在第一个表格中, 单词的绝对频率在” 西班牙” 和” 法国” 之间平均分配, 但是” 西班牙” 的权重明显更高, 因为它的价值是800, 而” 200″ 或” 法国” 。
但是第二张稍微复杂一点的表的加权单词频率是多少?
让我们找出答案!
你可以重复使用上面使用的一些代码, 但要增加一些内容:
# default value is now a list with two ints
word_freq = defaultdict(lambda: [0, 0]) # the `views` column you had in the first DataFrame
num_list = [200, 180, 170, 160, 160]# looping is now over both the text and the numbers
for text, num in zip(text_list, num_list):
for word in text.split():
# same as before
word_freq[word][0] += 1
# new line, incrementing the numeric value for each word
word_freq[word][1] += num columns = {0: 'abs_freq', 1: 'wtd_freq'}abs_wtd_df = pd.DataFrame.from_dict(word_freq, orient='index') \
.rename(columns=columns) \
.sort_values('wtd_freq', ascending=False) \
.assign(rel_value=http://www.srcmini.com/lambda df: df['wtd_freq'] / df['abs_freq']) \
.round()abs_wtd_df.style.background_gradient(low=0, high=.7, subset=['rel_value'])
abs_freq | wtd_freq | rel_value | |
---|---|---|---|
西班牙 | 3 | 510 | 170 |
海滩 | 3 | 490 | 163 |
法国 | 2 | 360 | 180 |
最好 | 1 | 160 | 160 |
- 尽管” france” 是总体上最高的词组, 但是当你使用加权频率时, ” spanish” 和” beaches” 似乎更加突出。
- rel_value是一个简单的除法, 用于获取每个单词每次出现时的值。
- 查看rel_value, 你还可以看到, 即使wtd_freq指标上的’ france’ 值非常低, 但似乎仍有潜力, 因为每次发生的值都很高。例如, 这可能暗示你增加了” 法国” 的内容覆盖率。
abs_wtd_df.insert(1, 'abs_perc', value=http://www.srcmini.com/abs_wtd_df['abs_freq'] / abs_wtd_df['abs_freq'].sum())
abs_wtd_df.insert(2, 'abs_perc_cum', abs_wtd_df['abs_perc'].cumsum())
abs_wtd_df.insert(4, 'wtd_freq_perc', abs_wtd_df['wtd_freq'] / abs_wtd_df['wtd_freq'].sum())
abs_wtd_df.insert(5, 'wtd_freq_perc_cum', abs_wtd_df['wtd_freq_perc'].cumsum())
abs_wtd_df.style.background_gradient(low=0, high=0.8)
abs_freq | abs_perc | abs_perc_cum | wtd_freq | wtd_freq_perc | wtd_freq_perc_cum | rel_value | |
---|---|---|---|---|---|---|---|
西班牙 | 3 | 0.333333 | 0.333333 | 510 | 0.335526 | 0.335526 | 170 |
海滩 | 3 | 0.333333 | 0.666667 | 490 | 0.322368 | 0.657895 | 163 |
法国 | 2 | 0.222222 | 0.888889 | 360 | 0.236842 | 0.894737 | 180 |
最好 | 1 | 0.111111 | 1 | 160 | 0.105263 | 1 | 160 |
那么, 在具有一些真实数据的真实环境中, 这看起来如何呢?
你将看电影的标题, 查看标题中使用最多的单词-这是绝对频率-哪些单词与最多的收入或加权频率相关。
Boxoffice Mojo列出了超过15, 000部电影以及相关的总收入和排名。首先使用请求和BeautifulSoup抓取数据-如果你愿意, 你可以在此处探索Boxoffice Mojo:
import requests
from bs4 import BeautifulSoup
final_list = []for i in range(1, 156):
if not i%10:
print(i)
page = 'http://www.boxofficemojo.com/alltime/domestic.htm?page=' + str(i) + '&
p=.htm'
resp = requests.get(page)
soup = BeautifulSoup(resp.text, 'lxml')
# trial and error to get the exact positions
table_data = http://www.srcmini.com/[x.text for x in soup.select('tr td')[11:511]]
# put every 5 values in a row
temp_list = [table_data[i:i+5] for i in range(0, len(table_data[:-4]), 5)]
for temp in temp_list:
final_list.append(temp)
10
20
30
40
50
60
70
80
90
100
110
120
130
140
150
boxoffice_df = pd.DataFrame.from_records(final_list)boxoffice_df.head(10)
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 1 | 星球大战:原力觉醒 | BV | $936, 662, 225 | 2015 |
1 | 2 | 头像 | 狐狸 | $760, 507, 625 | 2009^ |
2 | 3 | 黑豹 | BV | $681, 084, 109 | 2018 |
3 | 4 | 铁达尼号 | 依 | $659, 363, 944 | 1997^ |
4 | 5 | 侏罗纪世界 | 团结。 | $652, 270, 625 | 2015 |
5 | 6 | 漫威的复仇者联盟 | BV | $623, 357, 910 | 2012 |
6 | 7 | 星球大战:最后的绝地武士 | BV | $620, 181, 382 | 2017 |
7 | 8 | 黑暗骑士 | WB | $534, 858, 444 | 2008^ |
8 | 9 | 侠盗一号:星球大战外传 | BV | $532, 177, 324 | 2016 |
9 | 10 | Beauty and the Beast (2017) | BV | $504, 014, 165 | 2017 |
boxoffice_df.tail(15)
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
15485 | 15486 | 黑暗时刻 | 不适用 | $423 | 2005 |
15486 | 15487 | 2:22 | 量。 | $422 | 2017 |
15487 | 15488 | 国家公园 | ATL | $421 | 1988 |
15488 | 15489 | The Magician (2010) | Reg。 | $406 | 2010 |
15489 | 15490 | 无皮的 | PPF | $400 | 2014 |
15490 | 15491 | Cinemanovels | 蒙特 | $398 | 2014 |
15491 | 15492 | 汉娜:佛教的不朽旅程 | KL | $396 | 2016 |
15492 | 15493 | 143号公寓 | 量。 | $383 | 2012 |
15493 | 15494 | 沼泽 | 所有。 | $336 | 2007 |
15494 | 15495 | 女仆 | FM | $315 | 2015 |
15495 | 15496 | 来自火星的消息 | KL | $310 | 2016 |
15496 | 15497 | 特洛伊战争 | WB | $309 | 1997 |
15497 | 15498 | !小日记 | 分发。 | $287 | 2015 |
15498 | 15499 | 介入 | 所有。 | $279 | 2007 |
15499 | 15500 | 回放 | 量。 | $264 | 2012 |
na_year_idx =[i for i, x in enumerate(final_list) if x[4] == 'n/a'] # get the indexes of the 'n/a' values
new_years = [1998, 1999, 1960, 1973]# got them by checking onlineprint(*[(i, x) for i, x in enumerate(final_list) if i in na_year_idx], sep='\n')
print('new year values:', new_years)
(8003, ['8004', 'Warner Bros. 75th Anniversary Film Festival', 'WB', '$741, 855', 'n/a'])
(8148, ['8149', 'Hum Aapke Dil Mein Rahte Hain', 'Eros', '$668, 678', 'n/a'])
(8197, ['8198', 'Purple Moon (Re-issue)', 'Mira.', '$640, 945', 'n/a'])
(10469, ['10470', 'Amarcord', 'Jan.', '$125, 493', 'n/a'])
new year values: [1998, 1999, 1960, 1973]
for na_year, new_year in zip(na_year_idx, new_years):
final_list[na_year][4] = new_year
print(final_list[na_year], new_year)
['8004', 'Warner Bros. 75th Anniversary Film Festival', 'WB', '$741, 855', 1998] 1998
['8149', 'Hum Aapke Dil Mein Rahte Hain', 'Eros', '$668, 678', 1999] 1999
['8198', 'Purple Moon (Re-issue)', 'Mira.', '$640, 945', 1960] 1960
['10470', 'Amarcord', 'Jan.', '$125, 493', 1973] 1973
现在, 通过使用适当的名称命名列并将其转换为所需的数据类型, 将列表变成pandas DataFrame。
import re
regex = '|'.join(['\$', ', ', '\^'])columns = ['rank', 'title', 'studio', 'lifetime_gross', 'year']boxoffice_df = pd.DataFrame({
'rank': [int(x[0]) for x in final_list], # convert ranks to integers
'title': [x[1] for x in final_list], # get titles as is
'studio': [x[2] for x in final_list], # get studio names as is
'lifetime_gross': [int(re.sub(regex, '', x[3])) for x in final_list], # remove special characters and convert to integer
'year': [int(re.sub(regex, '', str(x[4]))) for x in final_list], # remove special characters and convert to integer
})
print('rows:', boxoffice_df.shape[0])
print('columns:', boxoffice_df.shape[1])
print('\ndata types:')
print(boxoffice_df.dtypes)
boxoffice_df.head(15)
rows: 15500
columns: 5data types:
lifetime_grossint64
rankint64
studioobject
titleobject
yearint64
dtype: object
life_gross | 秩 | 工作室 | 标题 | 年 | |
---|---|---|---|---|---|
0 | 936662225 | 1 | BV | 星球大战:原力觉醒 | 2015 |
1 | 760507625 | 2 | 狐狸 | 头像 | 2009 |
2 | 681084109 | 3 | BV | 黑豹 | 2018 |
3 | 659363944 | 4 | 依 | 铁达尼号 | 1997 |
4 | 652270625 | 5 | 团结。 | 侏罗纪世界 | 2015 |
5 | 623357910 | 6 | BV | 漫威的复仇者联盟 | 2012 |
6 | 620181382 | 7 | BV | 星球大战:最后的绝地武士 | 2017 |
7 | 534858444 | 8 | WB | 黑暗骑士 | 2008 |
8 | 532177324 | 9 | BV | 侠盗一号:星球大战外传 | 2016 |
9 | 504014165 | 10 | BV | Beauty and the Beast (2017) | 2017 |
10 | 486295561 | 11 | BV | 海底总动员2 | 2016 |
11 | 474544677 | 12 | 狐狸 | 星球大战:第一集-幻影威胁 | 1999 |
12 | 460998007 | 13 | 狐狸 | 星球大战 | 1977 |
13 | 459005868 | 14 | BV | 复仇者联盟:奥创纪元 | 2015 |
14 | 448139099 | 15 | WB | 黑暗骑士崛起 | 2012 |
现在, 让我们利用你开发的代码, 看看它如何在该数据集上工作。下面的代码没有新内容, 你只需将它们全部放在一个函数中:
def word_frequency(text_list, num_list, sep=None):
word_freq = defaultdict(lambda: [0, 0])for text, num in zip(text_list, num_list):
for word in text.split(sep=sep):
word_freq[word][0] += 1
word_freq[word][1] += numcolumns = {0: 'abs_freq', 1: 'wtd_freq'}abs_wtd_df = (pd.DataFrame.from_dict(word_freq, orient='index')
.rename(columns=columns )
.sort_values('wtd_freq', ascending=False)
.assign(rel_value=http://www.srcmini.com/lambda df: df['wtd_freq'] / df['abs_freq']).round())abs_wtd_df.insert(1, 'abs_perc', value=http://www.srcmini.com/abs_wtd_df['abs_freq'] / abs_wtd_df['abs_freq'].sum())
abs_wtd_df.insert(2, 'abs_perc_cum', abs_wtd_df['abs_perc'].cumsum())
abs_wtd_df.insert(4, 'wtd_freq_perc', abs_wtd_df['wtd_freq'] / abs_wtd_df['wtd_freq'].sum())
abs_wtd_df.insert(5, 'wtd_freq_perc_cum', abs_wtd_df['wtd_freq_perc'].cumsum())return abs_wtd_df
word_frequency(boxoffice_df['title'], boxoffice_df['lifetime_gross']).head()
abs_freq | abs_perc | abs_perc_cum | wtd_freq | wtd_freq_perc | wtd_freq_perc_cum | rel_value | |
---|---|---|---|---|---|---|---|
的 | 3055 | 0.068747 | 0.068747 | 67518342498 | 0.081167 | 0.081167 | 22100930.0 |
的 | 1310 | 0.029479 | 0.098227 | 32973100860 | 0.039639 | 0.120806 | 25170306.0 |
of | 1399 | 0.031482 | 0.129709 | 30180592467 | 0.036282 | 0.157087 | 21572975.0 |
和 | 545 | 0.012264 | 0.141973 | 12188113847 | 0.014652 | 0.171739 | 22363512.0 |
2 | 158 | 0.003556 | 0.145529 | 9032673058 | 0.010859 | 0.182598 | 57168817.0 |
- 删除所有停用词:你可以通过向函数添加新参数并提供自己的停用词列表来实现。
- 处理所有小写单词以删除重复项
# words will be expanded
def word_frequency(text_list, num_list, sep=None, rm_words=('the', 'and', 'a')):
word_freq = defaultdict(lambda: [0, 0])for text, num in zip(text_list, num_list):
for word in text.split(sep=sep):
# This should take care of ignoring the word if it's in the stop words
if word.lower() in rm_words:
continue
# .lower() makes sure we are not duplicating words
word_freq[word.lower()][0] += 1
word_freq[word.lower()][1] += numcolumns = {0: 'abs_freq', 1: 'wtd_freq'}abs_wtd_df = (pd.DataFrame.from_dict(word_freq, orient='index')
.rename(columns=columns )
.sort_values('wtd_freq', ascending=False)
.assign(rel_value=http://www.srcmini.com/lambda df: df['wtd_freq'] / df['abs_freq']).round())abs_wtd_df.insert(1, 'abs_perc', value=http://www.srcmini.com/abs_wtd_df['abs_freq'] / abs_wtd_df['abs_freq'].sum())
abs_wtd_df.insert(2, 'abs_perc_cum', abs_wtd_df['abs_perc'].cumsum())
abs_wtd_df.insert(4, 'wtd_freq_perc', abs_wtd_df['wtd_freq'] / abs_wtd_df['wtd_freq'].sum())
abs_wtd_df.insert(5, 'wtd_freq_perc_cum', abs_wtd_df['wtd_freq_perc'].cumsum())abs_wtd_df = abs_wtd_df.reset_index().rename(columns={'index': 'word'})return abs_wtd_df
from collections import defaultdict
word_freq_df =word_frequency(boxoffice_df['title'], boxoffice_df['lifetime_gross'], rm_words=['of', 'in', 'to', 'and', 'a', 'the', 'for', 'on', '&
', 'is', 'at', 'it', 'from', 'with'])word_freq_df.head(15).style.bar(['abs_freq', 'wtd_freq', 'rel_value'], color='#60DDFF') # E6E9EB
字 | abs_freq | abs_perc | abs_perc_cum | wtd_freq | wtd_freq_perc | wtd_freq_perc_cum | rel_value | |
---|---|---|---|---|---|---|---|---|
0 | 2 | 158 | 0.00443945 | 0.00443945 | 9032673058 | 0.0137634 | 0.0137634 | 5.71688e+07 |
1 | 星 | 45 | 0.0012644 | 0.00570385 | 5374658819 | 0.00818953 | 0.0219529 | 1.19437e+08 |
2 | 男人 | 195 | 0.00547907 | 0.0111829 | 3967037854 | 0.0060447 | 0.0279976 | 2.03438e+07 |
3 | 部分 | 41 | 0.00115201 | 0.0123349 | 3262579777 | 0.00497129 | 0.0329689 | 7.95751e+07 |
4 | 电影 | 117 | 0.00328744 | 0.0156224 | 3216050557 | 0.00490039 | 0.0378693 | 2.74876e+07 |
5 | 3 | 63 | 0.00177016 | 0.0173925 | 3197591193 | 0.00487227 | 0.0427415 | 5.07554e+07 |
6 | ii | 67 | 0.00188255 | 0.0192751 | 3077712883 | 0.0046896 | 0.0474311 | 4.5936e+07 |
7 | 战争: | 6 | 0.000168587 | 0.0194437 | 2757497155 | 0.00420168 | 0.0516328 | 4.59583e+08 |
8 | 持续 | 133 | 0.003737 | 0.0231807 | 2670229651 | 0.00406871 | 0.0557015 | 2.00769e+07 |
9 | 哈里 | 27 | 0.00075864 | 0.0239393 | 2611329714 | 0.00397896 | 0.0596805 | 9.67159e+07 |
10 | me | 140 | 0.00393369 | 0.027873 | 2459330128 | 0.00374736 | 0.0634279 | 1.75666e+07 |
11 | 波特 | 10 | 0.000280978 | 0.028154 | 2394811427 | 0.00364905 | 0.0670769 | 2.39481e+08 |
12 | 黑色 | 71 | 0.00199494 | 0.0301489 | 2372306467 | 0.00361476 | 0.0706917 | 3.34128e+07 |
13 | – | 49 | 0.00137679 | 0.0315257 | 2339484878 | 0.00356474 | 0.0742564 | 4.77446e+07 |
14 | 故事 | 107 | 0.00300646 | 0.0345322 | 2231437526 | 0.00340011 | 0.0776565 | 2.08546e+07 |
(word_freq_df.sort_values('abs_freq', ascending=False)
.head(15)
.style.bar(['abs_freq', 'wtd_freq', 'rel_value'], color='#60DDFF'))
字 | abs_freq | abs_perc | abs_perc_cum | wtd_freq | wtd_freq_perc | wtd_freq_perc_cum | rel_value | |
---|---|---|---|---|---|---|---|---|
26 | 爱 | 211 | 0.00592863 | 0.069542 | 1604206885 | 0.00244438 | 0.111399 | 7.60288e+06 |
2 | 男人 | 195 | 0.00547907 | 0.0111829 | 3967037854 | 0.0060447 | 0.0279976 | 2.03438e+07 |
24 | my | 191 | 0.00536668 | 0.0618994 | 1629540498 | 0.00248298 | 0.106478 | 8.53163e+06 |
15 | 一世 | 168 | 0.00472043 | 0.0392526 | 2203439786 | 0.00335745 | 0.081014 | 1.31157e+07 |
0 | 2 | 158 | 0.00443945 | 0.00443945 | 9032673058 | 0.0137634 | 0.0137634 | 5.71688e+07 |
10 | me | 140 | 0.00393369 | 0.027873 | 2459330128 | 0.00374736 | 0.0634279 | 1.75666e+07 |
31 | 生活 | 134 | 0.0037651 | 0.0764822 | 1534647732 | 0.00233839 | 0.123297 | 1.14526e+07 |
8 | 持续 | 133 | 0.003737 | 0.0231807 | 2670229651 | 0.00406871 | 0.0557015 | 2.00769e+07 |
23 | you | 126 | 0.00354032 | 0.0565327 | 1713758853 | 0.00261131 | 0.103995 | 1.36013e+07 |
4 | 电影 | 117 | 0.00328744 | 0.0156224 | 3216050557 | 0.00490039 | 0.0378693 | 2.74876e+07 |
14 | 故事 | 107 | 0.00300646 | 0.0345322 | 2231437526 | 0.00340011 | 0.0776565 | 2.08546e+07 |
33 | 晚 | 104 | 0.00292217 | 0.0814555 | 1523917360 | 0.00232204 | 0.127946 | 1.46531e+07 |
19 | 美国的 | 93 | 0.00261309 | 0.0478505 | 1868854192 | 0.00284763 | 0.0932591 | 2.00952e+07 |
117 | 女孩 | 90 | 0.0025288 | 0.151644 | 842771661 | 0.00128416 | 0.26663 | 9.36413e+06 |
16 | 天 | 87 | 0.00244451 | 0.0416971 | 2164198760 | 0.00329766 | 0.0843116 | 2.48758e+07 |
import matplotlib.pyplot as plt
plt.figure(figsize=(20, 8))
plt.subplot(1, 2, 1)word_freq_df_abs = word_freq_df.sort_values('abs_freq', ascending=False).reset_index()plt.barh(range(20), list(reversed(word_freq_df_abs['abs_freq'][:20])), color='#288FB7')
for i, word in enumerate(word_freq_df_abs['word'][:20]):
plt.text(word_freq_df_abs['abs_freq'][i], 20-i-1, s=str(i+1) + '. ' + word + ': '+ str(word_freq_df_abs['abs_freq'][i]), ha='right', va='center', fontsize=14, color='white', fontweight='bold')
plt.text(0.4, -1.1, s='Number of times the word was used in a movie title;
out of 15500 movies.', fontsize=14)
plt.text(0.4, -1.8, s='Data: boxofficemojo.com Apr. 2018.Feedback: @eliasdabbas', fontsize=14)plt.vlines(range(0, 210, 10), -1, 20, colors='gray', alpha=0.1)
plt.hlines(range(0, 20, 2), 0, 210, colors='gray', alpha=0.1)
plt.yticks([])
plt.xticks([])
plt.title('Words Most Used in Movie Titles', fontsize=22, fontweight='bold')# =============
plt.subplot(1, 2, 2)
# plt.axis('off')
plt.barh(range(20), list(reversed(word_freq_df['wtd_freq'][:20])), color='#288FB7')
for i, word in enumerate(word_freq_df['word'][:20]):
plt.text(word_freq_df['wtd_freq'][i], 20-i-1, s=str(i+1) + '. ' + word + ': ' + '$' + str(round(word_freq_df['wtd_freq'][i] / 1000_000_000, 2)) + 'b', ha='right', va='center', fontsize=14, color='white', fontweight='bold')
plt.text(0.4, -1.1, s='Alltime boxoffice revenue of all movies whos title contained the word. (Top word is "2") ', fontsize=14)
plt.text(0.4, -1.8, s='Data collection &
methodology: http://bit.ly/word_freq', fontsize=14)plt.vlines(range(0, 9_500_000_000, 500_000_000), -1, 20, colors='gray', alpha=0.1)
plt.hlines(range(0, 20, 2), 0, 10_000_000_000, colors='gray', alpha=0.1)
plt.xlim((-70_000_000, 9_500_000_000))
plt.yticks([])
plt.xticks([])
plt.title('Words Most Associated With Boxoffice Revenue', fontsize=22, fontweight='bold')
plt.tight_layout(pad=0.01)
plt.show()
文章图片
【文字中单词的绝对频率和加权频率】似乎至少在制作人和作家的心中, 爱确实征服了所有人!它是所有电影标题中使用最多的单词。但是, 在加权频率(票房收入)方面, 它并不高。
换句话说, 如果你看电影的所有标题, “ 爱” 一词将是你最容易找到的电影。但是估算一下哪个词在观看者眼中出现得最多(使用总收入作为衡量标准), 那么” 2″ , ” star” 和” man” 将是观看次数最多或与收入最高相关的内容。
只是要清楚:这是非常简单的计算。当你说” 爱” 一词的加权频率为1, 604, 106, 767时, 仅表示标题中包括” 爱” 一词的所有电影的总生存期总和就是那个数量。
有趣的是, ” 2″ 是最高单词。显然, 这不是一个字, 而是表明电影系列的第二部分的总和很大。位于第五位的” 3″ 也是如此。请注意, ” part” 和” ii” 也在前十名中, 证实了相同的事实。
“ 美国人” 和” 电影” 具有较高的相对价值。
关于此功能中使用的停用词的快速说明
通常, 与此处的停用词相比, 你会提供更全面的停用词列表, 尤其是在处理文章或社交媒体帖子时。例如, nltk软件包提供了几种语言的停用词列表, 可以下载和使用这些列表。
在对热门电影进行几次检查后, 才选择了此处的字词。其中许多通常被视为停用词, 但对于电影标题而言, 保留其中一些是有意义的, 因为它们可能会提供一些见解。例如, “ 我” , “ 我” , “ 你” 一词可能暗示了一些社会动态。另一个原因是电影标题是很短的短语, 因此我们正在努力使它们尽可能地有意义。
你绝对可以用自己的单词来尝试一下, 然后看到稍微不同的结果。
回顾电影标题的原始列表, 我们发现某些热门单词甚至没有出现在前十名中, 而这正是我们试图通过这种方法发现的洞察力。
boxoffice_df.head(10)
life_gross | 秩 | 工作室 | 标题 | 年 | |
---|---|---|---|---|---|
0 | 936662225 | 1 | BV | 星球大战:原力觉醒 | 2015 |
1 | 760507625 | 2 | 狐狸 | 头像 | 2009 |
2 | 681084109 | 3 | BV | 黑豹 | 2018 |
3 | 659363944 | 4 | 依 | 铁达尼号 | 1997 |
4 | 652270625 | 5 | 团结。 | 侏罗纪世界 | 2015 |
5 | 623357910 | 6 | BV | 漫威的复仇者联盟 | 2012 |
6 | 620181382 | 7 | BV | 星球大战:最后的绝地武士 | 2017 |
7 | 534858444 | 8 | WB | 黑暗骑士 | 2008 |
8 | 532177324 | 9 | BV | 侠盗一号:星球大战外传 | 2016 |
9 | 504014165 | 10 | BV | Beauty and the Beast (2017) | 2017 |
(boxoffice_df[boxoffice_df['title']
.str
.contains('2 | 2', case=False)] # spaces used to exclude words like '2010'
.head(10))
life_gross | 秩 | 工作室 | 标题 | 年 | |
---|---|---|---|---|---|
15 | 441226247 | 16 | DW | 怪物史莱克2 | 2004 |
30 | 389813101 | 31 | BV | 银河护卫队2 | 2017 |
31 | 381011219 | 32 | WB | 哈利·波特与死亡圣器第二部分 | 2011 |
35 | 373585825 | 36 | 了索尼 | 蜘蛛侠2 | 2004 |
38 | 368061265 | 39 | 团结。 | 卑鄙的我2 | 2013 |
64 | 312433331 | 65 | 依 | 钢铁侠2 | 2010 |
79 | 292324737 | 80 | LG / S | 暮光之城:破晓(第二部分) | 2012 |
87 | 281723902 | 88 | LGF | 饥饿游戏:Mockingjay-第2部分 | 2015 |
117 | 245852179 | 118 | BV | 玩具总动员2 | 1999 |
146 | 226164286 | 147 | NL | 高峰2 | 2001 |
boxoffice_df[boxoffice_df['title'].str.contains('star | star', case=False)].head(10)
life_gross | 秩 | 工作室 | 标题 | 年 | |
---|---|---|---|---|---|
0 | 936662225 | 1 | BV | 星球大战:原力觉醒 | 2015 |
6 | 620181382 | 7 | BV | 星球大战:最后的绝地武士 | 2017 |
8 | 532177324 | 9 | BV | 侠盗一号:星球大战外传 | 2016 |
11 | 474544677 | 12 | 狐狸 | 星球大战:第一集-幻影威胁 | 1999 |
12 | 460998007 | 13 | 狐狸 | 星球大战 | 1977 |
33 | 380270577 | 34 | 狐狸 | 星球大战:第三集-西斯的复仇 | 2005 |
65 | 310676740 | 66 | 狐狸 | 星球大战:第二集-克隆人的攻击 | 2002 |
105 | 257730019 | 106 | 依 | 星际迷航 | 2009 |
140 | 228778661 | 141 | 依 | 星际迷航:进入黑暗 | 2013 |
301 | 158848340 | 302 | 依 | 星际迷航 | 2016 |
boxoffice_df[boxoffice_df['title'].str.contains('man | man', case=False)].head(10)
life_gross | 秩 | 工作室 | 标题 | 年 | |
---|---|---|---|---|---|
18 | 423315812 | 19 | BV | 加勒比海盗:死人的胸膛 | 2006 |
22 | 409013994 | 23 | BV | 钢铁侠3 | 2013 |
35 | 373585825 | 36 | 了索尼 | 蜘蛛侠2 | 2004 |
48 | 336530303 | 49 | 了索尼 | 蜘蛛侠3 | 2007 |
53 | 330360194 | 54 | WB | 蝙蝠侠对超人:正义曙光 | 2016 |
59 | 318412101 | 60 | 依 | 钢铁侠 | 2008 |
64 | 312433331 | 65 | 依 | 钢铁侠2 | 2010 |
82 | 291045518 | 83 | WB | 钢铁之躯 | 2013 |
176 | 206852432 | 177 | WB | 蝙蝠侠侠影之谜 | 2005 |
182 | 202853933 | 183 | 了索尼 | 超凡蜘蛛侠2 | 2014 |
除电影标题外, 进一步的练习可能是获得更详细的描述。例如:
“ 一名计算机黑客从神秘的叛乱者那里了解到他的现实的真实本质以及他在与控制器的战争中所扮演的角色。”告诉我们有关电影的更多信息, 而不是《黑客帝国》。
另外, 你也可以采用以下方法之一来丰富你的分析:
- 更好的统计分析:使用其他指标来处理极值/离群值。
- 文本挖掘:将相似的单词和主题分组在一起(“ 快乐” , “ 幸福” , “ 快乐” 等)
- 粒度分析:在不同的年份/十年或某些生产工作室运行相同的功能。
- 票房数据
- 古腾堡(Gutenberg)下载的书籍排在前1000名, 邀请你提出以下问题:
- 书名中最常用的词是?
- 哪些词与图书下载最相关?
- iPhone搜索关键字(通过SERP获得)
- 人们会与” iphone” 一起搜索什么?
- 什么是最加权的频率?
你经历了创建一个特殊功能的过程, 可以轻松运行该功能来分析带有数字的任何相似文本数据集, 并知道这如何改善你对这种数据集的理解。
通过分析你的推文的性能, 网站的URL, Facebook帖子或其他可能遇到的类似数据集来进行尝试。
仅用代码克隆存储库并自己尝试可能会更容易。
word_frequency函数是advertools软件包的一部分, 你可以下载该软件包并尝试在工作/研究中使用。
检查出来, 让我知道! @eliasdabbas
推荐阅读
- 在Mac OS X上安装Anaconda
- 如何安装和使用Homebrew
- Windows 8系统更改区域信息之后导致应用无法打开怎样办【图文】
- Win8系统电脑下IE浏览器提示“无法找到该页面”怎样办
- win8系统运用管理员权限无法删除局部文件怎样办
- win8.1系统如何打开传统的开始菜单【图文】
- win8.1怎样更改密码?win8.1系统更改密码的办法【图】
- win8系统电脑输入法设置遇故障的处理办法
- win8系统怎样将窗口边框设置得更小一些【图文】