Ответ 1
Технология, которую вы ищете, называется несколькими именами из нескольких подполей или под-подполей лингвистики и вычислений.
- Извлечение ключевых фраз
- Из поиска информации, в основном используется для улучшения индексирования/запросов для поиска
- Прочтите этот недавний обзорный документ: http://www.hlt.utdallas.edu/~saidul/acl14.pdf
- (я лично) настоятельно рекомендую: https://code.google.com/p/jatetoolkit/ и, конечно, знаменитый https://code.google.com/p/kea-algorithm/ (от людей, которые принесли вам WEKA, http://www.cs.waikato.ac.nz/ml/weka/)
- Для python, возможно https://github.com/aneesha/RAKE
- Чанкинг
- От обработки естественного языка, он также вызывает мелкий синтаксический анализ,
- Прочитайте Стив Абни о том, как это произошло: http://www.vinartus.net/spa/90e.pdf
- Основные рамки и инструментальные средства NLP должны иметь их (например, OpenNLP, GATE, NLTK * (обратите внимание, что Chunker по умолчанию для NLTK работает только для имен объектов))
- У Стэнфордского НЛП тоже есть: http://nlp.stanford.edu/projects/shallow-parsing.shtml
Я приведу пример кулера NE в NLTK:
>>> 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)
Вы можете видеть, что это в значительной степени ошибочно, лучше что-то, чем ничего, я думаю.
- Выделение нескольких слов
- Горячая тема в НЛП, каждый хочет извлечь их по той или иной причине
- Наиболее заметная работа Ивана Сага: http://lingo.stanford.edu/pubs/WP-2001-03.pdf и миазма всех видов алгоритмов извлечения и извлечение из документов ACL
- Насколько это MWE очень загадочно, и мы не знаем, как классифицировать их автоматически или извлекать их должным образом, нет соответствующих инструментов для этого (как ни странно, исследователи вывода MWE часто могут быть получены с помощью Keyphrase Extraction или chunking...)
-
Вывод терминологии
- Это происходит из исследований перевода, где они хотят, чтобы переводчики использовали правильное техническое слово при переводе документа.
- Обратите внимание, что терминология поставляется с cornocopia стандартов ISO, из которых следует следовать из-за запутанной индустрии переводов, которая генерирует миллиарды доходов...
- Однозначно, я понятия не имею, что отличает их от терминологического экстрактора, тех же алгоритмов, различного интерфейса... Я думаю, что единственное, что касается некоторых экстракторов терминов, - это возможность сделать это билингвально и автоматически создать словарь.
-
Вот несколько инструментов
- https://github.com/srijiths/jtopia и
- http://fivefilters.org/term-extraction/
- https://github.com/turian/topia.termextract
- https://www.airpair.com/nlp/keyword-extraction-tutorial
- http://termcoord.wordpress.com/about/testing-of-term-extraction-tools/free-term-extractors/
- Замечание по инструментам: пока еще нет инструмента, который выделяется для извлечения термина. И из-за того, что тогда задействованы большие деньги, он всегда вызывает некоторые вызовы API, а большинство кода "полуоткрыты".. в основном закрыты. Опять же, SEO - это также большие деньги, возможно, это просто культурная вещь в индустрии перевода, чтобы быть супер скрытной.
Теперь вернемся к вопросу ОП.
Q: Может ли NLTK извлечь "компьютерную систему" в качестве фразы?
A: Не действительно
Как показано выше, NLTK имеет предварительно подготовленный chunker, но он работает с объектами имен и даже в этом случае не все известные объекты распознаются.
Возможно, 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')]
Так что даже с этим решением кажется, что попытка получить "компьютерную систему" сложна. Но если вы думаете, что немного похоже на то, что "время реакции на компьютерную систему" является более правильной фразой, чем "компьютерная система".
Не все интерпретации времени отклика компьютерной системы выглядят действительно:
- [время отклика компьютерной системы]
- [компьютер [система [ответ [время]]]]
- [компьютерная система] [время ответа]
- [компьютер [время отклика системы]]
И многие гораздо более возможные интерпретации. Итак, вы должны спросить, что вы используете извлеченную фразу, а затем посмотрите, как продолжить резкие длинные фразы, такие как "время реакции компьютерной системы".