1. 程式人生 > >萬字長文教你拿起Python,防禦特朗普的Twitter殺傷力!

萬字長文教你拿起Python,防禦特朗普的Twitter殺傷力!

可視化 過度 第一個 新頁面 val ase fin 響應 cap

新智元推薦

來源:量化投資與機器學習

作者:Ali Alavi、Yumi、Sara Robinson

編輯整理:元子

【新智元導讀】通過對特朗普推文進行NLP分析、打標簽、可視化,讀者不僅僅能夠對特朗普發布的推文有一個直觀的了解,更重要的是整個過程其實是一個非常好的NLP項目實踐,可以從中學會如何使用Python。

巴菲特剛開完股東大會,特朗普又在Twitter來了一出。讓股票市場跌宕起伏。

技術分享圖片

這也誕生了一個新詞:一推就倒。形容一條Twitter就嚇得屁滾尿流,崩潰倒下的東西,多用於股市。

接下來我們就應用技術手段,基於Python,建立一個工具,可以閱讀和分析川普的Twitter。然後判斷每條特定的Twitter是否具有川普本人的性格。

同時我們還結合了其他的方法,包括Deep Learning、Machine Learning、NLP、LSTM等基於Python、Keras等,對川普的Twitter做個全面分析!讓大家以後面對川普冷不丁的Twitter有所準備!

技術分享圖片

為特朗普的推文加上好壞標簽

將每條Twitter分解成單詞

技術分享圖片

如你所見,我們手動復制了Trump的一條Twitter,將其分配給一個變量,並使用split()方法將其分解為單詞。split()返回一個列表,我們稱之為tweet_words。我們可以使用len函數計算列表中的項數。在第4行和第5行中,我們打印前面步驟的結果。註意第5行中的str函數。為什麽在那裏?

最後,在第9行中,我們循環遍歷tweet_words:也就是說,我們逐個遍歷tweet_words項,將其存儲在w中,然後在第10行和第11行處理w。所以,第10行和第11行被執行了很多次,每一次都有不同的w值。你應該能夠說出第10行和第11行是做什麽的。

將此代碼保存為first.py。如果你使用Mac或Linux,請轉到終端,在保存文件的文件夾中,輸入python3.6 first.py,然後按Enter鍵。在Windows上,您需要在命令提示符下鍵入py first.py。

判斷一條Twitter的屬性,壞 or 好?

這裏的想法是創建兩個由好詞和壞詞組成的列表,並根據它們從這些列表中包含的詞數增加或減少推文的值。

技術分享圖片

因此,在第16行和第17行中,我們初始化了兩個值,每個值表示一條Twitter中好詞和壞詞的數量。在第19行和第20行中,我們創建了好單詞和壞單詞的列表。當然,這些都是非常主觀的列表,所以請根據你自己的個人意見隨意更改這些列表。

在第21行,我們逐個檢查了Twitter中的每個單詞。在第22行打印之後,我們檢查這個單詞是否存在於good_words或bad_words中,並分別增加number_of_good_words或number_of_bad_words。如你所見,要檢查列表中是否存在項,可以使用in關鍵字。

另外,請註意if的語法:你需要在條件後面輸入colon (:) 。而且,在if中應該執行的所有代碼都應該縮進。

判斷“好”和“壞”的程度

到目前為止,我們的假設是,詞語不是好就是壞。但在現實世界中,詞語的權重各不相同:awesome比alright好,bad比terrible好。到目前為止,我們的代碼還沒有考慮到這一點。

為了解決這個問題,我們使用名為字典的Python數據結構。字典是一個條目列表,每個條目都有一個鍵和一個值。我們將這些項稱為鍵值對。因此,字典是鍵值對的列表(有時稱為鍵值存儲)。

我們可以通過在花括號中放入key:values列表來定義字典。請看下面的代碼:

技術分享圖片

正如你所看到的,我們只使用了一個字典。給不好的詞一個負的權重,好的詞一個正的權重。確保值在-1.0和+1.0之間。稍後,我們使用word_weights字典檢查其中是否存在單詞,並計算分配給單詞的值。這與我們在前面的代碼中所做的非常相似。

這段代碼的另一個改進是它的結構更好:我們嘗試將代碼的不同邏輯部分分離到不同的函數中。函數是用def關鍵字定義的,後跟著一個函數名,後面跟著圓括號中的零個或多個參數。

