[英]Regular expression to parse word structure
我正在嘗試構建我的第一個非平凡的正則表達式(用於Python),但正在努力。
讓我們假設語言X(不是英語)中的單詞是最小“結構”的序列。 每個'結構'可以是:
An independent vowel (basically one letter of the alphabet)
A consonant (one letter of the alphabet)
A consonant followed by a right-attaching vowel
A left-attaching vowel followed by a consonant
(Certain left-attaching vowels) followed by a consonant followed by (certain right-attaching vowels)
例如,這個3個字的單詞:
<a consonant><a left-attaching vowel><an independent vowel>
不是一個有效的單詞,並且不應該與正則表達式匹配,因為左附加元音的右邊沒有輔音。
我知道所有Unicode范圍 - 輔音,獨立元音,左連元音等的Unicode范圍。
這是我到目前為止:
WordPattern = (
ur'('
ur'[\u0985-\u0994]|'
ur'[\u0995-\u09B9]|'
ur'[\u0995-\u09B9(\u09BE|[\u09C0-\u09C4])]|'
ur'[(\u09BF|\u09C7|\u09C8)\u0995-\u09B9]|'
ur'[(\u09BF|\u09C7|\u09C8)\u0995-\u09B9(\u09BE|[\u09C0-\u09C4])]'
ur')+'
)
它不起作用。 除了讓它工作,我有三個具體問題:
任何幫助,將不勝感激。 這對初學者來說似乎非常復雜!
用於具有非平凡形態的語言的形態分析的適當工具是“有限狀態傳感器”。 您可以跟蹤和使用強大的實現(一個由Xerox Parc提供)。 有一個有python綁定(用作外部庫)。 谷歌一下。
FST基於有限狀態自動機,如(純)正則表達式,但它們絕不是替代品。 這是復雜的機器,所以如果你的目標很簡單(例如,用於連字的音節),你可能想要尋找更簡單的東西。 例如,有機器學習算法將“學習”連字符。 如果您確實對形態分析感興趣,那么您必須努力查看FST。
現在對於你的算法,如果你真的只需要一個簡單的實現:由於任何元音或輔音可以是獨立的,你的規則是模糊的:它們允許“ab”被解析為“ab”。 這種模糊性意味着regexp方法可能永遠不會起作用,但是如果你把較長的regexp放在第一位,你可能會得到更好的結果,因此當它們都適用時,它們會優先於短的regexp。 但實際上你需要構建一個解析器(手動或使用模塊)並逐步嘗試不同的東西。 它與你想象的相反:設置一個使用不同正則表達式的循環,並逐步“消耗”字符串。
然而,在我看來,你所描述的基本上是音節化。 並且近似普遍的音節規則是這樣的:一個音節由一個核心元音組成,加上許多先前(“起始”)輔音,如語言允許的規則,加上任何不屬於下一個音節的輔音。 該規則被稱為“最大化開始”,其結果是更容易向后解析您的音節(從單詞的結尾)。 試試看。
PS。 您可能知道這一點,但如果您將以下內容作為腳本中的第二行,則可以將孟加拉語嵌入到正則表達式中:
# -*- coding: utf-8 -*-
編譯正則表達式時使用re.VERBOSE
標志。
pattern = re.compile(r"""(
[\u0985-\u0994] # comment to explain what this is
| [\u0995-\u09B9]
# etc.
)
""", re.VERBOSE)
您可以從普通的Python字符串構造RE:
>>> subpatterns = {"vowel": "[aeiou]", "consonant": "[^aeiou]"}
>>> "{consonant}{vowel}+{consonant}*".format(**subpatterns)
'[^aeiou][aeiou]+[^aeiou]*'
我不確定我是否理解你的意思,但是......假設你有一個(未編譯的)RE列表,比如patterns
,那么你可以用它來計算它們的聯合
re.compile("(%s)" % "|".join(patterns))
在以這種方式構造RE時要小心特殊字符,並在必要時使用re.escape
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.