拥有基础词与派生词两个DataFrame,如何输入基础词输出对应派生词?
实现基础词到对应派生词的查询方案
核心思路
要实现基础词和派生词的精准对应,关键是建立两者的明确映射关系——要么预先构建包含基础词与派生词的对应表,要么根据构词规则从派生词中提取基础词,再进行匹配。
方法一:预先构建映射表(最可靠)
如果已经明确每个基础词对应的派生词,直接创建包含两列的映射DataFrame,之后通过基础词精准筛选:
import pandas as pd # 基础词DataFrame df_base = pd.DataFrame({'base_word': ['hubung', 'cinta', 'ajar', 'oles', 'sejajarkan']}) # 派生词DataFrame df_affixed = pd.DataFrame({'nama': ['menghubung', 'mencinta', 'mengajar', 'mengoles','menyejajarkan']}) # 构建基础词-派生词映射表 df_mapping = pd.DataFrame({ 'base_word': df_base['base_word'].tolist(), 'affixed_word': df_affixed['nama'].tolist() }) # 输入基础词查询对应派生词 input_base = 'ajar' # 提取结果(多个匹配用tolist(),单个用values[0]) result = df_mapping[df_mapping['base_word'] == input_base]['affixed_word'].values[0] print(result) # 输出: mengajar
方法二:基于构词规则提取基础词(适用于规则化派生词)
如果派生词是通过固定前缀/后缀生成的(比如印尼语的me-/meng-前缀),可以用正则表达式从派生词中提取基础词,再建立关联:
import pandas as pd import re # 派生词DataFrame df_affixed = pd.DataFrame({'nama': ['menghubung', 'mencinta', 'mengajar', 'mengoles','menyejajarkan']}) # 定义提取基础词的函数(适配印尼语me-系列前缀规则) def extract_base_word(word): # 匹配meng-开头(对应基础词以元音a/i/u/e/o开头) meng_match = re.match(r'meng([aiueo].+)', word) if meng_match: return meng_match.group(1) # 匹配men-开头(对应基础词以辅音开头) men_match = re.match(r'men([^aiueo].+)', word) if men_match: return men_match.group(1) # 匹配meny-开头(对应基础词以s开头) meny_match = re.match(r'meny(.+)', word) if meny_match: return 's' + meny_match.group(1) # 其他情况直接返回原词 return word # 给派生词DataFrame添加基础词列 df_affixed['base_word'] = df_affixed['nama'].apply(extract_base_word) # 输入基础词查询 input_base = 'ajar' result = df_affixed[df_affixed['base_word'] == input_base]['nama'].tolist() print(result) # 输出: ['mengajar']
原代码的问题说明
你之前的str.contains('ajar')是模糊子串匹配,会返回所有包含ajar字符的派生词,无法保证是精准的基础词对应(比如如果有派生词ajarxyz也会被匹配)。而上面的方法通过明确映射或规则提取,实现了基础词与派生词的精准对应。
内容的提问来源于stack exchange,提问作者Muhammad Rusli
相关产品推荐
相关产品推荐

