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”已经分块,我无法理解为什么会发生这种情况。我的代码有问题吗?
感谢您的帮助。
答案 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):
。