11

Python-NLTK 能否识别输入字符串并不仅基于空格而且还基于内容对其进行解析?说,“计算机系统”在这种情况下成了一个词组。任何人都可以提供示例代码吗?


input String : "计算机系统响应时间的用户意见调查"

预期输出:["A", "survey", "of", "user", "opinion", "of", "computer system", "response", "time"]

4

1 回答 1

18

您正在寻找的技术被称为来自语言学和计算的多个子领域或子子领域的多个名称。


我将举一个 NLTK 中的 NE 分块器的示例:

>>> from nltk import word_tokenize, ne_chunk, pos_tag
>>> sent = "A survey of user opinion of computer system response time"
>>> chunked = ne_chunk(pos_tag(word_tokenize(sent)))
>>> for i in chunked:
...     print i
... 
('A', 'DT')
('survey', 'NN')
('of', 'IN')
('user', 'NN')
('opinion', 'NN')
('of', 'IN')
('computer', 'NN')
('system', 'NN')
('response', 'NN')
('time', 'NN')

使用命名实体:

>>> sent2 = "Barack Obama meets Michael Jackson in Nihonbashi"
>>> chunked = ne_chunk(pos_tag(word_tokenize(sent2)))
>>> for i in chunked:
...     print i
... 
(PERSON Barack/NNP)
(ORGANIZATION Obama/NNP)
('meets', 'NNS')
(PERSON Michael/NNP Jackson/NNP)
('in', 'IN')
(GPE Nihonbashi/NNP)

你可以看到它有很多缺陷,总比没有好,我猜。


  • 多词表达提取
    • NLP 中的热门话题,每个人都出于某种原因想提取它们
    • Ivan Sag 最著名的工作:http: //lingo.stanford.edu/pubs/WP-2001-03.pdf和各种提取算法的瘴气,以及从 ACL 论文中提取的用法
    • 尽管这个 MWE 非常神秘,我们不知道如何自动分类或正确提取它们,但没有合适的工具来解决这个问题(奇怪的是,MWE 的研究人员想要的输出通常可以通过 Keyphrase Extraction 或分块获得...... )


现在回到OP的问题。

问:NLTK 可以将“计算机系统”提取为短语吗?

答:不是真的

如上所示,NLTK 具有预训练的分块器,但它适用于名称实体,即使如此,并非所有的命名实体都能得到很好的识别。

可能 OP 可以尝试更激进的想法,让我们假设一系列名词在一起总是形成一个短语:

>>> from nltk import word_tokenize, pos_tag
>>> sent = "A survey of user opinion of computer system response time"
>>> tagged = pos_tag(word_tokenize(sent))
>>> chunks = []
>>> current_chunk = []
>>> for word, pos in tagged:
...     if pos.startswith('N'):
...             current_chunk.append((word,pos))
...     else:
...             if current_chunk:
...                     chunks.append(current_chunk)
...             current_chunk = []
... 
>>> chunks
[[('computer', 'NN'), ('system', 'NN'), ('response', 'NN'), ('time', 'NN')], [('survey', 'NN')], [('user', 'NN'), ('opinion', 'NN')]]
>>> for i in chunks:
...     print i
... 
[('computer', 'NN'), ('system', 'NN'), ('response', 'NN'), ('time', 'NN')]
[('survey', 'NN')]
[('user', 'NN'), ('opinion', 'NN')]

因此,即使使用该解决方案,似乎试图单独获得“计算机系统”也很困难。但是,如果您稍微思考一下,“计算机系统响应时间”似乎是比“计算机系统”更有效的短语。

不要认为所有对计算机系统响应时间的解释似乎都有效:

  • 【电脑系统响应时间】
  • [电脑[系统[响应[时间]]]]
  • [电脑系统] [响应时间]
  • [计算机[系统响应时间]]

还有更多可能的解释。所以你必须问,你用提取的短语做什么,然后看看如何继续切割长短语,比如“计算机系统响应时间”。

于 2014-12-02T00:50:36.920 回答