如何在“not”,“no”和“never”后面的字符串中添加标签到否定词

时间:2014-04-30 09:25:45

标签: python regex python-2.7 sentiment-analysis

如何将标记NEG_添加到跟随notnonever的所有字词,直到字符串中的下一个标点符号(用于情感分析) ?我假设可以使用正则表达式,但我不确定如何。

输入:
It was never going to work, he thought. He did not play so well, so he had to practice some more.

期望的输出:
It was never NEG_going NEG_to NEG_work, he thought. He did not NEG_play NEG_so NEG_well, so he had to practice some more.

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:6)

要弥补Python的re正则表达式引擎缺少一些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)

将打印(demo here

It was never NEG_going NEG_to NEG_work, he thought. He did not NEG_play NEG_so NEG_well, so he had to practice some more. Not NEG_foobar !

<强>解释

  • 第一步是选择你感兴趣的字符串部分。这是用

    完成的。
    \b(?:not|never|no)\b[\w\s]+[^\w\s]
    

    您的否定关键字(\b是单词边界,(?:...)是非捕获组),其次是alpahnum和空格(\w[0-9a-zA-Z_],{{1}是所有类型的空白),直到某个既不是孤儿也不是空格(作为标点符号)。

    请注意,标点符号在此处是必填项,但您也可以安全地删除\s以匹配字符串的结尾。

  • 现在你正在处理[^\w\s]种字符串。只需选择带有

    的空格前面的单词
    never going to work,

    并用你想要的东西替换它们

    (\s+)(\w+)
    

答案 1 :(得分:1)

我不会用regexp来做这件事。相反,我会;

  • 在标点符号上拆分输入。
  • 对于每个片段都
  • 将否定计数器设为0
  • 将输入拆分为单词
  • 每个单词
  • 在单词中添加NEG_的否定计数器编号。 (或mod 2,如果大于0则为1)
  • 如果原始单词在{No,Never,Not}中,则增加否定计数器。

答案 2 :(得分:0)

您需要分几步完成此操作(至少在Python中 - .NET语言可以使用具有更多功能的正则表达式引擎):

  • 首先,匹配以notnonever开头的字符串的一部分。正则表达式\b(?:not?|never)\b([^.,:;!?]+)将是一个很好的起点。如果文本中出现标点符号,则可能需要在该列表中添加更多标点字符。

  • 然后,使用匹配结果的第1组作为第二步的目标:查找所有单词(例如,通过拆分空格和/或标点符号)并在其前面添加NEG_

  • 再次将字符串连接在一起,并将结果插入原始字符串中,代替第一个正则表达式匹配。