我想創建一個非常簡單的非英語單詞識別腳本,<FOREIGN>如果該單詞包含任何特定的非英語字符,它將用標簽替換文本中的每個單詞。為此,我使用了該.isascii()方法。
我有以下示例字串:
s = "abc def déf ??ü ?????? ?? - 1 2 3 4 5"
以下是預期的輸出:
s_exp = "abc def <FOREIGN> <FOREIGN> <FOREIGN> <FOREIGN> - 1 2 3 4 5"
我目前的作業實施是:
import re
for word in s.split():
if not word.isascii():
s = re.sub(word, "<FOREIGN>", s)
雖然這對于少量資料非常有效,但我擔心它在 Pandas 資料幀中組織的 100,000 行文本資料上的性能。我想知道是否有任何解決方案可能比這個 for 回圈性能更好。目前,我正在使用
df['Text'].apply(lambda x: replace_nonenglish(x))wherereplace_nonenglish是:
def replace_nonenglish(s):
for word in s.split():
if not word.isascii():
s = re.sub(word, "<FOREIGN>", s)
return s
筆記:
我完全意識到這會提供一堆假陰性,即未標記為<FOREIGN>諸如法語“bien”或德語“gut”之類的非英語單詞,但目前這是可以接受的。
uj5u.com熱心網友回復:
你也可以使用
import re
s = "abc def déf ??ü ?????? ?? - 1 2 3 4 5"
print( re.sub(r"\b[a-zA-Z]*[^\W\d_a-zA-Z][^\W\d_]*\b", "<FOREIGN>", s) )
# => abc def <FOREIGN> <FOREIGN> <FOREIGN> <FOREIGN> - 1 2 3 4 5
請參閱Python 演示和正則運算式演示。
詳情:
\b- 一個單詞邊界(默認情況下在 Python 中它是 Unicode 感知的)[a-zA-Z]*- 零個或多個 ASCII 字母[^\W\d_a-zA-Z]- 任何 Unicode 字母,但一個 ASCII 字母[^\W\d_]*- 零個或多個 Unicode 字母\b- 一個詞的邊界。
使用 PyPi 正則運算式庫(pip install regex在終端/控制臺視窗中安裝),它看起來會更干凈一些:
import regex
s = "abc def déf ??ü ?????? ?? - 1 2 3 4 5"
print( regex.sub(r"\b[a-zA-Z]*[^\P{L}a-zA-Z]\p{L}*\b", "<FOREIGN>", s) )
請參閱此 Python 演示。在這里,\p{L}匹配任何 Unicode 字母并\P{L}匹配除 Unicode 字母之外的任何字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/401065.html
下一篇:在R中洗掉2個向量的部分重疊部分
