搜索关键字作为名词

时间:2018-05-17 20:16:57

标签: python nltk

que = ("What's the weather like?")
lines_list = tokenize.sent_tokenize(que)
    for text in lines_list:
        tokenizer = word_tokenize(text)
        nouns = nltk.pos_tag(tokenizer)
        chunked = ne_chunk(nouns)
        print(chunked) #(S What/WP 's/VBZ the/DT weather/NN like/IN ?/.)
if ("weather/NN") in chunked:
    print("I found weather as noun")

如果你运行这段代码,它似乎不会认识到“天气/ NN”已经分块,我无法理解为什么会发生这种情况。我的代码有问题吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

问题是chunked不是字符串,而是一系列双元素元组:

[('What', 'WP'), ("'s", 'VBZ'), ('the', 'DT'), ('weather', 'NN'), ('like', 'IN'), ('?', '.')]

所以,那个元组是你应该检查的:

if ("weather", "NN") in chunked:
    print("I found weather as noun")

更一般地说,您可以通过查看实际值来调试它,而不是仅打印出它们的str表示。例如:

for chunk in chunked:
    print(type(chunk), chunk)

...你是如何发现它是一系列元组的,因为它显示:

<class 'tuple'> ('What', 'WP') 

...虽然字符串会显示:

<class 'str'> W
<class 'str'> h
<class 'str'> a

...因为字符串是字符序列,而不是元组序列。

那些看起来像字符串的元组。但如果你想确定一下:

for chunk, typ in chunked:
    print(type(chunk), chunk, chunk(typ), typ)

如果他们串起来,你会得到类似的东西:

<class 'str'> 'What' <class 'str'> 'WP'

...然后上面的代码就可以了。如果您改为看到类似的内容:

<class 'nltk._spam.Eggs'> 'What' <class 'str'> 'WP'

...那么你可能不能("weather", "NN");你必须看看如何创建一个Eggs对象。

答案 1 :(得分:0)

chunked是一个块结构,它覆盖了__str__()__repr__()方法,因此它打印为一个很好的字符串,但它本身不是一个字符串,所以你看不到另一个字符串是in它。试试if ("weather/NN") in str(chunked):