2014-09-05 16 views
9

我想從200個單詞的列表中創建一些排列 - 這顯然會產生一個問題,因爲這會導致一些可能的巨大數量的可能排列(短語中最多5個單詞)。爲了有效地限制這個號碼我有一個雙管齊下的攻擊:如何篩選單詞排列以僅查找語義正確的ngrams? (Python 3,NLTK)

  1. 通過POS濾波器通的話,這樣只在語言聲音短語創建和
  2. 過濾器由那些實際的n-gram的排列 - 即有很高的PMI /可能性分數。

這一概念的第二部分有我不知道 - 我知道,NLTK提供找n元語法的能力,但我每次看到示例分析語料庫,因爲需要一個freqdist這是有道理的。 但是,是否有可能找到單詞置換的PMI?

基於在自定義語料庫中找到的常見搭配,是否可以找到我的單詞排列的PMI分數?可以手動完成嗎?

例如,雖然置換(詳細的茶)在語言上是合理的,但它不是一個上下文良好的置換。

我知道在一段文本/語料庫中找到常見搭配的代碼,但這是一個非常獨特的問題,我希望有人可以提供一些建議。至少,幫我把頭繞在這!

**KW** 
Ball 
Bat 
Pinch 
Home 
Run 
Base 
Hitter 
Pitcher 
Call 
etc... 

更多的背景: 現在,有許多可從該列表中進行排列的,但只有少數是實際上是有意義的。通過POS過濾器傳遞此列表可以讓我創建具有語言意義的關鍵字 - 但不是那些語義上正確的關鍵字,即「Call Ball Hitter」。這是我的努力,以某種方式創建基於某種評分標準(如PMI)的語義正確排列。現在我的想法是刮掉一個網站,即http://en.wikipedia.org/wiki/Baseball,在它內部找到常見的ngram,然後基於該語料庫以某種方式判斷關鍵字排列的相對語義強度。但是我很難將這個概念化,並且我不確定它是否可能。但是,真的,我很想聽聽有關如何有效查找ngram排列的其他想法!這裏的練習歸結爲有效地消除無意義的排列,而無需手動對所有內容進行分類/評分!

+0

你能舉一些這個問題的例子嗎? – 2014-09-07 05:21:56

+0

你能定義PMI嗎? – 2014-09-07 13:10:04

回答

0

您並未透露您的POS清單,但除非您的關鍵字清單比您向我們展示的清單複雜得多,否則這似乎可以通過「找到清單上最長的清單序列」來解決。確保一個短語是合法的唯一方法是它出現在輸入語料庫中,因此計算是一個紅色的鯡魚。也許甚至POS過濾是不必要的。

words='Ball|Bat|Pinch|Home|Run|Base|Hitter|Pitcher|Call' 
curl -s 'http://en.wikipedia.org/wiki/Baseball' | 
grep -Eio "\<($words)(+($words))+\>" 

(我試過grep -w但這並沒有正確地grep -o我在OSX上工作,所以我增加了\<...\>字邊界來代替。)

這個特定的URL和部分關鍵字列表的輸出如下(通過sort -u | uniq -c | sort -rn過濾):

18 home run 
    2 base ball 
    1 pinch hitter 

(這是很簡單,我沒有理會編寫Python腳本它可以很容易)

在更一般的情況下,「投手投擲的球是一個彈球」這樣的句子包含了你想要過濾的跨越樹邊界的片段(比如「球投手」如果你將「the」添加到你的單詞列表中),那麼你確實需要一些語言學(或統計數字......)。

5

想想這裏大聲 - Google Books NGram Viewer已經刮掉了它的語料庫,並公佈了出現超過40次的所有[1,2,3,4,5]圖表的列表以及它們的頻率計數。所以你可以拿出你生成的每個ngram,並在Google ngram數據庫中查找它的頻率。具有更高計數的Ngram更有可能在語義上合理。

......不利的一面是,下載谷歌的整個ngram數據集就像1TB,我不知道他們是否有api。

編輯:

,如果沒有這個的API我會感到震驚。此外谷歌似乎並不在鎮上唯一的遊戲,快速搜索打開了:

+0

嗨邁克 - 這實際上非常接近我所需要的!感謝您將我轉到Microsoft的服務!快速的問題 - 如果我從200個單詞創建排列(這將是萬億個組合),然後創建一個yield函數,只在特定分數之上吐出排列,api函數是否能夠處理該請求量? – user3682157 2014-09-08 04:53:40

+0

這是一個很好的問題,我不知道。我意識到這些數據庫存在,但從未使用過它們。如果你發現你應該回到這裏,讓我知道! – 2014-09-08 14:35:33

+0

有[另一個問題](http://stackoverflow.com/questions/11260833/google-n-gram-web-api)詢問關於NGram Viewer API,答案似乎是[不,但有一個查詢方式](http://stackoverflow.com/a/11290260/786020)[Google BigQuery](https://developers.google.com/bigquery/)。在Python中,您應該可以使用[Google API](https://developers.google.com/api-client-library/python/)。 – Poik 2014-09-11 15:49:19

1

我想通了,我自己的答案與我認爲是一個非常漂亮的解決方案!它基於這篇文章:http://research.microsoft.com/en-us/um/people/jfgao/paper/webngram.sigirws.v2.pdf。這裏的想法是不創建一堆隨機垃圾排列,然後篩選它們以找到一個語義正確的垃圾排列。這個想法是首先創建語義正確的排列。這可以通過根據n-1的基本原則分階段地創建句子來實現,即單詞只在語義上依賴於前面的單詞。

因此,計劃是在相關語料庫及其頻率中查找所有成對的bigrams。頻率越高,表達語義上越正確。所以說,你有二元語法像這樣的列表顯示各10次的語料

The man 
a plan 
in Panama 
Panama City 
Man Who 
Who is 
is awesome 

從那裏您可以根據N-1級內造句。因此,您從原始列表中獲取起始關鍵字。從那裏,在您的第二個列表中找到一個雙字母,該單詞以同一單詞開頭,後跟另一個單詞並將它們附加在一起。例如,從你的原始列表中取出'THE'這個詞,並且在查看上面的語料庫之後,你現在應該把它作爲'THE THE MAN'這個詞組。用這句話沖洗並重復一遍:尋找一個遵循n-1原則的bigram,現在找到一個以'man'開頭的bigram。你現在有'人類世界衛生組織'。沖洗並重復!這應該創建在正確的順序語義上的短語(顯然你會從句子中刪除最後的重複)。

你們認爲什麼?