Что такое простой способ генерировать ключевые слова из текста? - PullRequest
17 голосов
/ 21 января 2009

Полагаю, я мог бы взять текст и удалить из него высокочастотные английские слова. Под ключевыми словами я имею в виду то, что я хочу извлечь слова, которые наиболее характеризуют содержание текста (теги). Это не должно быть идеально, хорошее приближение идеально подходит для моих нужд.

Кто-нибудь делал что-нибудь подобное? Вы знаете библиотеку Perl или Python, которая это делает?

Lingua :: EN :: Tagger - именно то, о чем я спрашивал, однако мне нужна была библиотека, которая могла бы работать и для французского текста.

Ответы [ 8 ]

16 голосов
/ 21 января 2009

Название для "высокочастотных английских слов" - стоп-слов , и есть много доступных списков. Я не знаю ни о каких библиотеках Python или Perl, но вы могли бы закодировать ваш список стоп-слов в двоичное дерево или хэш (или вы могли бы использовать frozenset python), а затем, когда вы читаете каждое слово из входного текста, проверьте, если это в вашем «стоп-листе» и отфильтруйте его.

Обратите внимание, что после удаления стоп-слов вам нужно будет сделать stemming , чтобы нормализовать полученный текст (удалить множественное число, -ings, -eds), а затем удалить все дубликаты "ключевых слов" .

9 голосов
/ 21 января 2009

Вы можете попробовать использовать модуль perl Lingua :: EN :: Tagger для быстрого и простого решения.

Более сложный модуль Lingua :: EN :: Semtags :: Engine использует Lingua :: EN :: Tagger с базой данных WordNet для получения более структурированного вывода. Оба довольно просты в использовании, просто ознакомьтесь с документацией по CPAN или используйте perldoc после установки модуля.

5 голосов
/ 21 января 2009

Чтобы найти наиболее часто используемые слова в тексте, сделайте что-то вроде этого:

#!/usr/bin/perl -w

use strict;
use warnings 'all';

# Read the text:
open my $ifh, '<', 'text.txt'
  or die "Cannot open file: $!";
local $/;
my $text = <$ifh>;

# Find all the words, and count how many times they appear:
my %words = ( );
map { $words{$_}++ }
  grep { length > 1 && $_ =~ m/^[\@a-z-']+$/i }
    map { s/[",\.]//g; $_ }
      split /\s/, $text;

print "Words, sorted by frequency:\n";
my (@data_line);
format FMT = 
@<<<<<<<<<<<<<<<<<<<<<<...     @########
@data_line
.
local $~ = 'FMT';

# Sort them by frequency:
map { @data_line = ($_, $words{$_}); write(); }
  sort { $words{$b} <=> $words{$a} }
    grep { $words{$_} > 2 }
      keys(%words);

Пример вывода выглядит следующим образом:

john@ubuntu-pc1:~/Desktop$ perl frequency.pl 
Words, sorted by frequency:
for                                   32
Jan                                   27
am                                    26
of                                    21
your                                  21
to                                    18
in                                    17
the                                   17
Get                                   13
you                                   13
OTRS                                  11
today                                 11
PSM                                   10
Card                                  10
me                                     9
on                                     9
and                                    9
Offline                                9
with                                   9
Invited                                9
Black                                  8
get                                    8
Web                                    7
Starred                                7
All                                    7
View                                   7
Obama                                  7
4 голосов
/ 21 января 2009
3 голосов
/ 21 января 2009

Самый простой способ сделать то, что вы хотите, это ...

>>> text = "this is some of the sample text"
>>> words = [word for word in set(text.split(" ")) if len(word) > 3]
>>> words
['this', 'some', 'sample', 'text']

Я не знаю ни одного стандартного модуля, который бы делал это, но было бы нетрудно заменить ограничение на трехбуквенные слова поиском в набор общих английских слов.

2 голосов
/ 22 января 2009

Одно линейное решение (слова длиннее двух символов, которые встречались более двух раз):

perl -ne'$h{$1}++while m/\b(\w{3,})\b/g}{printf"%-20s %5d\n",$_,$h{$_}for sort{$h{$b}<=>$h{$a}}grep{$h{$_}>2}keys%h'

РЕДАКТИРОВАТЬ: Если вы хотите сортировать слова в алфавитном порядке с той же частотой, можете использовать это расширенное:

perl -ne'$h{$1}++while m/\b(\w{3,})\b/g}{printf"%-20s %5d\n",$_,$h{$_}for sort{$h{$b}<=>$h{$a}or$a cmp$b}grep{$h{$_}>2}keys%h'
1 голос
/ 23 декабря 2013

TF-IDF (термин частота - обратная частота документа) предназначен для этого.

По сути, он спрашивает, какие слова встречаются в этом документе чаще, чем все документы?

Это даст более низкую оценку словам, которые встречаются во всех документах, и более высокую оценку словам, которые часто встречаются в данном документе.

Рабочий лист расчетов можно посмотреть здесь:

https://docs.google.com/spreadsheet/ccc?key=0AreO9JhY28gcdFMtUFJrc0dRdkpiUWlhNHVGS1h5Y2c&usp=sharing

(перейти на вкладку TFIDF внизу)

Вот библиотека Python:

https://github.com/hrs/python-tf-idf

0 голосов
/ 22 января 2009

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

Слова, которые встречаются реже в общем употреблении, например, "кофейня", чаще являются ключевым словом, чем слова, которые встречаются чаще, например, "собака". Тем не менее, если ваш источник упоминает «собаку» 500 раз и «кофейню» дважды, более вероятно, что «собака» - это ключевое слово, хотя это обычное слово.

Выбор схемы взвешивания будет трудной частью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...