Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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 检查元组列表的顺序_Python_Python 3.x_Nlp_Nltk_Part Of Speech - Fatal编程技术网

Python 检查元组列表的顺序

Python 检查元组列表的顺序,python,python-3.x,nlp,nltk,part-of-speech,Python,Python 3.x,Nlp,Nltk,Part Of Speech,我有一个元组列表,这些元组是使用NLTK的PoS标记器从字符串生成的 我试图找到特定字符串的意图,以便将其附加到数据帧,因此我需要一种生成语法/语法规则的方法 string = "RED WHITE AND BLUE" string_list = nltk.pos_tag(a.split()) string_list = [('RED', 'JJ'), ('WHITE', 'NNP'), ('AND', 'NNP'), ('BLUE', 'NNP')] 字符串的大小各不相同,从2-3个元素

我有一个元组列表,这些元组是使用NLTK的PoS标记器从字符串生成的

我试图找到特定字符串的意图,以便将其附加到数据帧,因此我需要一种生成语法/语法规则的方法

string = "RED WHITE AND BLUE"

string_list = nltk.pos_tag(a.split())

string_list = [('RED', 'JJ'), ('WHITE', 'NNP'), ('AND', 'NNP'), ('BLUE', 'NNP')]
字符串的大小各不相同,从2-3个元素一直到第40-50+段的完整内容,所以我想知道是否有一个通用的形式或规则可以用来解析一个句子

因此,如果我想在列表中找到模式,伪代码输出示例如下:

string_pattern = "I want to kill all the bad guys in the Halo Game"

pattern = ('I', 'PRP') + ('want', 'VBP') + ('to', 'TO') + ('kill:', 'JJ') + ('all', 'DT') + ('bad', 'JJ') + ('guys', 'NNS') + ('in', 'IN') + ('Halo', 'NN') + ('Game', 'NN')
理想情况下,我能够匹配标记字符串中的部分模式,因此它会发现:

('I', 'PRP') + ('want', 'VBP') + ('to', 'TO') + ('kill:', 'JJ')

但它不需要其余部分,反之亦然,如果字符串是一个段落,它可以在同一个字符串中找到模式的多个示例。如果有人知道做这件事的最佳方法,或者知道更好的选择,那将非常有用

我能想到的最简单的方法是使用暴力当然,你可以调整它,甚至使用一些机器学习来帮助找到类以便更容易匹配

下面是一个简单的bruteforce方法:

标记字符串

创建预期标记的列表

以下功能将能够检查此模式是否出现:

更现实地说:

现在,更实际地说,假设你属于一个平民保护机构,想知道学校学生发的任何关于谋杀的推特。你不知怎的过滤了推特,想看看是否有人想杀了其他人

只要稍加修改,您就可以在类似的情况下实现以下想法:

请记住,这都是实验性的,需要大量手工编码。您可以向其中添加NER标记,以便抽象名称

添加另一种可能性,类似于我在硕士研究中使用的可能性:


您可以创建一个包含动作、代理和意图的图形,将它们连接起来,而不是使用线性暴力机制。然后在程序读取输入时使用某种图形扩展算法。您可以在我的研究中阅读更多内容,但请记住,您正在询问的自然语言理解这一主题是深入的和正在发展的:

到目前为止,我所能建议的就是使用暴力。这对你合适吗?我想尝试一下,但我不知道如何构造,即使使用蛮力。这真是太美了,它在我的数据帧中字符串所在的一些条目上运行,但是我遇到了一个索引错误,我正试图在查找匹配中诊断,如果tuple[1]==flag\u list[num\u matched]:indexer错误:列表索引超出范围检查元组中的项,它可能返回空元组。另外,检查你是否没有在你找到一个完美匹配后必须返回或打破的旗帜列表长度上爆炸。你用的是哪种解决方案?我用的是第一种解决方案,我现在正在检查元组,我想我可能传递了错误的列表/指令,这就是为什么它传递的元组是空的,我修正了,在这种情况下,一旦它到达标记列表的长度,它就会中断。正确吗?我刚刚纠正了代码中的一个错误。将if matched==lenpos\u标记更改为if num\u matched==lenpos\u标记:
string_list = nltk.pos_tag(a.split())
pos_tags = ["NN", "VBP", "NN"]
def find_match(string_list, pos_tags)

    num_matched = 0
    match_start_pos = 0
    matched = False
    #Enumerating gives you an index to compare to enable you to find where matching starts
    for idx, tuple in enumerate(string_list):
        if tuple[1] == pos_tags[num_matched]:
            num_matched += 1
            if num_matched == 0:
                match_start_pos = idx
        else: 
            num_matched = 0
        if num_matched == len(pos_tags):
            matched = True
            break
    return (matched, match_start_pos)
killing_intent_dict = {"PRP":set("I", "YOU", "He", "She"), "V": set("kill"), "NNP":set("All", "him", "her")}
if find_match_pattern(string_list, killing_intent_dict):
#    someone wants to kill! Call 911

def find_match_pattern(string_list, pattern_dict) 
    num_matched = 0
    match_start_pos = 0
    matched = False
    #Enumerating gives you an index to compare to enable you to find where matching starts
    for idx, tuple in enumerate(string_list):
        if tuple[1] == pattern_dict.keys()[num_matched]:
            if tuple[0] in pattern_dict[tuple[1]]:
                num_matched += 1
                if num_matched == 0:
                    match_start_pos = idx
            else:
                num_matched = 0
        else: 
            num_matched = 0
        if num_matched == len(pattern_dict):
            matched = True
            break
    return (matched, match_start_pos)