2015-04-06 101 views
0

我已經解析了文本並使用斯坦福解析器提取了所有名詞短語。現在我需要我解析名詞短語轉換成純文本:如何將解析的文本轉換爲純文本

輸入:

(NP (DT the) (JJ dallas) (NN country) (NN club)) 
(NP (NP (CD 25) (NN cent)) (NP (NNP bingo))) 

期待輸出:

the dallas country club 
Cd 25 cent bingo 

注:我可以清潔在包括醜陋的方式文本大量的「替換」方法。不過,我更喜歡用更專業的方式清理它,或者使用嵌入斯坦福分析器API的工具。

回答

1

無法爲斯坦福API說話,但是這可能是(相當),很容易用正則表達式來完成,如下面:

(?<=\([A-Z]+)[^\(\)]+ 

那麼這是什麼呢?

  • 首先,我們要確保我們實際想要匹配的文本前面有一個開括號,後面跟着一些大寫字母,然後是一個空格。爲此,我們使用逆序。例如,(?<=foo)bar將與「foobar」中的「bar」匹配,但不匹配「ackbar」或「bar」中的「bar」。在我們的例子中,我們使用一個轉義的開括號\(填充lookbehind,然後至少一個+大寫字母[A-Z],然後單個空格字符。因爲(在理論上 - 我再也不知道斯坦福大學的解析器是如何處理事物的)短語可以由多個單詞組成,或者可以用連字符或其他奇怪的方式標出,等等。所以我們利用反選擇器^,它匹配除了它的選擇器內的所有內容。例如,[^ABC]將匹配除大寫A,B和C以外的所有字符。因此,我們只需匹配至少一個不包含結尾括號\)+字符,該字符將匹配所有字符,直到我們敲完圓括號。
  • 在上面的項目符號中引入的一個小錯誤是,它沒有考慮嵌套的短語。匹配關閉圓括號將匹配(NP (NP (CD 25))中的(NP (CD 25,這顯然不是我們想要的。所以我們也不允許匹配開頭括號\(來解釋這一點。

一切都很好,除了Java,使得事情比他們需要的更加困難。

  • 首先,Java的回顧後解析器不喜歡未知的可能長度的lookbehinds,出於某種原因。因此,我們必須將的[A-Z]+更改爲使用長度範圍,例如, [A-Z]{2,3},它將匹配大小爲2-3個字符的字符串。 請注意,如果斯坦福分析器表示帶有大於或小於大寫字母的鍵的短語,則必須相應地調整該範圍!
  • 接下來,必須在使用前編譯Java正則表達式。所述合成的一部分是將轉義字符轉換爲字符文字。但是,這會將\(及其對應部分轉換爲文字開啓和關閉括號,正則表達式引擎會將其視爲正則表達式括號,這將導致失敗。所以在編譯之前逃脫的反斜槓本身必須被轉義,將每個\變成\\

所以我們最後的正則表達式如下:

(?<=\\([A-Z]{2,3})[^\\(\\)]+ 

然後,它可以在一些像這樣的方式被送入的Java ...

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

... 

public ArrayList<String> GetMatchesFromNLP(String text) { 
    ArrayList<String> matches = new ArrayList<String>(); 
    Matcher m = Pattern.compile("(?<=\\([A-Z]{2,3})[^\\(\\)]+").matcher(text); 
    while (m.find()) { 
    matches.add(m.group()); 
    } 
} 

...這將增加每個正則表達式匹配成ArrayList的新元素。

出於性能考慮,您可能希望將該ArrayList轉換爲某種類型的鏈接列表,具體取決於您的輸入文本的長度。

+0

感謝@Diosjenin:這種反應是非常全面和偉大。它工作得很好。唯一需要的編輯是在解析器中我們有(NP(PRP $我們))(NN經濟),所以這個解決方案將刪除(PRP $我們),這是不正確的。通過刪除所有$符號這種方法準確地工作 – user3147590

+0

@ user3147590,因爲情況是這樣的:在執行之前,不要刪除$ s,你可以添加一個轉義的$'\\ $'並在大寫字母匹配後標記爲可選的'?'。新的正則表達式將讀爲'(?<= \\ [AZ] {2,3} \\ $?)[^ \\(\\)] +',它將與「(PRP $ our)」中的「我們」相匹配 – Diosjenin

2

輸出格式由傳遞給Stanford Parser的TreePrint構造函數的formatString決定。

你得到一個是 「ONELINE」 選項:

(NP (DT the) (JJ dallas) (NN country) (NN club)) 
(NP (NP (CD 25) (NN cent)) (NP (NNP bingo))) 

你想要的是 「字」:

the dallas country club 
25 cent bingo 

按照TreePrint javadoc,已知格式是:

oneline, penn, latexTree, xmlTree, words, wordsAndTags, rootSymbolOnly, 
dependencies, typedDependencies, typedDependenciesCollapsed, collocations, 
semanticGraph, conllStyleDependencies, conll2007 

這個來自Stanford Parser homepage的例子展示瞭如何在co上設置它使用-outputFormat標誌mmand行:

java -mx200m edu.stanford.nlp.parser.lexparser.LexicalizedParser 
-retainTMPSubcategories -outputFormat "wordsAndTags,penn,typedDependencies" 
englishPCFG.ser.gz mumbai.txt 
+0

我正在使用選區解析器 – user3147590

+0

I必須查看您的代碼才能向您顯示需要設置輸出格式的位置。斯坦福分析器特別支持您所需的輸出格式,您只需知道將其設置在哪裏。 – leekaiinthesky