Алгоритмы обнаружения фраз и ключевых слов из текста

StackOverflow https://stackoverflow.com/questions/1643616

  •  10-07-2019
  •  | 
  •  

Вопрос

У меня около 100 мегабайт текста без всякой разметки, разбитого примерно на 10 000 записей.Я хотел бы автоматически генерировать список «тегов».Проблема в том, что существуют группы слов (т.фразы), которые имеют смысл только тогда, когда они сгруппированы вместе.

Если я просто посчитаю слова, я получу большое количество действительно распространенных слов (is, the, for, in, am и т. д.).Я посчитал слова и количество других слов, которые стоят до и после него, но теперь действительно не могу понять, что делать дальше. Информация, касающаяся фраз из 2 и 3 слов, присутствует, но как мне извлечь эти данные?

Это было полезно?

Решение

Прежде всего, постарайтесь сохранить информацию о «границах», которая содержится во входном тексте.
(если такая информация не может быть легко потеряна, ваш вопрос подразумевает, что, возможно, токенизация была легко выполнена)
В процессе токенизации (в данном случае синтаксического анализа слов) ищите шаблоны, которые могут определять границы выражения (например, знаки препинания, особенно точки, а также множественное разделение LF/CR, используйте их.Также такие слова, как «the», часто могут использоваться в качестве границ.Такие границы выражения обычно «отрицательны» в том смысле, что они разделяют два экземпляра токена, которые обязательно нет включаться в одно и то же выражение.Некоторыми положительными границами являются кавычки, особенно двойные кавычки.Этот тип информации может быть полезен для фильтрации некоторых n-грамм (см. следующий параграф).Кроме того, в качестве границ выражений можно использовать такие последовательности слов, как «например», «вместо» или «необходимо» (но использование такой информации является переходом к использованию «предварительных значений», о которых я расскажу позже).

Без использования внешних данных (кроме входного текста), вы можете добиться относительного успеха, запустив статистику по биграммы и триграммы текста (последовательность из 2 и 3 последовательных слов).Тогда [большинство] последовательностей со значительным (*) количеством экземпляров, скорее всего, будут тем типом «выражения/фразы», ​​который вы ищете.
Этот несколько грубый метод даст несколько ложных срабатываний, но в целом может оказаться работоспособным.Фильтрация n-грамм, которые, как известно, пересекают «границы», как указано в первом абзаце, может существенно помочь, поскольку в естественных языках окончание и начало предложения имеют тенденцию извлекаться из ограниченного подмножества пространства сообщений и, следовательно, создавать комбинации токенов, которые могут кажутся статистически хорошо представленными, но обычно не связаны семантически.

Лучшие методы (возможно, более дорогостоящий с точки зрения обработки и дизайна/инвестиций), позволит использовать дополнительные «априоры», соответствующие домену и/или национальным языкам входного текста.

  • POS-теги (часть речи) весьма полезен во многих отношениях (обеспечивает дополнительные, более объективные границы выражений, а также классы «шумовых» слов, например, все статьи, даже когда они используются в контексте сущностей, обычно в облаках тегов мало, так что ОП хочет производить.
  • Словари, лексиконы и тому подобное тоже может быть весьма полезно.В частности, те, которые идентифицируют «сущности» (так называемые экземпляры в ВордНет жаргон) и их альтернативные формы.Сущности очень важны для облаков тегов (хотя это не единственный класс слов, встречающихся в них), и, идентифицируя их, также можно их нормализовать (множество различных выражений, которые можно использовать, скажем, «Сенатор Т.Кеннеди»), тем самым устраняя дубликаты, но также увеличивая частоту использования основных объектов.
  • если корпус структурирован как коллекция документов, может быть полезно использовать различные приемы, связанные с TF (частота терминов) и IDF (обратная частота документов).

[Извините, мне пора идти (плюс хотелось бы получить более подробную информацию о ваших конкретных целях и т. д.).Я постараюсь предоставить более подробную информацию и пуанты позже]

[Кстати, я хочу сюда подключиться Ответы Джонатана Файнберга и Дервина Танка из этого поста, поскольку они предоставляют отличные советы с точки зрения методов и инструментов для решения поставленной задачи.В частности, НТЛК и Python в целом предоставить отличную основу для экспериментов]

Другие советы

Я бы начал с замечательной главы Питера Норвига в книге О'Рейли Красивые данные . Он предоставляет данные ngram, которые вам нужны, вместе с красивым кодом Python (который может решить ваши проблемы как есть, или с некоторыми изменениями) на своем личном веб-сайте .

Похоже, вы ищете извлечение коллокаций . Мэннинг и Шютце посвящают глава к теме, объясняющая и оценивающая« предложенные формулы », упомянутые в статье Википедии, на которую я ссылался.

Я не могу вписать всю главу в этот ответ; надеюсь, что некоторые из их ссылок помогут. ( NSP звучит особенно уместно.) У nltk есть модуль коллокаций , не упомянутый Мэннингом и Шютце, так как их книга предшествует ему .

Другие ответы, опубликованные до сих пор, касаются статистической обработки языка и н-граммов в целом; словосочетания являются специфической подтемой.

Сделайте матрицу для слов. Затем, если есть два последовательных слова, добавьте одно в соответствующую ячейку.

For example you have this sentence.

mat['for']['example'] ++;
mat['example']['you'] ++;
mat['you']['have'] ++;
mat['have']['this'] ++;
mat['this']['sentence'] ++;

Это даст вам значения для двух последовательных слов. Вы можете сделать это слово также тремя словами. Осторожно, для этого требуется O (n ^ 3) памяти.

Вы также можете использовать кучу для хранения таких данных, как:

heap['for example']++;
heap['example you']++;

Один из способов - создать себе автомат. скорее всего, недетерминированный конечный автомат (NFA). NFA

Еще один более простой способ - создать файл, содержащий слова и / или группы слов, которые вы хотите игнорировать, найти, сравнить и т. д., и сохранить их в памяти при запуске программы, а затем сравнить файл, который вы анализируете, со словом / группами слов, содержащимися в файле.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top