消除冗余條目

我們的代碼中仍然存在一些明顯的缺陷。例如,我們可以假設一個名詞,無論是單數還是復數,都具有相同的值。例如,單詞 tax 和 taxes 被解釋為兩個不同的單詞,這意味著我們的字典中需要有兩個不同的條目,每個條目對應一個。為了避免這種冗余,我們可以嘗試對Twitter中的單詞進行詞幹處理,這意味著嘗試將每個單詞轉換為其詞根。例如,tax 和 taxes 都將被納入tax。

這是一個非常復雜的任務:自然語言非常復雜,構建一個stemmer需要花費大量的時間和精力。此外,這些任務以前也做過。那麽,為什麽要重新發明輪子,尤其是如此復雜的一個?相反,我們將使用其他程序員編寫的代碼,並將其打包到名為NLTK的Python模塊中。

安裝NLTK

我們可以在命令行中運行pip install nltk來安裝NLTK。但是,這將嘗試在我們的系統上全局安裝模塊。這並不好:我們的系統上可能有使用相同模塊的程序,安裝相同模塊的新版本可能會帶來問題。此外,如果我們可以將所有模塊安裝在代碼所在的同一目錄中,則只需復制該目錄並在不同的機器上運行。

因此,我們從創建一個虛擬環境開始。

首先,確保與代碼所在的文件夾相同。然後在終端中輸入以下內容:

技術分享圖片

如果你在Windows上,在命令提示符中輸入以下內容:

技術分享圖片

這將在當前文件夾中創建Python的本地副本及其所需的所有工具。

現在,需要告訴你的系統使用Python的這個本地副本。在Mac或Linux上,使用以下命令:

技術分享圖片

Windows:

技術分享圖片

如果所有操作都正確,應該會看到命令提示符發生了更改。最有可能的是,您應該在命令行的開頭看到(env)。

我們使用pip命令安裝Python包。但是首先,讓我們運行以下命令來確保我們使用的是最新版本的pip:

技術分享圖片

當你使用Mac時,要確保運行以下命令:

技術分享圖片

現在,你可以使用pip命令安全地安裝NLTK:

技術分享圖片

最後,運行Python解釋器,運行Python(如果是在Windows上,則運行py),並在解釋器中輸入以下命令:

技術分享圖片

應該會彈出一個窗口。 選擇包含popular標識符的項目,然後單擊download。這將下載popula 68205.cn rNLTK模塊使用的所有必要數據。

技術分享圖片

現在我們已經安裝了NLTK,讓我們在代碼中使用它。

使用NLTK

為了使用Python中的模塊,我們需要首先導入它。在第11行,我們告訴Python要使用函數word_tokeniz 68207.cn e,在第12行中,我們說要使用nltk.stem.porter模塊中的所有內容。

在第14行中,我們使用PorterStemmer創建了一個stemmer對象,在第18行中,我們使用word_tokenize而不是split來以更智能的方式將Twitter分解為單詞。

最後,在第31行,我們使用了stemmer.stem查找單詞的詞幹,並將其存儲在stemmed_word 中。其余的代碼與前面的代碼非常相似。

技術分享圖片

你應該記得,我們在第20到24行中使用了一個詞對詞的字典。在我們的程序中有這麽長的單詞列表是一種不好的做法。想想看,當我們決定更改單詞到值的字典時(比如添加一個單詞或更改一個單詞的權重),我們需要打開並編輯代碼。這是有問題的,因為:

我們可能會錯誤地更改代碼的其他部分添加的單詞越多,代碼的可讀性就越差不同的人使用相同的代碼可能想要定義不同的字典(例如,不同的語言、不同的權重……),如果不更改代碼,他們就無法做到這一點

由於這些(以及更多)原因,我們需要將數據從代碼中分離出來。換句話說,我們需要將字典保存在單獨的文件中,然後將其加載到程序中。

文件有不同的格式,這說明數據是如何存儲在文件中的。例如,JPEG、GIF、PNG和BMP都是不同的圖像格式,用於說明如何在文件中存儲圖像。XLS和CSV也是在文件中存儲表格數據的兩種格式。

