PYTHON:使用enchant库识别Pandas数据框架中的非英语单词



我喜欢使用pandas,因为我在处理表时与R中的tidyverse有亲缘关系。我有一个大约20万行的表,需要替换标点符号并提取非英语单词,并将其放在同一表中名为non_english的另一列。我更喜欢使用enchant库,因为我发现它比使用nltk库更准确。我的假表dfdundee列,我正在处理。虚拟数据如下:

df = pandas.DataFrame({'dundee':    ["I love:Marae", "My Whanau is everything",  "I love Matauranga", "Tāmaki Makaurau is Whare", "AOD problem is common"]})

我的想法是先删除标点符号,写一个函数来提取非英语单词,然后将函数应用到数据帧,但我得到了这个错误ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().。下面是我的代码:

import pandas as pd
import enchant
import re
import string
# remove punctuations
df['dundee1'] = df['dundee'].str.replace(r'[^ws]+', ' ')
# change words to lower case
df['dundee1'] = df['dundee1'].str.lower()

# Function to check if a word is english
def check_eng(word):

# use all available english dictionary
en_ls = ['en_NZ', 'en_US', 'en_AU', 'en_GB']
en_bool = False

# check all common dictionaries if word is English 
for en in en_ls:
dic = enchant.Dict(en)
if word != '':
if dic.check(word) == True:
en_bool = True
break
disp_non_en = ""
word = word.str.split(' ')
if len(word) != 0:
if en_bool == False:
disp_non_en = disp_non_en + word + ', '
return disp_non_en
df['non_english'] = check_eng(df['dundee1'])

需要的表是这样的:

dundee                          non_english
0   I love:Marae                    Marae
1   My Whanau is everything         Whanau
2   I lov Matauranga                love, Matauranga
3   Tāmaki Makaurau is Whare        Tāmaki Makaurau, Whare
4   AOD problem is common           AOD

错误与调用有关:

check_eng(df['dundee1'])

其中df['dundee1']Series类型并且你有一个if语句试图引出布尔值:

if word != '':

word是一个Series,所以你应该使用:

df['dundee1'].apply(check_eng)

check_eng中还有一个问题:

代替:

if len(word) != 0:
if en_bool == False:
disp_non_en = disp_non_en + word + ', '

你应该使用:

words = word.str.split(' ')
for word in words:
if en_bool == False:
disp_non_en = disp_non_en + word + ', '

因为你有:

word = word.str.split(' ')

word的类型从str更改为list,并使if无效。

你可能想回顾一下错误的其他方面:Series的真值是二义性的。使用a.empty a.bool (), a.item (), a.any()或所有()

从word.str中删除STR。拆分(' '),它将正常工作。试试这个:单词=单词。分割(' ')

相关内容

  • 没有找到相关文章

最新更新