【问题标题】:Python translate a column with multiple languages to englishPython将具有多种语言的列翻译成英文
【发布时间】:2020-01-13 10:13:58
【问题描述】:

我有一个数据集,其中有多个具有多种语言的 cmets 列,我想将这些列翻译成英文并创建包含所有英文翻译的新列。

Accountability_COMMENT 是每行有多个不同语言的 cmets 的列。我想创建一个新列并将所有此类 cmets 翻译成英语。

我已经尝试了以下代码:

 from googletrans import Translator
 from textblob import TextBlob
 translator = Translator()
 data_merge['Accountability_COMMENT'] = data_merge['Accountability_COMMENT'].apply(lambda x: 
 TextBlob(x).translate(to='en'))

我得到的错误是:

TypeError:传递给__init__(text)text 参数必须是字符串,而不是类'float'

我的专栏有正确的对象格式

【问题讨论】:

  • 您已经尝试过该代码...并且?你有什么错误吗?输出看起来不像你想要的?
  • 另外,我不清楚您的输入 DataFrame 是什么样的,以及输出应该是什么样的。是否有 一个 列带有 cmets,还是有 许多 列带有 cmets?
  • 有一列包含大约 3000 个不同语言的 cmets。我需要将它们全部翻译成英文并将它们存储到一个新列中。
  • 我在一个测试 DataFrame 上测试了你的代码,只有三行不同语言的字符串,它工作正常。错误消息实际上说的是什么? TypeError: The text argument passed to __init__(text) must be a string, not 什么? not 后面是什么?
  • TypeError: 传递给__init__(text)text 参数必须是字符串,而不是

标签: python-3.x pandas translation google-translate


【解决方案1】:

您很可能有一些仅包含 float(即十进制数)的 cmets,即使根据 pandas 它们是 type: object,它们仍被 TextBlob 解释为 float。这会导致错误:

TypeError: The text argument passed to __init__(text) must be a string, not <class 'float'>

一种解决方案是确保TextBlob(x) 的输入x 是一个字符串。您可以通过修改 apply 行来做到这一点:

 data_merge['Accountability_COMMENT'] = data_merge['Accountability_COMMENT'].apply(lambda x: TextBlob(str(x)).translate(to='en'))

不幸的是,这可能还会引发如下错误:

raise NotTranslated('Translation API returned the input string unchanged.')
textblob.exceptions.NotTranslated: Translation API returned the input string unchanged.

这是因为在翻译一个数字时,译文和原文会一模一样,显然TextBlob不喜欢这样。

要避免这种情况,您可以做的是捕获该异常 NotTranslated 并返回未翻译的 TextBlob,如下所示:

from textblob import TextBlob
from textblob.exceptions import NotTranslated    

def translate_comment(x):
    try:
        # Try to translate the string version of the comment
        return TextBlob(str(x)).translate(to='en')
    except NotTranslated:
        # If the output is the same as the input just return the TextBlob version of the input
        return TextBlob(str(x))

data_merge['Accountability_COMMENT'] = data_merge['Accountability_COMMENT'].apply(translate_comment)

编辑: 如果您收到 HTTP 错误 Too Many Requests,可能是因为您被 Google Translate API 踢出。除了使用apply,您可以使用for 循环和一些循环之间的睡眠来使您的翻译“超慢”。在这种情况下,您应该导入另一个包 (time) 并替换最后一行:

from time import sleep
from textblob import TextBlob
from textblob.exceptions import NotTranslated    

def translate_comment(x):
    try:
        # Try to translate the string version of the comment
        return TextBlob(str(x)).translate(to='en')
    except NotTranslated:
        # If the output is the same as the input just return the TextBlob version of the input
        return TextBlob(str(x))

for i in range(len(data_merge['Accountability_COMMENT'])):
    # Translate one comment at a time
    data_merge['Accountability_COMMENT'].iloc[i] = translate_comment(data_merge['Accountability_COMMENT'].iloc[i])

    # Sleep for a quarter of second
    sleep(0.25)

然后,您可以对sleep 函数尝试不同的值。当然睡眠时间越长翻译越慢!注: sleep 参数以秒为单位。

【讨论】:

  • 这看起来真的很合适,对我来说很有意义。但我仍然有一个错误:HTTPError: HTTP Error 429: Too Many Requests。我不知道如何解决这个问题。
  • 我编辑了我的答案,希望对您有所帮助。如果您觉得我的回答有用,请点赞,如果解决了您的问题,请采纳! :)
  • 我仍然遇到同样的错误。我在不同的单元格中尝试了除此之外的东西,然后在不同的单元格中导入了时间。我仍然收到同样的错误..
  • 一旦我们克服了这个错误,在同一个数据框中,我还有大约 10 列需要做同样的事情。
  • 如果您希望所有代码都能正常工作,您有两个单独的问题需要同时解决。一个是关于某些单元格中的错误类型,一个是关于 textblob 向 Google 发出的(在后台)太多请求。请查看我更新的代码,您必须使用 both 带有异常的函数和带有 sleep 函数的 for 循环。我认为我不能做更多的事情来帮助你,这应该已经为你指明了正确的轨道。
猜你喜欢
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 2014-11-04
  • 2011-01-04
  • 2020-11-17
相关资源
最近更新 更多