在本例中,我們希望存儲鍵值數據結構。JSON數據格式是存儲這類數據最常用的數據格式。下面是一個JSON文件的例子:

技術分享圖片

正如你所看到的,它看起來就像一個Python字典。因此,繼續創建一個新文件,並將其命名為“word_weight .68206.cn json”。

技術分享圖片

現在,我們需要做的就是告訴Python將這個文件加載到word_weights中。

打開文件

為了打開文件,我們使用open函數。它打開一個文件並返回一個file對象,該對象允許我們對文件執行操作。每當我們打開一個文件,我們需要關閉它。這確保文件對象上的所有操作都被刷新到文件。

在這裏,我們希望加載文件內容並將其分配給一個變量。我們知道文件的內容是JSON格式。所以我們需要做的就是導入Python的json模塊,並將它的load函數應用到我們的file對象上:

技術分享圖片

但明確使用close可能會有問題:在大型程序中,很容易忘記關閉文件,而並且可能會發生關閉在一個塊內部,而這個塊一直沒有執行(例如if)。

為了避免這些問題,我們可以使用with關鍵字。負責關閉文件。

技術分享圖片

因此,當代碼退出with塊時,使用with打開的文件將自動關閉。確保在處理文件時始終使用with編碼模式。很容易忘記關閉文件,這可能會帶來許多問題。

技術分享圖片

我們可以進一步改進這段代碼,將加載JSON文件和分析Twitter轉換為兩個函數。

技術分享圖片

現在,我們的程序所做的就是分配一個Twitter字符串,加載一個單詞權重字典,並使用加載的字典分析該Twitter字符串。

從Twitter讀取推文

為了從Twitter讀取數據,我們需要訪問它的API(應用程序編程接口)。API是應用程序的接口,開發人員可以使用它訪問應用程序的功能和數據。

通常,Twitter、Facebook等公司允許開發人員通過API訪問用戶數據。但是, 你可能知道,用戶數據對這些公司非常有價值。此外,當涉及到用戶數據時,許多安全和隱私問題就會出現。因此,這些公司希望跟蹤、驗證和限制開發人員及其應用程序對其API的訪問。

因此,如果您想訪問Twitter數據,首先需要登錄Twitter(如果您沒有Twitter帳戶,則需要登錄),然後訪問https://apps.twitter.com/。單擊Create New App按鈕,填寫表單,然後單擊Create your Twitter Application按鈕。

在新頁面中,選擇API Keys選項卡,並單擊Create my access token按鈕。將生成一對新的訪問令牌,即Access令牌密鑰。。將這些值與API密鑰和API密鑰一起復制。

現在,啟動終端或命令提示符,轉到工作目錄,然後激活虛擬環境(提醒:如果你在Mac / Linux上運行.env / bin / activate,如果你在Windows上運行env / Scripts / activate )。現在,使用pip安裝python-twitter包:

技術分享圖片

這將安裝一個popular包,用於在Python中使用Twitter API。

https://github.com/bear/python-twitter

技術分享圖片

現在,讓我們快速測試一下我們的設置。

通過輸入Python來運行python解釋器(如果在Windows上,則輸入py)。輸入以下內容,並使用上一步復制的值替換你的:

_consumer_key、YOUR_CONSUMER_SECRET、YOUR_ACCESS_TOKEN和YOUR_ACCESS_TOKEN_SECRET:

技術分享圖片

我們還可以使用GetUserTimeline方法Twitter API獲取用戶的tweet。例如,要想獲取川普的最後一條推文,只需使用以下內容:

技術分享圖片

這將為我們提供一個包含一個項目的列表,其中包含關於川普最後一條推文的信息。我們可以得到關於Twitter的不同信息。例如:last_tweet.full_text將提供他最後一條推文的全文。

利用我們獲得的關於Twitter API的知識,我們現在可以更改代碼來從Twitter加載推文字符串。

技術分享圖片

當然,如前所述,在代碼中存儲數據是一種不好的做法。當這些數據涉及某種秘密時,情況就更糟了。但是我們知道怎麽正確地做。我們從.cred.json加載Twitter憑據。只需創建一個新的JSON文件,將密鑰和秘密存儲在字典中,並將其保存為.cred.json:

技術分享圖片

許多推文包含非字母字符。例如,一條推文可能包含&、>或<。這樣的字符被Twitter轉義。這意味著Twitter將這些字符轉換為html安全字符。

