如何将Polyglot Detector函数应用于数据框架?

6
假设我有一列名为 df.Text 的文本(超过1个句子),我想使用 polyglot Detector 来检测语言并将值存储在新列 df['Text-Lang'] 中,如何确保我还捕获其他细节,例如codeconfidence
testEng ="This is English"
lang = Detector(testEng)
print(lang.language)

返回值

名称:英语 代码:en 置信度:94.0 读取字节:1920

但是

df['Text-Lang','Text-LangConfidence']= df.Text.apply(Detector)

以...结尾

属性错误: 'float'对象没有属性'encode',且检测器不能可靠地检测语言。

我是不是使用检测器函数的方式不正确或者存储输出的方式不正确或者其他什么问题?


将您的列数据类型更改为字符串,然后再试一次。 - Inder
这并没有解决问题,我的数据类型已经是对象了。这段代码from polyglot.detect import Detector testEng ="This is English" lang = Detector(testEng) print(lang)将会产生以下输出:Prediction is reliable: True Language 1: name: English code: en confidence: 94.0 read bytes: 1920 Language 2: name: un code: un confidence: 0.0 read bytes: 0 Language 3: name: un code: un confidence: 0.0 read bytes: 0 - mobcdi
有没有一种方法将那种类型的输出合并到我的数据框中? - mobcdi
看起来像是一个字典,可以工作,但请将其放在编辑后的问题中以获得适当的外观,同时您究竟想要做什么? - Inder
你能否包含一下 df.Text 的内容样例? - Yuca
2个回答

10
首先,如果您只需要使用 polyglot 进行语言检测,则最好直接使用背后所用的 pycld2。它具有更清晰易懂的API。
话虽如此,您所述的错误来自于您的 Text 列中的某个值,该值为实数。因此,您需要将这样的值转换为字符串。
接下来,您将遇到的下一个问题是文本长度过短。如果文本太短,polyglot 将抛出异常。您需要通过传递 quiet=True 来消除这种异常。
现在,应用 Detector 会返回一个对象。因此,您需要解析它以提取所需信息。要提取语言名称,您需要导入 icu 模块(它是 polyglot 的一个依赖项,因此您已经安装了它):
import icu
df.Text = df.Text.astype(str)
df['poly_obj'] = df.Text.apply(lambda x: Detector(x, quiet=True))
df['Text-lang'] = df['poly_obj'].apply(lambda x: icu.Locale.getDisplayName(x.language.locale))
df['Text-LangConfidence'] = df['poly_obj'].apply( lambda x: x.language.confidence)

在此之后,您可以删除poly_obj列。


2
我该如何处理这个错误:输入包含无效的UTF-8字节191(共248个字节)。我猜想这是因为我有中文/日文字符?我认为Polyglot需要这些字符来确定语言。 - B.Z.B
@B.Z.B:你有没有得到那个问题的答案?我也遇到了同样的问题,但是无法解决。 - Serge de Gosson de Varennes
问题在于有些字符不是有效的符号(可能是控制字符)。您需要对它们进行清理。请将第二行替换为 df.Text = df.Text.astype(str).apply(lambda x: ''.join([ch for ch in x if ch.isprintable()])) - igrinis

0
你可以尝试这个:
testEng ="This is English"
lang = Detector(testEng)
df['Text-Lang']=lang.language.code
df['Text-LangConfidence']=leng.language.confidence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接