18

テキストから高頻度の英単語を削除できると思います。キーワードとは、テキスト (タグ) の内容を最も特徴付ける単語を抽出したいということです。完璧である必要はありません。適切な近似が私のニーズに最適です。

誰かがそのようなことをしたことがありますか?それを行うPerlまたはPythonライブラリを知っていますか?

Lingua::EN::Tagger はまさに私が求めたものですが、フランス語のテキストでも機能するライブラリが必要でした。

4

8 に答える 8

16

「頻度の高い英単語」の名前はストップワードで、たくさんのリストがあります。私はpythonまたはperlライブラリを認識していませんが、バイナリツリーまたはハッシュでストップワードリストをエンコードできます(またはpythonのfrozensetを使用できます)。入力テキストから各単語を読み取るときに、それがあなたの「ストップリスト」に入れ、それを除外します。

ストップ ワードを削除した後、結果のテキストを正規化するためにステミングを実行し (複数形、-ings、-eds を削除)、重複する「キーワード」をすべて削除する必要があることに注意してください。

于 2009-01-21T16:14:29.853 に答える
9

迅速かつ簡単な解決策として、perl モジュールLingua::EN::Taggerを使用してみることができます。

より複雑なモジュールLingua::EN::Semtags::Engineは、Lingua::EN::Tagger を WordNet データベースと共に使用して、より構造化された出力を取得します。どちらも使い方はとても簡単です。CPAN のドキュメントをチェックするか、モジュールをインストールした後に perldoc を使用してください。

于 2009-01-21T16:44:49.497 に答える
5

テキストで最も頻繁に使用される単語を見つけるには、次のようにします。

#!/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
于 2009-01-21T17:47:07.717 に答える
4

Perl にはLingua::EN::Keywordsがあります。

于 2009-01-21T16:40:40.097 に答える
3

あなたが望むことをする最も簡単な方法はこれです...

>>> text = "これはサンプル テキストの一部です"
>>> words = [set(text.split(" ")) if len(word) > 3 内の単語の単語]
>>> 言葉
['this', 'some', 'sample', 'text']

これを行う標準モジュールを私は知りませんが、3 文字の単語の制限を一連の一般的な英単語の検索に置き換えることは難しくありません。

于 2009-01-21T15:54:43.997 に答える
2

ワンライナーソリューション(2回以上発生した2文字を超える単語):

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'
于 2009-01-22T14:36:23.343 に答える
0

シンプルさを維持する最も正確な方法は、ソース内の単語の頻度を数え、一般的な英語 (または他の言語) の使用頻度に従って重み付けすることだと思います。

「コーヒーハウス」のように頻繁に使用されない単語は、「犬」のように頻繁に使用される単語よりもキーワードである可能性が高くなります。それでも、ソースが「犬」を 500 回、「コーヒーハウス」を 2 回言及している場合は、「犬」が一般的な単語であってもキーワードである可能性が高くなります。

重み付けスキームを決定するのは難しい部分です。

于 2009-01-22T15:54:08.163 に答える