例如,像 Me & my best friend <3 這樣的推文被轉換為Me &amp; my best friend &lt;3。為了將其轉換回原來的表示形式,我們需要使用html模塊中的unescape函數取消對推文的轉義。

試著運行這段代碼。你應該能夠判斷特朗普最新的推文是否是他的風格。

先聽首歌,讓我們開始下面另一個分析。

使用最新約3000條推文訓練模型

先看看下面三篇文章:

https://machinelearningmastery.com/develop-word-based-neural-language-models-python-keras/https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.htmlhttps://machinelearningmastery.com/text-generation-lstm-recurrent-neural-networks-python-keras/

我們使用川普的最新約3000條推文來訓練模型。

2.7.13 |Anaconda 4.3.1 (64-bit)

[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]

Using TensorFlow backend.

keras 2.0.6

tensorflow 1.2.1

numpy 1.11.3

技術分享圖片

從一個例子說起:單字輸入單字輸出模型

第一個訓練數據是一個由11個單詞和三個感嘆號組成的句子。我們將使用這句話創建一個簡單的LSTM模型。模型應該能夠過度擬合並復制這個句子!

首先創建Tokenizer對象。Tokenizer在word和idnex之間創建映射。映射記錄在字典中:key = words, value = index。字典可以通過“tokenizer.word_index”訪問字典。

word_index刪除特殊字符,例如…或!所有的單詞都轉換成小寫字母。索引從‘1‘而不是0開始!

技術分享圖片 技術分享圖片

分詞器。texts_to_sequences將字符串轉換為索引列表。索引來自tokenizer.word_index。你可以看到索引是按照句子中出現的單詞的順序排列的。

技術分享圖片

將詞匯表大小定義為唯一單詞的數量+ 1。這個vocab_size用於定義要預測的類的數量。加1必須包含“0”類。word_index.values()沒有使用0定義單詞。因此,因此我們可以將此類0用於占位符類(即填充類)。

技術分享圖片

準備好訓練數據X, y,當我們創建一個單詞輸入一個單詞輸出模型時:

X.shape =(句子中的N個單詞 - 1,1)y.shape =(句子中的N個單詞 - 1,1)

技術分享圖片

註意,num_class被設置為vocab_size,即N個唯一單詞+ 1。y的打印表明,在第0列和第1列中沒有包含索引的行。 這是因為:

在我們原來的句子“data”中沒有屬於class 0的單詞。索引為1的單詞出現在句首,因此它不會出現在目標y中。

技術分享圖片 技術分享圖片

定義模型和訓練數據

模型很簡單;一個嵌入層,接著是一個LSTM層,然後是前饋神經網絡層。

Word embeddings是一種自然語言處理技術,旨在將每個詞的語義映射到一個幾何空間。

參數

嵌入層:對於每個單詞,創建一個長度為10的連續向量來表示它自己130個參數= "vocab_size" x 10LSTM層:10個隱藏單元,每個單元有4個門840個參數= 10個隱藏LSTM untis 4(3個門和1個狀態)((10個輸入+ 1個偏置)+ 10個隱藏的LSTM untis)前饋層:143個參數=(10個隱藏的LSTM單位+ 1個偏差)x 13個類

技術分享圖片 技術分享圖片

訓練結果表明,該模型能較好地預測訓練語句的準確性。

技術分享圖片

現在檢查一下我們的模型能否正確生成訓練過的句子。生成一個以“I”開頭的13個單詞的句子。它成功地生成了原句。原來的句子有12個單詞,所以在“yes”之後預測的第13個單詞可以是任何單詞。在這種情況下,yes之後的單詞被預測為to。但是如果你用不同的初始值訓練,這個值就會改變。

技術分享圖片

看一下前面那個單詞的概率分布。

技術分享圖片

除“yes”外,所有單詞的附加概率分布都有較大的峰值,其他地方的概率分布比較平緩。峰位於下一個單詞。例如,單詞“deep”之後的概率分布峰值出現在“learning”。然而,“yes”之後單詞的概率分布是相當平坦的。

技術分享圖片 技術分享圖片

訓練一個NLP模型基於川普Twitter

在前面的例子中,我們只有一個句子來訓練模型。我現在將使用大約3000條來自川普的推文來訓練一個深度學習模型。

