2014-01-17 98 views
1

因此,對於一個側面的愛好,我正在做一些基本的元數據收集使用項目Gutenberg版本的希羅多德文本挖掘,但我堅持把標記文本字符串轉移到Excel中。基本上我想要做的是創建一個所有人物,地點和團體/組織在希羅多德中提到的主要清單,並在文中提到每個人多少次。然後,我想使用此列表填充Tableau和/或Powerview中的一些數據可視化對象,我都有。記事本+ +將標記文本字符串移動到excel

我已經通過斯坦福大學的NER運行了這個文本,它至少確定了幾乎所有的人員,組織和位置。然後我使用notepad ++來手動檢查文檔,以解決NER在分析古希臘名稱和地點時所犯的大量錯誤。我也從文本中刪除了腳註,因爲我不關心它們,只是原文。如果您下載附件.txt,您會看到每個專有名詞都被標記爲/ PERSON,/ LOCATION或/ ORGANIZATION。

現在,我被困在試圖讓標記的文本字符串變爲Excel,所以我可以使用這些數據。一個簡單的ctr + f揭示了在book1中有880/PERSON標記的單詞。基本上我想要做的是抓住/ PERSON,/ LOCATION或/ ORGANIZATION之前的每一個字符串,並將它們複製到excel中。

我查看了記事本++的Regex表達式,看看我是否可以選擇字符串以/ PERSON結尾的所有文本字符串,但我似乎無法弄清楚。我可以得到正則表達式來選擇所有的「/ PERSON」,但我不明白正則表達式足以讓它選擇所有的「name/PERSON」或「place/LOCATION」字符串,如果這是合理的話。

編輯:我忘了問使用SQL或Python來幫助我解決這個問題。從我的工作中我很熟悉在數據庫上使用SQL查詢。所以這是一個愚蠢的問題,但你甚至可以使用SQL來直接查詢一個.txt文件?如果是這樣,那麼我可以很容易地編寫一個SQL語句來提取標記的文本字符串。

我對Python不太熟悉,但可以通過一些python腳本提取我正在尋找的信息嗎?

最後,我應該問原來的問題。我是否全部錯了?我認爲使用記事本++來糾正斯坦福NER標籤是必要的,但也許直接從標籤.txt到excel是錯誤的方法。

https://www.dropbox.com/s/k5m8yag6tpae05w/HerodotusB1NER.txt

2ND編輯:所以,我終於可以和你們兩個人提供的正則表達式表達玩,他們幾乎完美的工作。但是,我認爲它實際上修剪了一些結果集。

一個完美的例子是在運行正則表達式搜索後,人物「Deïokes」被修剪成「okes/PERSON」。我認爲正則表達式的a-z部分忽略了特殊字母,例如Deïokes中的變音符號。

我該如何調整正則表達式來容忍這些特殊字符?如果正則表達式不能適應這些特殊字符,那麼我認爲它不會過於人力密集地進入並修復它們在這裏和那裏顯示的特殊字符。

+0

歡迎來到Stack Overflow!這是一個相當完善的問題,但與編程本身無關。不過,它與正則表達式和解決問題有很大關係。有人可能會說,它更適合[超級用戶。因爲它是關於工具的。我希望你不介意我的編程方法的答案。 – simbabque

+0

爲了解決您的編輯問題:如果您擁有正確的驅動程序(有時Perl可以做到,Python也可以),可以使用SQL查詢'.csv'文件。但是你沒有CSV,或者你可以在Excel中打開它。我相信你可以很容易地將我的Perl代碼翻譯成Python。或JavaScript,並在瀏覽器中運行它。這是重要的方法。 :) – simbabque

回答

0

我給了這個另一個嘗試,發現一個非常簡單的解決方案,只是複製到Excel中的東西。我沒有Notepad ++,但偶爾會使用PSPad,如果我的IDE不在身邊。它提供了與Notepad ++幾乎相同的功能。有些事情做得更好,有些則沒有。正則表達式搜索很不錯,搜索對話框有一個按鈕,它說複製

Find dialogue

我複製你的文件,並使用正則表達式我從對方的回答沒有捕捉組。我們不需要它們,因爲它會複製整個比賽。記住\b是一個字邊界,而不是一個將被複制的真實字符。

Copied search results

瞧,我們開始吧。具有分類的名稱列表應該足夠簡單,可以將其複製到Excel並在那裏分割成列。

0

爲什麼不只是提取實際名稱:[a-zA-Z]+?(?=\/PERSON)?如果您希望/ PERSON也匹配,請刪除(?=)

甚至可以使用以下命令將所有內容提取到組中:([a-zA-Z]+?)\/([A-Z]+)。然後,您可以輸出捕獲的組,但不管您想要什麼。在任何象樣的文本編輯器中,例如SublimeText,你可以找到[\s\S]*?([a-zA-Z]+?)\/([A-Z]+)[\s\S]*?,並以{ $2: $1 },取代,例如製作一個很好的JS對象數組。

1

即使您設法使用Notepad ++搜索/替換所有這些名稱,我也不知道您打算如何將它們逐一複製到Excel中。由於SO主要是關於編程,所以我會提供一個代碼解決方案。這是Perl,如果你不知道它是如何工作或如何運行的,不要絕望。無論如何,這可能不是您選擇Windows的語言。你可以真的用任何編程語言來構建它。

#!/usr/bin/perl 
use strictures; 
use Data::Dump; 

my $counts; 

while (my $row = <DATA>) { 
    while ($row =~ m{\b(\w+)/([A-Z]+)}g) { 
    $counts->{$2}->{$1}++; 
    } 
} 

dd $counts; 
__DATA__ 
This is the Showing forth of the Inquiry of Herodotus/PERSON of Halicarnassos/LOCATION, 

輸出爲第一段:

{ 
    LOCATION => { Halicarnassos => 1 }, 
    ORGANIZATION => { Barbarians => 1, Hellenes => 1 }, 
    PERSON => { Herodotus => 1 }, 
} 

讓我們開始在底部__DATA__部分。我已經將完整的文本文件粘貼在那裏,但出於實際原因,這裏省略了它。基本上它只是在第一個while循環中逐行讀取文件。第二個while循環通過/g修飾符對每行應用正則表達式匹配,使正則表達式匹配多次。 The pattern means

NODE      EXPLANATION 
-------------------------------------------------------------------------------- 
    \b      the boundary between a word char (\w) and 
          something that is not a word char 
-------------------------------------------------------------------------------- 
    (      group and capture to \1: 
-------------------------------------------------------------------------------- 
    \w+      word characters (a-z, A-Z, 0-9, _) (1 or 
          more times (matching the most amount 
          possible)) 
-------------------------------------------------------------------------------- 
)      end of \1 
-------------------------------------------------------------------------------- 
/      '/' 
-------------------------------------------------------------------------------- 
    (      group and capture to \2: 
-------------------------------------------------------------------------------- 
    [A-Z]+     any character of: 'A' to 'Z' (1 or more 
          times (matching the most amount 
          possible)) 
-------------------------------------------------------------------------------- 
)      end of \2 

兩個拍攝組(..)結束了在變量$1$2。對於找到的每個單詞,我們都會在我們的數據結構$counts中計數一個值。這就像SQL中的GROUP BY計數。第一個鍵($2)是類型(PERSONLOCATION ...),第二個鍵是實際的單詞。 ++運算符遞增1。

當我們完成後,我們使用Data :: Dump模塊的函數dd打印它,這給我們提供了一個很好的按類型分組的計數輸出。


感謝您與我在這個小技術的過程中承擔。如果過於技術性,請嘗試優秀的JavaScript正則表達式工具regex101.com,where I set it up for you。您應該可以從那裏複製/粘貼到Excel。我推薦一個瀏覽器插件,可以讓你複製表格列。

+0

哇!棒極了!感謝您的快速和徹底的迴應。我對Perl不熟悉,但我會在今晚看看你的反應。 只是爲了確保我明白。你如此精彩的提供將創建一個由/ PERSON等標籤分組的所有「名稱」的計數?它是否重複計數名稱或每個字符串不同? – Thrasyboulos

+0

我不確定我是否明白你的意思。如果算上它們,它會告訴你'鮑勃'被看到5次,'倫敦'被看到3次。這意味着它是不同的。想象一下一堆水桶,或者是將你的代幣放在候選人的甕中的選舉。每當我們看到它時,我們在每個名字的* urn *中加一個。 – simbabque