Подтвердить что ты не робот

Что такое простой способ генерации ключевых слов из текста?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 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