处理乌尔都语文本时触发TypeError: expected string or bytes-like object报错求解
问题解决方法
报错原因
你遇到的TypeError: expected string or bytes-like object错误不是乌尔都语本身导致的,核心诱因有两点:
- Excel的Text列存在空值(NaN)、数字等非字符串类型的单元格内容,直接传入
nltk.word_tokenize触发类型校验报错 - NLTK默认的
word_tokenize是为拉丁字母语言设计的,既不能正确拆分乌尔都语词汇,也对阿拉伯系字母的兼容性不好
适配后的完整代码
方案1:仅解决报错,保留原有代码逻辑(分词结果不符合乌尔都语规则)
import collections import pandas as pd import nltk counter = collections.Counter() maxlen = 0 c=0 df=pd.read_excel(INPUT_FILE) df.columns=['Text','label'] # 新增预处理:空值替换为空字符串,强制转字符串类型 df['Text'] = df['Text'].fillna('').astype(str) for index, row in df.iterrows(): # 去掉了无用的lower(),乌尔都语无大小写区分 words = [x for x in nltk.word_tokenize(row['Text'])] if len(words) > maxlen: maxlen = len(words) c=c+1 for word in words: counter[word] += 1 print (len(counter)) print (maxlen)
方案2:完整适配乌尔都语,获得正确分词结果
先安装乌尔都语处理依赖:pip install urduhack
修改后代码:
import collections import pandas as pd import urduhack # 下载乌尔都语处理模型(首次运行执行一次即可) urduhack.download() from urduhack.tokenization import word_tokenizer counter = collections.Counter() maxlen = 0 c=0 df=pd.read_excel(INPUT_FILE) df.columns=['Text','label'] df['Text'] = df['Text'].fillna('').astype(str) for index, row in df.iterrows(): # 使用乌尔都语专用分词器 words = word_tokenizer(row['Text']) if len(words) > maxlen: maxlen = len(words) c=c+1 for word in words: counter[word] += 1 print (len(counter)) print (maxlen)
修改说明
- 新增Text列预处理逻辑,从根源避免非字符串值传入分词函数的报错
- 移除了无意义的
lower()调用,乌尔都语采用阿拉伯字母书写,不存在大小写区分 - 方案2替换了默认分词器为乌尔都语专用分词工具,分词结果符合乌尔都语的语法规则
内容的提问来源于stack exchange,提问作者Ali Shan
相关产品推荐
相关产品推荐

