6

假设我有一个名为的列df.Text,其中包含文本(超过 1 个句子)并且我想使用 polyglotDetector来检测语言并将值存储在新列中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)

以。。结束

AttributeError: 'float' 对象没有属性 'encode' 并且 Detector 无法可靠地检测语言。

我是错误地应用了检测器功能还是错误地存储了输出或其他原因?

4

2 回答 2

9

首先,如果你只需要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列。

于 2018-08-05T15:28:02.383 回答
0

你可以试试这个:

testEng ="This is English"
lang = Detector(testEng)
df['Text-Lang']=lang.language.code
df['Text-LangConfidence']=leng.language.confidence
于 2019-10-31T09:30:24.530 回答