技術分享圖片

讓我們從dataframe中隨機選擇的10條推文。它顯示推文包含許多僅出現一次的術語或對預測不感興趣的術語。 所以我們先清理文本。

技術分享圖片 技術分享圖片

推文清潔技巧:

刪除引號理想情況下,我想把“and“當作一個單詞來對待。然而,我們發現Tokenizer並不總是將這些單詞視為單個單詞。刪除URL. #和@。其中大多數只出現一次。因此,包含URL大大降低了模型在valdiation集上的性能。

技術分享圖片

我們發現這些清理對於創建有意義的模型非常重要。不進行清洗,模型的訓練精度提高不超過0.05。我們試圖通過大幅增加模型的復雜性來解決這個問題,但是並不是很成功。似乎刪除不經常出現的單詞是非常有用的方法。

這是有道理的,因為刪除這些不常出現的單詞會使Tokenizer.word_index的大小減少20%以上(1 - 5689/7300)。

現在,我們創建一個單詞和索引之間的映射。Tokenizer很好地過濾特殊字符。

技術分享圖片

使用Tokenizer的單詞索引字典,只用單詞indecies表示每個句子。 讓我們看看句子是如何用單詞indecies表示的。

技術分享圖片 技術分享圖片

重構句子數據目前每一行都是一個句子我們將改變它,以便每行對應一個單詞進行預測,如果有兩個句子““Make America Great Again”和“Thanks United States”,這將創建5行:"- - Make America", "- Make America Great", "Make America Great Again", "- - Thanks United", "- Thanks United States"。將句子分為訓練和測試數據集。確保來自同一原始語句的任何子句都能進入相同的數據集。

技術分享圖片

Total Sequences: 50854

序列長度因數據而異。我們加“0”使每個句子相同。

將目標變量轉換為一個獨熱編碼向量。

技術分享圖片

訓練模型

通過增加密集嵌入向量的維數,增加LSTM中隱藏單元的數量,使模型比之前的例子更加復雜。

訓練精度不斷提高,但驗證精度沒有明顯提高。考慮到訓練數據量小,這是合理的;模型過度擬合。

技術分享圖片 技術分享圖片

驗證準確性和訓練準確性

技術分享圖片 技術分享圖片 技術分享圖片

利用主成分分析法對詞向量的維數進行降維處理,並在二維空間中對其進行可視化處理。

技術分享圖片

Observations

kim, saudi, radical, differentlynorth, southestimates, statisticallyknives, dialogsindependent, unitedthank, honor

技術分享圖片

輸入一個詞,看後面AI會生成什麽。

當“Make America”作為前兩個詞出現時,人工智能幾乎總是預測“再次偉大”作為下一個詞當提供“North”時,下一個單詞幾乎總是“Korea”,後面通常是一些否定句以“Omaga is”開頭的句子往往具有負面含義

技術分享圖片 技術分享圖片

再來聽首歌

比較特朗普和希拉裏的推文

我們還將特朗普和希拉裏的推文與自然語言處理進行比較,分析了9月9日至10日有關兩位候選人的30萬條推文的數據。

推文中以希拉裏或特朗普為主題的最常用形容詞:

技術分享圖片

推文中以希拉裏或特朗普為主題的熱門動詞:

技術分享圖片

最常用的表情:

技術分享圖片

使用Twitter流媒體API:

https://developer.twitter.com/en/docs

技術分享圖片

雲自然語言API,解析推文並獲取語法數據:

https://cloud.google.com/natural-language/

技術分享圖片

BigQuery,分析推文語法數據:

https://cloud.google.com/bigquery/

技術分享圖片

Tableau和一些JavaScript技巧,數據可視化:

https://www.tableau.com/solutions/google

技術分享圖片

使用帶有Node.js的Twitter流媒體API對提到希拉裏或特朗普的推文進行了流媒體處理。

技術分享圖片

一旦我們收到一條推文,我們就把它發送到自然語言API進行語法分析。

Cloud Natural Language API:解析推文

新的Cloud Natural Language API有三種方法——語法註釋、實體和情感分析。這裏我們將重點介紹語法註釋,語法註釋響應提供關於句子結構和每個單詞的詞性的詳細信息。推文常常缺少標點符號,語法上也不總是正確的,但是NL API仍然能夠解析它們並提取語法數據。舉個例子,這是發布的30萬條tweet中的一條

