Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将标记添加到紧跟“quot”的字符串中的否定词;不是",&引用;否";及;决不;_Python_Regex_Python 2.7_Sentiment Analysis - Fatal编程技术网

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

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

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

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

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


为了弥补Python的
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
    

您能至少展示一下您的尝试吗?