从文本生成关键字的简单方法是什么?

时间:2009-01-21 15:43:36

标签: python perl metadata

我想我可以拿一个文字并从中删除高频英语单词。通过关键字,我的意思是我想提取最能代表文本(标签)内容的单词。它不一定是完美的,一个好的近似是完美的满足我的需求。

有没有人这样做过?你知道Perl或Python库吗?

Lingua :: EN :: Tagger正是我所要求的,但我需要一个可以用于法语文本的库。

8 个答案:

答案 0 :(得分:16)

“高频英语单词”的名称为stop words,并且有许多列表可用。我不知道任何python或perl库,但你可以在二叉树或散列中编码你的停用词列表(或者你可以使用python的冷冻集),然后当你从输入文本中读取每个单词时,检查它是否是在你的“停止列表”中过滤掉它。

请注意,删除停用词后,您需要执行一些stemming来规范化生成的文本(删除复数,-ings,-eds),然后删除所有重复的“关键字”。< / p>

答案 1 :(得分:9)

您可以尝试使用perl模块Lingua::EN::Tagger来获得快速简便的解决方案。

更复杂的模块Lingua::EN::Semtags::Engine使用Lingua :: EN :: Tagger和WordNet数据库来获得更结构化的输出。两者都非常易于使用,只需查看CPAN上的文档或在安装模块后使用perldoc。

答案 2 :(得分: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

答案 3 :(得分:4)

在Perl中有Lingua::EN::Keywords

答案 4 :(得分:3)

做你想做的最简单的方法是......

>>> 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']

我不知道有任何标准模块可以做到这一点,但是通过查找一组常用英语单词来替换三个字母单词的限制并不困难。

答案 5 :(得分: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'

答案 6 :(得分:1)

TF-IDF(术语频率 - 反向文档频率)就是为此而设计的。

基本上它问,与所有文件相比,本文件中经常出现哪些词?

它会对所有文档中出现的单词给出较低的分数,对经常出现在给定文档中的单词给出较高的分数。

您可以在此处查看计算的工作表:

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

(切换到底部的TFIDF标签)

这是一个python库:

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

答案 7 :(得分:0)

我认为仍然保持简洁外观的最准确的方法是计算源中的单词频率,然后根据它们在普通英语(或任何其他语言)中的使用频率对它们进行加权。

常用的常用词比“咖啡馆”更容易成为关键词,而不是像“狗”这样的词。尽管如此,如果你的消息来源提到500次“dog”和“coffeehouse”两次,那么“dog”更有可能是一个关键词,即使它是一个常用词。

决定加权计划将是困难的部分。