https://www.newsweek.com/trump-lone-holdout-pence-releases-tax-returns-497244)

Donald Trump is the lone holdout as VP nominee Mike Pence releases his tax returns —Newsweek

這裏是從該API發回的語法數據可視化:

技術分享圖片

API的JSON響應提供了上面依賴關系解析樹中顯示的所有數據。它為句子中的每個標記返回一個對象(標記是一個單詞或標點符號)。下面是上面例子中一個令牌的JSON響應示例,在本例中是單詞“release”:

技術分享圖片

讓我們分解一下響應:tag告訴我們“release”是一個動詞。label告訴我們這個單詞在上下文中所扮演的角色。這裏是ADVCL,它代表狀語從句修飾語。headTokenIndex指示指向此標記的弧在依賴關系解析樹中的位置,每個標記作為一個索引。引理是單詞的根形式,如果要計算單詞出現的次數並希望合並重復的單詞,這是非常有用的(請註意,“releases” is “release”)。

下面是我們對NL API的請求:

技術分享圖片

現在我們已經將所有語法數據都作為JSON,有無數種方法可以分析它。我們沒有在tweet出現時進行分析,而是決定將每條tweet插入到一個BigQuery表中,然後找出如何分析它。

BigQuery:分析推文中的語言趨勢

我們創建了一個包含所有tweet的BigQuery表,然後運行一些SQL查詢來查找語言趨勢。下面是BigQuery表的模式:

技術分享圖片

我們使用google-cloud npm包將每條推文插入到表格中,只需要幾行JavaScript代碼:

技術分享圖片

表中的token列是一個巨大的JSON字符串。幸運的是,BigQuery支持用戶定義的函數(UDF),它允許你編寫JavaScript函數來解析表中的數據。

https://cloud.google.com/bigquery/user-defined-functions

技術分享圖片

為了識別形容詞,我們查找NL API返回的所有標記,其中ADJ作為它們的partOfSpeech標記。但我並不想要所有收集到的推文中的形容詞,我們只想要希拉裏或特朗普作為句子主語的推文中的形容詞。NL API使使用NSUBJ((nominal subject)標簽過濾符合此標準的推文變得很容易。

https://medium.com/google-cloud/comparing-tweets-about-trump-hillary-with-natural-language-processing-a0064e949666

技術分享圖片

以上是完整的查詢(UDF內聯)——它計算了所有以希拉裏或特朗普為名義主語的推文中的形容詞。

為了統計表情符號,我們修改了我的UDF,查找所有partOfSpeech標記為X(表示外文字符)的標記,並使用正則表達式提取所有表情符號字符:

https://github.com/mathiasbynens/emoji-regex

技術分享圖片

輸出:

技術分享圖片 技術分享圖片

數據可視化

BigQuery與Tableau、data Studio和Apache Zeppelin等數據可視化工具很棒。將BigQuery表連接到Tableau來創建上面所示的條形圖。Tableau允許你根據正在處理的數據類型創建各種不同的圖表。下面是一個餅狀圖,顯示了我們收集到的推文中的前10個標簽(小寫字母以消除重復):

技術分享圖片

為了創建表情包標簽雲,我們從表情包查詢中下載了JSON:

技術分享圖片

使用這個方便的JavaScript庫生成word雲:

https://github.com/lucaong/jQCloud

接下來開始使用自然語言API:在瀏覽器中試用它,深入文檔,或者查看這些博客文章以獲取更多信息。

https://cloud.google.com/natural-language/#nl_demo_sectionhttps://cloud.google.com/natural-language/docs/https://cloud.google.com/bigquery/quickstart-web-ui

從BigQuery開始:跟隨Web UI快速入門,或者查看Felipe Hoffa的任何中等文章。

文本挖掘特朗普

一個kaggle的例子,寫的也很棒,建議大家去看原文哦!

技術分享圖片

部分內容展示:

川普用詞最多的

技術分享圖片 技術分享圖片 技術分享圖片

川普的 bigrams

技術分享圖片

其他

技術分享圖片 技術分享圖片 技術分享圖片

萬字長文教你拿起Python,防禦特朗普的Twitter殺傷力!