用R串接Microsoft Translator免費自動翻譯推特內容

王宏恩@UNLV
8 min readDec 30, 2021

最近因為研究需求,需要下載各種語言的推特,然後把推特內容自動翻譯成英文,尤其是泰文、德文、跟日文。查了一下目前各地提供的語法,好像都沒有更新到最新的MS規定的封包(Dec 29 2021),因此自己試了一下成功串連。為了避免自已忘記,所以寫這篇medium做個紀錄。

第一步,是用rtweet把想要抓的推特內容抓下來

這一步目前網路上已經有很多可參考。但總之註冊拿到twitter API然後使用rtweet抓下來全部要的(10天之內的推特)後,dataframe裡面有一個變數是lang,這個變數是自動偵測該筆推特主要使用的語言。在我抓的推特裡面,推特已經成功的辨認了99%,只有不到1%是und(無法辨識),因此之後可以用這個變數告訴MS Translator要如何翻譯。

第二步,是開一個MS Translator app

這包括幾個小步驟,主要可以參考MS自己的說明https://docs.microsoft.com/en-us/azure/cognitive-services/translator/quickstart-translator?tabs=csharp

第一是去註冊Microsoft Azure的帳號

在註冊的時候,可能需要填信用卡資料,但不會收費。現在用微軟跟google雲端都好像要先提供這個資訊了。

第二步,在註冊完之後,畫面左上角有一個加號,create a resource,然後搜尋Translator,就能找到這個app來create

創的過程中會要你自己幫app取個名之類的,都可以隨便取,但是region要仔細選,因為這個變數之後會用到,請把region選你所在的region。舉例來說,我人目前在west US,所以就選west US 2。然後第一個開的app可以免費,所以price tier 可以選free。目前選擇free的規定是每個月可以免費翻譯200萬個character。考量到twitter每個最大是140個character,大概可以翻譯一萬多個吧

第三步,從你的Translator app取得key資訊

KEY1 or 2隨便選一個用就好

第四步,改寫translateR語法

R裡面本來就有translateR這個library 可以用。但是因為MS 對於header的要求,所以目前能夠自動下載安裝的translateR直接使用的話只會得到一堆error message,所以需要自己改寫語法。

translateR語法的作者很好心的開源給大家用

假如要成功串接R跟MS Translator,至少需要

library(translateR)
library(parallel)
library(httr)
以及上面網頁中的

languageCodes

以及 microsoftTranslate

其中,microsoftTranslate 裡面的內容需要改寫。原本header裏面的變數只有

add_headers(
"Ocp-Apim-Subscription-Key" = api.key,
"Content-Type" = "application/json; charset=UTF-8"
)

參考MS Translator說明文件裡面對於header的要求,header已經需要改成

所以,完整的function應該要改寫如下:

microsoftTranslate <-
function(x, api.key, source.lang = NULL, target.lang){
checkText(x)
microsoft_langs <- languageCodes()$Microsoft
if(!is.null(source.lang)) {
source.lang <- match.arg(source.lang, microsoft_langs)
}
target.lang <- match.arg(target.lang, microsoft_langs)

base_url <- base_url <- “https://api.cognitive.microsofttranslator.com/translate"
body <- data.frame(Text = x)
query = list(
“api-version” = “3.0”,
“to” = target.lang,
“from” = source.lang
)
response <- POST(
base_url,
body = body,
add_headers(
“Ocp-Apim-Subscription-Key” = api.key,
“Ocp-Apim-Subscription-Region” = “westus2”, #你之前開app選的區域,我的是westus2
“Content-Type” = “application/json”
),
query = query,
encode = “json”
)
httr::stop_for_status(response)
contents <- httr::content(response)
translations <- vapply(
contents,
function(x) x[[“translations”]][[1]][[“text”]],
character(1L)
)
return(translations)
contents
}

第五步,翻譯

把你要翻譯的推特內容,以及你開完app後拿到的key,直接使用microsoftTranslate 這個function,例如我的範例

microsoftTranslate(x=你要翻的東西,
api.key = “你拿到的key”,
source.lang = “th”, (原本的語文,我這是泰文,兩碼代號,參考languageCodes function)
target.lang = “en” (你要翻成的語文,我這是英文,兩碼代號))

你要翻的東西=” ด่วน รูปปั้นรำลึกเหยื่อการสังหารหมู่ที่จัตุรัสเทียนอันเหมินที่เรียกว่า The Pillar of Shame ซึ่งตั้งอยู่ใน University of Hong Kong มาเกือบ 25 ปีแล้วในตอนนี้เจ้าหน้าที่ของมหาวิทยาลัยได้นำแผงกั้นมาวางไว้รอบๆและมีเสียงของการรื้อถอนรูปปั้นเกิดขึ้นด้านหลังของแผงกั้น #MilkTeaAlliance https://t.co/OIa2Xbm5v

翻完之後的結果=” Urgently, a statue commemorating the victims of the Tiananmen Square massacre called The Pillar of Shame, which has been located in the University of Hong Kong for almost 25 years, has now put a barrier around it and the sound of the statue’s demolition has taken place behind the #MilkTeaAlliance https://t.co/OIa2Xbm5vs barrier. ”

然後可以再使用迴圈以及一開始的lang變數來跑完整份資料檔,一次把不同的推特內容全部翻譯成英文。大功告成。

不要不小心翻譯太多,不然可能就要使用神奇小卡了。

後記:twitter在中文分類上都是zh,但是微軟翻譯有分成Zh-hans跟Zh-hant,所以可能要抉擇一下

然後微軟有規定API request的上限,所以可以用迴圈跑到卡住後喝杯茶,幾分鐘後再從斷掉的地方繼續。

--

--

王宏恩@UNLV

政治。選舉。資料。杜克大學政治學博士。內華達大學拉斯維加斯分校政治系助理教授。