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

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

于 2009-01-21T15:54:43.997 回答
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 回答
2

TF-IDF(词频 - 逆文档频率)就是为此而设计的。

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

它会给所有文档中出现的单词打低分,给给定文档中频繁出现的单词打高分。

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

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

(切换到底部的 TFIDF 选项卡)

这是一个python库:

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

于 2013-12-23T19:58:21.807 回答
0

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

较不常用的词(如“咖啡屋”)比出现频率更高的词(如“狗”)更有可能成为关键字。尽管如此,如果您的消息来源提到“狗”500 次和“咖啡屋”两次,则“狗”更有可能是关键字,即使它是一个常用词。

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

于 2009-01-22T15:54:08.163 回答