2009-01-21 72 views
17

我想我可以拿一段文字并从中删除高频英文单词。通过关键字,我的意思是我想提取最能表征文本内容(标签)的单词。它不一定是完美的,一个很好的近似是完美的我的需求。什么是从文本生成关键字的简单方法?

有没有人做过类似的事情?你知道一个Perl或Python库吗?

Lingua :: EN :: Tagger正是我问的,但我需要一个图书馆,可以工作法文文本。

+0

什么你的意思是“关键字”? – PEZ 2009-01-21 15:46:58

+0

不要忘记,最简单的系统可能会被愚弄。沃斯写了操作系统。现在尝试谷歌搜索它...:D – 2009-01-21 15:48:56

回答

9

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

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

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

我不知道这是否任何标准的模块,但它不会是难以替代的三个极限用一个英文单词查找字母词。

+0

好的答案,但我澄清,你会希望使用查询“设置”的英文单词而不是一个列表,以便您的查找是恒定的时间,而不是O( N)。 – 2009-01-21 16:11:18

+0

好点。我编辑了测试以反映这一点。感谢:-) – 2009-01-22 09:16:49

16

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

请注意,在删除停用词之后,您需要执行一些stemming以对结果文本进行规范化(删除复数形式),然后删除所有重复的“关键字”。

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

我认为仍然保持简洁的外表最准确的方法是计算在源字的频率,然后重他们根据他们的共同英语(或任何其他语言)的使用频率。

常见用途中出现频率较低的词,如“咖啡屋”,比起“狗”更频繁出现的词更可能是关键词。尽管如此,如果你的消息来源提到500次“狗”和“咖啡屋”两次,那么“狗”更可能是一个关键词,尽管它是一个常见词。

决定加权方案将是困难的部分。

0

TF-IDF(Term Frequency - Inverse Document Frequency)是为此设计的。

基本上它会问,与所有文档相比,本文档中哪些词频繁?

它会给出现在所有文档中的单词的得分较低,并且对于出现在给定文档中的单词频繁得分较高。

你可以看到计算的工作在这里:

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

(开关在底部TFIDF标签)

这里是一个Python库:

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

相关问题