2009-01-21 134 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

相關問題