我想我可以拿一段文字并从中删除高频英文单词。通过关键字,我的意思是我想提取最能表征文本内容(标签)的单词。它不一定是完美的,一个很好的近似是完美的我的需求。什么是从文本生成关键字的简单方法?
有没有人做过类似的事情?你知道一个Perl或Python库吗?
Lingua :: EN :: Tagger正是我问的,但我需要一个图书馆,可以工作法文文本。
我想我可以拿一段文字并从中删除高频英文单词。通过关键字,我的意思是我想提取最能表征文本内容(标签)的单词。它不一定是完美的,一个很好的近似是完美的我的需求。什么是从文本生成关键字的简单方法?
有没有人做过类似的事情?你知道一个Perl或Python库吗?
Lingua :: EN :: Tagger正是我问的,但我需要一个图书馆,可以工作法文文本。
您可以尝试使用perl模块Lingua::EN::Tagger来获得快速简单的解决方案。
更复杂的模块Lingua::EN::Semtags::Engine将Lingua :: EN :: Tagger与WordNet数据库结合使用,以获得更加结构化的输出。两者都非常易于使用,只需查看CPAN上的文档或安装模块后使用perldoc即可。
做你想要的是简单的方法...
>>> 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']
我不知道这是否任何标准的模块,但它不会是难以替代的三个极限用一个英文单词查找字母词。
好的答案,但我澄清,你会希望使用查询“设置”的英文单词而不是一个列表,以便您的查找是恒定的时间,而不是O( N)。 – 2009-01-21 16:11:18
好点。我编辑了测试以反映这一点。感谢:-) – 2009-01-22 09:16:49
“高频英文单词”的名称是stop words,并且有许多可用的列表。我不知道任何python或perl库,但是你可以在二叉树或散列中编码你的停止词列表(或者你可以使用python的frozenset),然后当你从输入文本中读取每个单词时,检查它是否是在你的“停止列表”中并过滤掉。
请注意,在删除停用词之后,您需要执行一些stemming以对结果文本进行规范化(删除复数形式),然后删除所有重复的“关键字”。
在Perl中有Lingua::EN::Keywords。
要查找文本中最经常使用的话,做这样的事情:
#!/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
一个衬垫溶液(也就是说超过两个字符长发生两次以上):
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'
我认为仍然保持简洁的外表最准确的方法是计算在源字的频率,然后重他们根据他们的共同英语(或任何其他语言)的使用频率。
常见用途中出现频率较低的词,如“咖啡屋”,比起“狗”更频繁出现的词更可能是关键词。尽管如此,如果你的消息来源提到500次“狗”和“咖啡屋”两次,那么“狗”更可能是一个关键词,尽管它是一个常见词。
决定加权方案将是困难的部分。
TF-IDF(Term Frequency - Inverse Document Frequency)是为此设计的。
基本上它会问,与所有文档相比,本文档中哪些词频繁?
它会给出现在所有文档中的单词的得分较低,并且对于出现在给定文档中的单词频繁得分较高。
你可以看到计算的工作在这里:
https://docs.google.com/spreadsheet/ccc?key=0AreO9JhY28gcdFMtUFJrc0dRdkpiUWlhNHVGS1h5Y2c&usp=sharing
(开关在底部TFIDF标签)
这里是一个Python库:
什么你的意思是“关键字”? – PEZ 2009-01-21 15:46:58
不要忘记,最简单的系统可能会被愚弄。沃斯写了操作系统。现在尝试谷歌搜索它...:D – 2009-01-21 15:48:56