如何用Pandas在文本中查找所有匹配的指定词汇
用Pandas在带时间戳的短文本中匹配特定词汇列表
作为NLP新手,用Pandas来处理带时间戳的短文本集合确实是个聪明的选择——既能规整带时间维度的数据,又能轻松实现批量词汇匹配。下面我一步步给你演示怎么实现你想要的效果:
1. 先准备示例数据
先模拟你的场景:一个带时间戳的推特数据框,加上汽车制造商的词汇列表,方便你直接复刻测试:
import pandas as pd # 模拟带时间戳的推特数据 tweets_data = { "timestamp": ["2024-05-01 08:30", "2024-05-01 09:15", "2024-05-01 10:00", "2024-05-01 10:45"], "text": [ "Just bought a new Tesla Model Y, love it!", "Ford's new electric truck is game-changing", "Can't decide between Honda and Toyota", "My morning commute was terrible today" ] } df = pd.DataFrame(tweets_data) # 你的目标词汇列表:汽车制造商 car_brands = ["Tesla", "Ford", "Honda", "Toyota", "BMW", "Mercedes"]
2. 方法一:提取每行出现的目标词汇(合并成一列)
这个方法会把每行文本中匹配到的品牌提取出来,合并成单独一列,完全符合你想要的输出格式:
# 把词汇列表转成正则匹配模式,\b是单词边界,避免误匹配(比如不会把"Hond"当成"Honda") pattern = r'\b(' + '|'.join(car_brands) + r')\b' # 提取所有匹配的词汇,并整理格式 matches = df['text'].str.extractall(pattern).reset_index() matches.columns = ['行索引', '匹配序号', '品牌'] # 把同一行的多个品牌用逗号分隔 matched_brands = matches.groupby('行索引')['品牌'].apply(', '.join).reset_index() # 合并回原数据框,没有匹配的内容填充为"无" result_df = df.merge(matched_brands, left_index=True, right_on='行索引', how='left').fillna("无") result_df = result_df.drop(columns=['行索引'])
运行后你会得到这样的结果:
| timestamp | text | brand |
|---|---|---|
| 2024-05-01 08:30 | Just bought a new Tesla Model Y, love it! | Tesla |
| 2024-05-01 09:15 | Ford's new electric truck is game-changing | Ford |
| 2024-05-01 10:00 | Can't decide between Honda and Toyota | Honda, Toyota |
| 2024-05-01 10:45 | My morning commute was terrible today | 无 |
3. 方法二:给每个品牌单独做标记列
如果你想更细致地统计每个品牌的提及情况,可以给每个品牌单独生成一列,标记该行是否包含这个品牌:
for brand in car_brands: # case=False 表示忽略大小写,比如能匹配到"tesla"和"Tesla" df[brand] = df['text'].str.contains(r'\b' + brand + r'\b', case=False, na=False)
这样数据框会新增Tesla、Ford等列,值为True或False,方便你后续按时间统计不同品牌的提及频率。
4. 新手友好的注意事项
- 正则里的
\b一定要加上,不然会出现误匹配(比如把"Fordson"当成"Ford") - 如果你的文本有大小写混合的情况,记得在
str.contains里加case=False - 要是处理非英语文本,可能需要搭配分词工具,但对于英文品牌名,上面的方法完全够用
内容的提问来源于stack exchange,提问作者Arnold Klein
相关产品推荐
相关产品推荐

