我想在python中洗掉標記化文本中的標點符號,就像這樣:
word_tokens = ntlk.tokenize(text)
w = word_tokens
for e in word_tokens:
if e in punctuation_marks:
w.remove(e)
這在一定程度上起了作用,我設法洗掉了很多標點符號,但由于某些原因,word_tokens中的很多標點符號仍然被留下。 如果我再次運行這段代碼,它又會洗掉一些標點符號。運行同樣的代碼3次后,所有的標記都被洗掉了。為什么會發生這種情況?
不管 punctuation_marks 是一個串列、一個字串還是一個字典,似乎都不重要。我也試著在word_tokens.copy()上進行迭代,這樣做會好一點,第一次幾乎洗掉了所有的標記,第二次則是全部。 是否有一個簡單的方法來解決這個問題,以便只運行一次代碼就可以了?
uj5u.com熱心網友回復:
你正在從你正在迭代的同一個串列中洗掉元素。看起來你已經意識到了這個潛在的問題,這就是為什么你添加了這一行:
w = word_tt.
w = word_tokens
然而,這一行實際上并沒有為 word_tokens 所參考的物件創建一個副本,它只是讓 w 參考了同一個物件。為了創建一個副本,你可以使用切片運算子,將上面這一行替換成:
w = word_tokens[:]
uj5u.com熱心網友回復:
為什么不添加不是標點符號的標記來代替呢?
word_tokens = ntlk.tokenize(text)
w = list()
for e in word_tokens:
if e not in punctuation_marks:
w.append(e)
建議。 我看到你正在創建單詞令牌。如果是這樣的話,我建議你在對文本進行標記之前洗掉標點符號。你可以使用已經存在的翻譯功能(在字串庫下)。
# import the library。
import string
# Initialize the translate to remove punctuations[/span]。
tr = str.maketrans("", "", string.p punctuation)
# 移除標點符號# Get the word tokens[/span]。
word_tokens = ntlk.tokenize(text)
如果你想進行句子標記化,那么你可以像下面這樣做:
from nltk.tokenize import sent_tokenize
texts = sent_tokenize(text)
for i in range(0, len(text))
texts[i] = texts[i].translate(tr)
uj5u.com熱心網友回復:
我建議你試試regex,并將你的結果追加到一個新的串列中,而不是直接操作word_tokens的一個:
word_tokens = ntlk.tokenize(text)
w_ = list()
for e in word_tokens:
w_.append(re.sub('[. !?-]', e))
uj5u.com熱心網友回復:
你正在修改實際的word_tokens,這是錯誤的。
例如,假設你有類似A?!B的東西,它被索引為。A:0, ?:1, !:2, B:3。你的for回圈有一個計數器(例如i),在每個回圈中都會增加。假設你洗掉了?(意思是i=1),使得陣列的索引回移(新的索引是:A:0, !:1, B:2),你的計數器會增加(i=2)。所以你在這里錯過了!字符!
最好不要搞亂原來的字串,直接復制到一個新的字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/312051.html
標籤:
