簡體   English   中英

將文本轉換為單詞表時,如何保留法語特殊字符?

[英]How can I preserve the French special characters when transforming a text into a wordlist?

我正在為markov鏈語句生成器使用一小段代碼。 使用英語工作正常,但是使用法語時,不會打印出特殊字符(é,è等)。

這是讀取文件並從中創建單詞表的部分。 我將打印語句用作控件,這使我可以看到print(text)打印特殊字符,但是將單詞添加到單詞列表后,它們便消失了。

def wordlist(filename):
    f = open(filename, mode='r')
    text = f.read()
    print(text)
    wordlist = [fixCaps(w) for w in re.findall(r"[\w']+|[.,!?;]", text)]
    print(wordlist)
    f.close()
    return wordlist

創建單詞列表時如何保留特殊字符? (我正在Windows 7上使用Python 2.x運行它)

輸出示例:

Permettez-moi d'inscrire votre nom en tête de ce livre et au-
dessus même de sa dédicace; car c'est à vous, surtout, que j'en
dois la publication. En passant par votre magnifique plaidoirie,
mon oeuvre a acquis pour moi-même comme une autorité imprévue.
Acceptez donc ici l'hommage de ma gratitude, qui, si grande
qu'elle puisse être, ne sera jamais à la hauteur de votre
éloquence et de votre dévouement.
['Permettez', 'moi', "d'inscrire", 'votre', 'nom', 'en', 't', 'te', 'de', 'ce', 'livre', 'et', 'au', 'dessus', 'm', 'me', 'de', 'sa', 'd', 'dicace', ';', 'car', "c'est", 'vous', ',', 'surtout', ',', 'que', "j'en", 'dois', 'la', 'publication', '.', 'En', 'passant', 'par', 'votre', 'magnifique', 'plaidoirie', ',', 'mon', 'oeuvre', 'a', 'acquis', 'pour', 'moi', 'm', 'me', 'comme', 'une', 'autorit', 'impr', 'vue', '.', 'Acceptez', 'donc', 'ici', "l'hommage", 'de', 'ma', 'gratitude', ',', 'qui', ',', 'si', 'grande', "qu'elle", 'puisse', 'tre', ',', 'ne', 'sera', 'jamais', 'la', 'hauteur', 'de', 'votre', 'loquence', 'et', 'de', 'votre', 'd', 'vouement', '.']
En passant par votre magnifique plaidoirie, mon oeuvre a acquis pour moi m me comme une autorit impr vue.

謝謝

這些單詞實際上並沒有消失,只是與您的表達式不匹配:

wordlist = [fixCaps(w) for w in re.findall(r"[\w']+|[.,!?;]", text)]

轉義符\\w與“單詞字符”匹配,但是對於“單詞字符”實際含義的解釋因GREP實現而異:

\\w代表“文字字符”。 它始終與ASCII字符[A-Za-z0-9_]匹配。 請注意包含下划線和數字。 在大多數支持Unicode的版本中, \\w包含許多其他腳本中的字符。 關於實際包含哪些字符有很多不一致之處。
https://www.regular-expressions.info/shorthand.html

默認情況下,Python 2.7的\\w 匹配基本的受限集,但是您可以添加標志以要求更多:

\\w
如果未指定LOCALEUNICODE標志,則匹配任何字母數字字符和下划線; 這等效於集合[a-zA-Z0-9_] 使用LOCALE ,它將匹配集合[0-9_]以及當前語言環境定義為字母數字的任何字符。 如果設置了UNICODE ,它將匹配字符[0-9_]以及Unicode字符屬性數據庫中分類為字母數字的任何字符。
https://docs.python.org/2/library/re.html

這建議使用以下代碼(經過微調以不使用文件;正則表達式起作用):

def wordlist(text):
    regex = re.compile (r"[\w']+|[.,!?;]", re.UNICODE)
    print(text)
    wordlist = [fixCaps(w) for w in re.findall(regex, text)]
    return wordlist

確實包括重音符號:

['Permettez', 'moi', "d'inscrire", 'votre', 'nom', 'en', 't\xc3\xaate', 'de', 'ce', 'livre',
 'et', 'au', 'dessus', 'm\xc3\xaame', 'de', 'sa', 'd\xc3', 'dicace', ';', 'car', "c'est",
...
# etc.

Python 3及更高版本具有更好的Unicode支持,因此您不必使用該標志,並且原始代碼可以與\\w

['Permettez', 'moi', "d'inscrire", 'votre', 'nom', 'en', 'tête', 'de',
 'ce', 'livre', 'et', 'au', 'dessus', 'même', 'de', 'sa', 'dédicace', ';',
   ...

). (額外的好處是重音字符不會輸出為\\x )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM