Что такое простой способ генерации ключевых слов из текста?
Я предполагаю, что могу взять текст и удалить из него высокочастотные английские слова. По ключевым словам, я имею в виду, что я хочу извлечь слова, которые наиболее характерны для содержания текста (тегов). Он не должен быть идеальным, хорошее приближение идеально подходит для моих нужд.
Кто-нибудь сделал что-нибудь подобное? Вы знаете библиотеку Perl или Python, которая это делает?
Lingua:: EN:: Tagger - это именно то, что я задал, но мне нужна библиотека, которая также могла бы работать и для французского текста.
Ответы
Ответ 1
Вы можете попытаться использовать модуль perl Lingua:: EN:: Tagger для быстрого и простого решения.
Более сложный модуль Lingua:: EN:: Semtags:: Engine использует Lingua:: EN:: Tagger с базой данных WordNet для получения более структурированный вывод. Оба они довольно просты в использовании, просто проверьте документацию по CPAN или используйте perldoc после установки модуля.
Ответ 2
Название для "высокочастотных английских слов" остановить слова и доступно много списков. Я не знаю ни о каких библиотеках python или perl, но вы можете кодировать список стоп-слов в двоичном древе или хеше (или вы можете использовать python frozenset), затем, когда вы читаете каждое слово из входного текста, проверьте, в вашем "стоп-листе" и отфильтруйте его.
Обратите внимание, что после удаления слов остановки вам нужно сделать stemming, чтобы нормализовать полученный текст (удалить множественные числа, -ings, -eds), затем удалите все повторяющиеся "ключевые слова".
Ответ 3
В Perl Lingua::EN::Keywords.
Ответ 4
Чтобы найти наиболее часто используемые слова в тексте, сделайте следующее:
#!/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);
Пример вывода выглядит следующим образом:
[email protected]:~/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
Ответ 5
Самый простой способ сделать то, что вы хотите, это...
>>> 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']
Я не знаю ни одного стандартного модуля, который делает это, но нетрудно было бы заменить ограничение на три слова буквы поиском в набор общих английских слов.
Ответ 6
Одно линейное решение (слова длиной более двух символов, которые встречались более двух раз):
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'
Ответ 7
Я думаю, что самый точный способ, который все еще сохраняет видимость простоты, состоял бы в том, чтобы подсчитать частоты слов в вашем источнике, а затем весить их в соответствии с их частотами в общем английском (или любом другом языке).
Слова, которые появляются менее часто в обычном использовании, такие как "кофейня", скорее всего, являются ключевыми словами, чем слова, которые появляются чаще, например "собака". Тем не менее, если ваш источник упоминает "собаку" 500 раз и "кофейню" дважды, более вероятно, что "собака" - это ключевое слово, хотя это и распространенное слово.
Решение о схеме взвешивания было бы трудной частью.
Ответ 8
TF-IDF (временная частота - обратная частота документа) предназначена для этого.
В основном, он спрашивает, какие слова являются частыми в этом документе, по сравнению со всеми документами?
Это даст более низкий балл для слов, которые появляются во всех документах, и более высокий балл для слов, которые часто появляются в данном документе.
Здесь вы можете увидеть таблицу расчётов:
https://docs.google.com/spreadsheet/ccc?key=0AreO9JhY28gcdFMtUFJrc0dRdkpiUWlhNHVGS1h5Y2c&usp=sharing
(переход на вкладку TFIDF внизу)
Вот библиотека python:
https://github.com/hrs/python-tf-idf