如何统计字符串列表中各目标短语出现次数并识别对应匹配短语?
解决目标短语出现次数的统计问题
你的现有代码只能得到每行的总匹配数,要统计每个目标短语的具体出现次数,可以用以下两种方案实现:
方案1:为每个短语单独统计(支持按行查看次数)
这种方法会为每个目标短语生成一列,记录每行文本中该短语的出现次数,同时可以汇总全局总次数。
import pandas as pd import re # 读取文本数据(优化原代码的换行处理) full_text = [] with open("hindu_texts.txt", encoding='utf-8') as myfile: for line in myfile: line = line.split("~") current = line[1].strip() # strip()一次性去掉换行和前后空白,比多次replace简洁 full_text.append(current) # 读取神的列表(优化空行判断) list_gods = [] with open("C:/Users/Owner/Documents/Fall_2022/hindu_gods.txt", encoding='utf-8') as myfile: for line in myfile: stripped_line = line.strip() if '~' not in stripped_line and stripped_line: list_gods.append(stripped_line) text_data = pd.DataFrame({'words': full_text}) # 循环统计每个神的出现次数 for god in list_gods: # re.escape处理短语中的特殊字符(比如带点、括号的名字),避免正则语法错误 # \b 确保匹配完整单词(可选,去掉则会匹配子串,比如"Ram"会匹配"Rama") # flags=re.IGNORECASE 忽略大小写(可选,根据需求调整) text_data[god] = text_data['words'].str.count( rf'\b{re.escape(god)}\b', flags=re.IGNORECASE ) # 输出每个神的全局总出现次数(按次数降序) god_total_counts = text_data[list_gods].sum().sort_values(ascending=False) print(god_total_counts) # 如果需要查看每行的具体匹配次数,直接输出text_data即可 # print(text_data)
方案2:提取所有匹配短语后统计(快速全局统计)
这种方法先提取每行中所有匹配的短语,再通过展开列表统计每个短语的总次数,同时能看到每行具体匹配了哪些短语。
import pandas as pd import re # 读取数据部分同方案1,省略... # 构建正则模式:包裹每个短语,处理特殊字符,可选添加单词边界 pattern = r'\b(' + '|'.join(re.escape(god) for god in list_gods) + r')\b' # 提取每行所有匹配的短语,返回列表格式 text_data['matches'] = text_data['words'].str.findall(pattern, flags=re.IGNORECASE) # 展开匹配列表,统计每个短语的全局出现次数 all_matches = text_data['matches'].explode().dropna() # 去掉空匹配的行 god_total_counts = all_matches.value_counts() print(god_total_counts) # 查看每行的原文本和匹配到的短语 print(text_data[['words', 'matches']])
注意事项
- 单词边界
\b:如果你的目标短语包含空格(比如"Lord Shiva"),\b会失效,此时可以去掉\b,或者用(?<!\S)和(?!\S)来匹配短语的前后空白/字符串边界。 - 大小写匹配:如果不需要区分大小写,保留
flags=re.IGNORECASE;如果严格区分,去掉该参数。 - 特殊字符处理:
re.escape必须保留,否则短语中的正则特殊字符(如.、*)会导致匹配错误。
内容的提问来源于stack exchange,提问作者user27606
相关产品推荐
相关产品推荐

