Python 如何将标记添加到紧跟“quot”的字符串中的否定词;不是",&引用;否";及;决不;
在字符串中的下一个标点符号(用于情绪分析)之前,如何将标记Python 如何将标记添加到紧跟“quot”的字符串中的否定词;不是",&引用;否";及;决不;,python,regex,python-2.7,sentiment-analysis,Python,Regex,Python 2.7,Sentiment Analysis,在字符串中的下一个标点符号(用于情绪分析)之前,如何将标记NEG添加到not、no和never后面的所有单词中?我假设可以使用正则表达式,但我不确定如何使用 输入:他想,这是行不通的。他打得不太好,所以他不得不多练习。 期望的输出:他想,这从来都不是负向负的工作。他打得不好,所以他必须多练习。 知道如何解决这个问题吗?我不会用regexp来解决这个问题。我宁愿 按标点符号拆分输入 对于每个片段,请执行以下操作: 将否定计数器设置为0 将输入拆分为单词 每一个字 将否定计数器编号NEG_u添加到
NEG
添加到not
、no
和never
后面的所有单词中?我假设可以使用正则表达式,但我不确定如何使用
输入:他想,这是行不通的。他打得不太好,所以他不得不多练习。
期望的输出:他想,这从来都不是负向负的工作。他打得不好,所以他必须多练习。
知道如何解决这个问题吗?我不会用regexp来解决这个问题。我宁愿
- 按标点符号拆分输入
- 对于每个片段,请执行以下操作:
- 将否定计数器设置为0
- 将输入拆分为单词
- 每一个字
- 将否定计数器编号NEG_u添加到单词中。(或mod 2,或如果大于0,则为1)
- 若原始单词位于{No,Never,Not}中,则将否定计数器增加1
- 首先,匹配字符串中以
、not
或no
开头的部分。正则表达式never
将是一个很好的起点。如果文本中出现标点符号,您可能需要向该列表中添加更多标点符号\b(?:not?| never)\b([^、:;!?]+)
- 然后,使用匹配结果的第1组作为第二步的目标:查找所有单词(例如,通过拆分空格和/或标点符号),并在前面加上
NEG
- 再次将字符串连接在一起,并将结果插入原始字符串中第一个正则表达式匹配的位置
re
regex引擎缺少一些Perl功能,您可以在re.sub
函数中使用lambda表达式来创建动态替换:
import re
string = "It was never going to work, he thought. He did not play so well, so he had to practice some more. Not foobar !"
transformed = re.sub(r'\b(?:not|never|no)\b[\w\s]+[^\w\s]',
lambda match: re.sub(r'(\s+)(\w+)', r'\1NEG_\2', match.group(0)),
string,
flags=re.IGNORECASE)
将打印()
他想,工作从来都不是负的。他打得不好,所以他必须多练习。不是NEG_foobar!
解释
- 第一步是选择您感兴趣的字符串部分。这件事就这样结束了
你的否定关键字(\b(?:不|从不|不)\b[\w\s]+[^\w\s]
是一个词的边界,\b
是一个非捕获组),后面是alpahnum和空格((?:…)
是\w
,[0-9a-zA-Z!]
是所有类型的空格),直到某个既不是字母也不是空格(充当标点符号)为止 请注意,此处标点符号是必需的,但您可以安全地删除\s
,以匹配字符串的结尾[^\w\s]
- 现在,您要处理的是
类字符串。只需选择前面带有空格的单词永远不会工作,
用你想要的来代替它们(\s+)(\w+)
\1NEG_\2