2016-03-01 82 views
2

我試圖通過刪除非拉丁字符+ [!?., ]來減少在線文本的一些複雜性。大多數字符可以沒有問題地刪除,但他們中的一些我想具體的規則:將句子替換爲句子

對的(),對"(引號)或一對*應任何文本轉換裏面他們一個句子,如果它包含兩個以上的單詞。通過轉換成一句話,我只想在最後加上句號。例如:

but *after* I came up with it, I searched and... 

but after I came up with it, I searched and... 

在這裏,我只是想在*刪除,而不是:

*buys airplane ticket* IM COMING FOR YOU 

buys airplane ticket. IM COMING FOR YOU 

所以在第一個例子,作者簡重點放在作爲該句子一部分的單詞上,在第二個例子中,作者描述了一個單獨的句子。這與引號相似,其中一個單詞通常是某種強調或諷刺,而多個單詞是引語。

有沒有辦法在正則表達式(Java)中做到這一點?

編輯: 所以我的一般方法需要2種模式,每種情況下的對照,引號和*。第一步是通過運行替換\*((\w+)+\w+)\*$1.來處理多字,然後將所有*全部替換爲空。這有效,但我需要6個正則表達式調用。有沒有更好的辦法?

+0

你的例子都替換所有' *'秒。 – Mena

+0

不,第二個例子用最後一個'*'的位置替換一對\ * – Limon

+2

簡單的回答:是的。分享你的研究有助於每個人告訴我們你試過了什麼,以及它爲什麼不符合你的需求。這表明你已經花時間去嘗試幫助自己,它使我們避免重申明顯的答案,最重要的是它可以幫助你得到更具體和相關的答案!另見[問]。請記住** SO不是免費的代碼服務!** –

回答

2

標準Java庫沒有關於完整英文短語的內置概念(告訴空格除了字母或標點符號,只要它能幫助您)。此外,

  • 沒有正則表達式可以正確解析英文。正則表達式不能很好地嵌套。
  • 您可能會使用語法檢查器(如常用文字處理軟件中內置的語法檢查器)運氣。但是,他們仍然有顯着的錯誤率。
  • 雖然可能存在實現健壯分析的NLP Java庫,但它們仍不會理解上下文,並且會頻繁失敗。

所以,不,你不能這樣做與Java,或與任何其他編程語言(除非你有龐大的資源,NLP的經驗和訓練庫從建) - 除非你顯著放鬆的檢測要求「一個字符序列是否可以是一個獨立的英語句子「

+0

是的,我知道,我的方法在理解語言的意義上並不完美,但它的算法非常漂亮我認爲作品*夠好*我的問題是如果有一個有效的方法來實現我描述的算法 – Limon

0

所以我目前最好的方法需要2種* numCases模式,看起來像這樣:

static Pattern pattern = Pattern.compile("\\*((\\w+)+\\w+)\\*"); 
static Pattern remove = Pattern.compile("\\*"); 

public static String transform(String str) { 
    String sentences = pattern.matcher(str).replaceAll("$1."); 
    return remove.matcher(sentences).replaceAll(""); 
} 

運行

System.out.println(transform("but *after* I came up with it, I searched and...")); 
System.out.println(transform("*buys airplane ticket* IM COMING FOR YOU")); 

給出的預期

but after I came up with it, I searched and... 
buys airplane ticket. IM COMING FOR YOU 
+1

如果這不是一個解決方案,而是將它包括在你的問題比作爲一個答案:) –

+0

@bobblebubble好的,謝謝。由於它是* a *解決方案,所以不知道該把它放在哪裏,只是不是很好。所以如果沒有人發佈更好的東西,我將不得不回到這一個。 – Limon