11

Python-NLTK は入力文字列を認識し、空白だけでなく内容にも基づいて解析できますか? この状況で「コンピュータシステム」がフレーズになったとしましょう。誰でもサンプルコードを提供できますか?


input String : "コンピュータ システムの応答時間に関するユーザーの意見の調査"

期待される出力: ["A", "survey", "of", "user", "opinion", "of", "computer system", "response", "time"]

4

1 に答える 1

18

あなたが探しているテクノロジーは、言語学とコンピューティングの複数のサブフィールドまたはサブサブフィールドから複数の名前で呼ばれています。


  • チャンキング
    • 自然言語処理から、浅い構文解析とも呼ばれ、
    • それがどのように生まれたかについてのスティーブ・アブニーの作品を読んでください:http://www.vinartus.net/spa/90e.pdf
    • 主要な NLP フレームワークとツールキットにはそれらが含まれている必要があります (例: OpenNLP、GATE、NLTK* (NLTK のデフォルトのチャンカーは名前エンティティに対してのみ機能することに注意してください))。
    • スタンフォード NLP にもあります: http://nlp.stanford.edu/projects/shallow-parsing.shtml

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 の研究者が望む出力は、キーフレーズ抽出またはチャンキングで得られることがよくあります... )

  • 用語抽出

    • これは、文書を翻訳する際に翻訳者に正しい専門用語を使用してもらいたいという翻訳研究から来ています。
    • 何十億もの収入を生み出す複雑な翻訳業界のために、専門用語には ISO 規格の宝庫が付属していることに注意してください...
    • 単一言語では、用語抽出ツール、同じアルゴリズム、異なるインターフェイスと何が違うのかわかりません...一部の用語抽出ツールについての唯一のことは、バイリンガルで実行し、辞書を自動的に生成する機能だと思います。
  • ここにいくつかのツールがあります


OPの質問に戻ります。

Q: NLTK は "computer system" を語句として抽出できますか?

A:そうでもない

上に示したように、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 に答える