2009-06-23 42 views
16

我想用n-gram(最好用PHP)實現一些應用程序。N-grams:解釋+ 2應用程序


哪種類型的n-gram更適合大多數用途?一個單詞級別還是一個字符級別的n-gram?你怎麼能在PHP中實現一個n-gram-tokenizer?


首先,我想知道N-gram究竟是什麼。它是否正確?這就是我對n-gram的理解:

句子:「我住在紐約。」

字級的雙字母組(2 N):「#我」, 「我住」, 「住」, 「在紐約」, '紐約#'

人物等級的雙字母組(2 N): 「#I」,「I#」,「#1」,「li」,「iv」,「ve」,「e#」,「#i」,「in」,「n#」,「#N」, 「NY」,「Y#」

當你有這樣的陣列的n元的零件,你放棄了重複者,並添加計數器爲每個零件提供頻率:

字級別二元語法:1 ,1,1,1,1]

character level bigrams:[2,1,1,...]

這是正確的嗎?


此外,我想更多地瞭解你可以用正克做什麼:

  • 我如何識別使用正克文的語言?
  • 即使沒有雙語語料庫,是否可以使用n-gram進行機器翻譯?
  • 如何構建垃圾郵件過濾器(垃圾郵件,火腿)?將n元組和貝葉斯過濾器結合起來?
  • 我該如何做主題發現?例如:是關於籃球還是狗的文字?我的方法(用維基百科對「狗」和「籃球」的文章進行以下操作):爲兩個文檔構建n-gram矢量,對它們進行歸一化,計算曼哈頓/歐幾里德距離,結果越接近1,相似性

您如何看待我的應用程序方法,特別是最後一個?


我希望你能幫助我。提前致謝!

+0

有一個PHP庫可以幫助您:https://packagist.org/packages/drupol/phpngrams – 2018-02-05 20:54:07

回答

23

對於您提到的大多數文本分析應用程序來說,字n-gram通常會更有用,可能除了語言檢測之外,其中類似字符trigrams可能會提供更好的結果。實際上,您可以爲每種您感興趣的語言中的文本語料庫創建n-gram向量,然後將每個語料庫中的卦的頻率與您正在分類的文檔中的卦進行比較。例如,英語中的trigram the可能比德語更頻繁地出現,並且會提供某種程度的統計相關性。一旦你的文檔採用n-gram格式,你可以選擇許多算法進行進一步分析,貝葉斯濾波器,N-最近鄰,支持向量機等。

在你提到的應用中,機器翻譯是可能是最牽強的,因爲n-grams本身不會讓你走得很遠。將輸入文件轉換爲n-gram表示只是將數據轉換爲進一步特徵分析的格式的一種方式,但由於您丟失了大量上下文信息,因此轉換可能無用。

需要注意的一件事是,僅爲一個文檔創建一個矢量[1,1,1,2,1]而爲另一個文檔創建一個矢量[2,1,2,4]是不夠的文件,如果尺寸不匹配。也就是說,向量中的第一個條目不能在一個文檔中爲the,在另一個文檔中不能爲is,否則算法將不起作用。由於大多數文檔不包含您感興趣的大多數n-gram,因此您將結束使用[0,0,0,0,1,1,0,0,2,0,0,1]這樣的向量。 '功能'是必不可少的,它需要你'提前'決定你將在分析中包含哪些ngram。通常,這是作爲一個兩遍算法實現的,首先決定各種n-gram的統計顯着性來決定保留什麼。谷歌'功能選擇'瞭解更多信息。

基於詞的n-gram加上支持向量機的一個很好的方式來進行的話題斑點,但你需要「在主題」大語料庫文本預處理的分成和「題外話」訓練分類。您將在如citeseerx這樣的網站上找到大量研究論文來解釋此問題的各種方法。我不會推薦使用歐氏距離方法解決這個問題,因爲它不會根據統計顯着性來衡量單個n-gram,因此兩個包含the,a,isof的文檔將被認爲比兩個文檔都包括Baysian。從您感興趣的n-gram中刪除停用詞可以有所改善。

+0

非常感謝你這個詳細的答案!我還有最後一個問題:向量的n-gram與簡單詞的優點是什麼?我的意思是: 爲什麼要將「我住在紐約」分爲「我住,住在紐約」而不是簡單的「我住在紐約州」? – caw 2009-06-23 13:23:45

2

你對n-grams的定義是正確的。

您可以對搜索類型應用程序使用字級n-gram。字符級別的n-gram可以更多地用於文本本身的分析。例如,爲了識別文本的語言,我將使用字母的頻率與語言的既定頻率進行比較。也就是說,文本應該與該語言中字母出現的頻率大致相符。

在PHP話

n元標記生成器可以做到使用的strtok:

http://us2.php.net/manual/en/function.strtok.php

對於用字符分割:

http://us2.php.net/manual/en/function.str-split.php

然後你就可以在陣列剛剛拆分爲你想要任意數量的n-gram。

貝葉斯過濾器需要被訓練用作垃圾郵件過濾器,它可以與n-gram結合使用。然而,你需要給它大量的輸入才能學習。

就學習頁面的上下文而言,您最後的做法聽起來不錯......但這仍然相當困難,但n-gram聽起來像是一個很好的起點。

+0

謝謝。我認爲strtok對於好的標記化來說太簡單了,因爲你必須添加很多標記,如空格,逗號,點,下劃線,括號等等。但是第一段,用例真的很有用。謝謝! :) – caw 2009-06-23 17:01:47