假设我有一个名为df.Text
的列,其中包含文本(超过1个句子(,并且我想使用多语言Detector
来检测语言并将值存储在新列df['Text-Lang']
中,我如何确保我也捕获其他详细信息,如code
和confidence
testEng ="This is English"
lang = Detector(testEng)
print(lang.language)
返回
名称:英文代码:置信度:94.0读取字节数:1920
但
df['Text-Lang','Text-LangConfidence']= df.Text.apply(Detector)
以结束
AttributeError:"float"对象没有属性"encode"和Detector不能可靠地检测语言。
我是错误地应用了检测器功能,还是错误地存储了输出,还是其他什么?
首先,如果语言检测只需要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
列。
你可以试试这个:
testEng ="This is English"
lang = Detector(testEng)
df['Text-Lang']=lang.language.code
df['Text-LangConfidence']=leng.language.confidence