我想我可以拿一段文字並從中刪除高頻英文單詞。通過關鍵字,我的意思是我想提取最能表徵文本內容(標籤)的單詞。它不一定是完美的,一個很好的近似是完美的我的需求。什麼是從文本生成關鍵字的簡單方法?
有沒有人做過類似的事情?你知道一個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