首页 > 解决方案 > 有没有办法使用列表中的 reg 表达式?

问题描述

我有一个主题词列表,其中包含 reg 表达式:

list = ['peaceful','thank\s?god','infuriated','mood\s?dropped']

以及主题词到其主题的字典映射列表:

dict = {'peaceful': 'Restful','thank\s?god': 'Thankful','infuriated': 'Angry','mood\s?dropped':'Sad'}

目标是编写一个函数来判断一个字符串是否在列表中包含 reg 表达式,并返回匹配的主题。

某些提及可能与多个主题匹配。所以它需要保留所有匹配的主题。此外,区分大小写将是另一个需要考虑的问题。

我试过:

import re
def topic_emotion(text):
    text_lower=text.lower()
    output = []
    for elem in Emotion_Keywords_list:
        if bool(re.search(elem, text_lower)):
            output.append(Emotion_dict[elem])
    return output

例如:

topic_emotion('todaypeacefulday Im INFURIATED') = ['Restful','Angry']

但这似乎是错误的,无法处理 reg 表达式的情况,还有其他我应该考虑的因素吗?

标签: pythonregexstringnlptopic-modeling

解决方案


上面的代码在 Python 3.7 上运行良好

正则表达式模式涉及许多特殊字符。更好的方法是在使用前编译模式。

import regex as re

Emotion_Keywords_list = ['平安','谢天谢地','激怒','心情\s?dropped']

主题= ['休息','感恩','愤怒','悲伤']

导入 re def topic_emotion(text): output = [] compiled_keywords =[]

for elem in Emotion_Keywords_list:
    compiled_keywords.append(re.compile(elem,flags=re.I))

emotion_dict=dict(zip(compiled_keywords,topic))

for elem in compiled_keywords:
    if bool(re.search(elem, text)):
        output.append(emotion_dict[elem])
return output

推荐阅读