使用Python MeCab库从表格备注列提取日本公司名的代码问题咨询
原有代码问题梳理
- 导入错误:安装包名
mecab-python3不能直接作为导入名,正确导入名是MeCab;未导入pandas就直接调用pd相关方法,运行直接报错。 - 变量命名违规:使用Python内置关键字
list作为变量名,会覆盖内置列表功能,引发不可预期的错误。 - 作用域逻辑错误:词条拆分、公司名判断的逻辑全部写在遍历所有备注内容的循环外部,最终只会处理最后一行的备注内容,其他行数据完全没被处理。
- 解析逻辑混乱:MeCab输出的拆分规则错误,
組織名是ipadic词典的词性标注,存放在词条属性的对应位置,原有代码错误判断了词性所在的字段位置,永远匹配不到公司名。 - 输出逻辑错误:仅打印匹配到的公司名,没有存入对应列表写入新列;写错列名
column2/columns2,还直接覆盖了原备注列的原始数据,造成数据丢失。 - 无异常处理:未处理空值、无匹配公司名的边界场景,遇到空备注会直接报错。
修正后实现代码
import MeCab import ipadic import pandas as pd # 初始化MeCab解析器 mecab_tagger = MeCab.Tagger(ipadic.MECAB_ARGS) def extract_org_name(column: str, df: pd.DataFrame) -> pd.Series: """ 从指定列提取所有組織名(公司名),多个公司名用顿号分隔,无匹配则返回空字符串 """ org_name_list = [] for content in df[column].astype(str).tolist(): # 处理空值/非文本内容 if not content or content == 'nan': org_name_list.append('') continue # 解析文本 parsed_result = mecab_tagger.parse(content).split('\n') current_orgs = [] for line in parsed_result: # 跳过结束标识和空行 if line == 'EOS' or not line: continue # 拆分表层词和词性属性 parts = line.split('\t') if len(parts) < 2: continue surface_word = parts[0] # 拆分词性字段 pos_info = parts[1].split(',') # 匹配組織名词性 if pos_info[0] == '組織名': current_orgs.append(surface_word) # 拼接当前行的所有公司名 org_name_list.append('、'.join(current_orgs)) # 返回新列 return pd.Series(org_name_list, index=df.index) # 读取文件,替换为你的实际文件路径 df = pd.read_csv("your_file_path.csv") # 处理备注列,替换为你的实际备注列名,提取结果写入新列company_name df['company_name'] = extract_org_name('备注', df) # 保存结果 df.to_csv("result_with_company.csv", index=False, encoding='utf-8-sig')
提取精准度优化建议
- 可在匹配到
組織名后,额外判断词性的后几位字段,排除掉非公司类的组织机构,比如政府机构、社团等,进一步缩小匹配范围 - 针对你所在行业的常见公司名后缀(比如
株式会社、有限会社)可以加规则补充匹配,避免MeCab分词错误漏识别 - 积累业务场景下的常见错误匹配样本,维护排除名单,过滤掉误识别的非公司名内容
内容的提问来源于stack exchange,提问作者generalYaTso
相关产品推荐
相关产品推荐

