簡體   English   中英

為什么停用詞不會在我的程序中被過濾

[英]Why the stopwords won't be filtered in my program

我主要使用 NLTK 的停用詞列表,就像代碼顯示的那樣

from nltk.corpus import stopwords`
stopword_nltk=stopwords.words('french')
motoutil=['après', 'avant', 'avex', 'chez', '\ba\b', 'et', 'concernant', 'contre', 'dans', 'depuis', 'derrière', 'dès', 'devant', 'durant', 'en', 'entre', 'envers', 'hormis', 'hors', 'jusque', 'malgré', 'moyennant', 'nonobstant', 'outre', 'par', 'parmi pendant', 'pour', 'près', 'sans', 'sauf', 'selon', 'sous', 'suivant', 'sur', 'touchant', 'vers', 'via', 'tout','tous', 'toute', 'toutes', 'jusqu']
stopwords_list=stopword_nltk+motoutil

並不是因為我向 stopword_nltk 添加了另一個列表,所以該程序不能滿足我的需要。 即使我刪除了 motoutil,它也不起作用。

這是我計划刪除停用詞的部分:

for line in f_in.readlines():
    new_line=re.sub('\W',' ', line.lower())
    list_word=new_line.split()
    for element in list_word:
        if element in stopwords_list:
            cleaned_line=re.sub(element, ' ', new_line)
            f_out_trameur.write(cleaned_line)
            f_out_cleaned.write(cleaned_line)

它有兩個問題:

首先,列出的停用詞不會全部刪除,例如“et”。

其次,我還想刪除單詞“de”和“ce”,但不刪除單詞中間的兩個部分。 例如,在摘錄“madame monsieur le président de l'assemblée nationale”中,president 一詞前面的 de 應該被清除,但 président 一詞中的“de”不應該被清除,在我的實際腳本中,president 將是“prési nt” “

我是否正確地看到您正在內部循環中創建和編寫已清理的行,該循環遍歷由new_line.split()生成的行中的標記? 如果沒有發現要清理的東西,它根本就沒有寫?

這將導致包含停用詞的行的多個版本(每個版本都刪除了停用詞),而不包含停用詞的行將被跳過。

我的建議是,因為您已經有了標記(您使用了split() ),所以您只需使用它們來編寫新行而不是替換新行中的標記。

這也允許您將停用詞列表轉換為一個集合,並使檢查if element in stopwords_list更快,因為這通常是一個很大的列表,並且對於大量單詞可能會變慢。 在使用 NLTK 停用詞時,這幾乎總是一種加快速度的好方法。

我還建議使用列表理解來避免過多的嵌套循環和條件並使其更具可讀性,但這只是個人偏好。

from nltk.corpus import stopwords
stopword_nltk=stopwords.words('french')
motoutil=['après', 'avant', 'avex', 'chez', '\ba\b', 'et', 'concernant', 'contre', 'dans', 'depuis', 'derrière', 'dès', 'devant', 'durant', 'en', 'entre', 'envers', 'hormis', 'hors', 'jusque', 'malgré', 'moyennant', 'nonobstant', 'outre', 'par', 'parmi pendant', 'pour', 'près', 'sans', 'sauf', 'selon', 'sous', 'suivant', 'sur', 'touchant', 'vers', 'via', 'tout','tous', 'toute', 'toutes', 'jusqu']
stopwords_set=set(stopword_nltk+motoutil)

for line in f_in.readlines():
    new_line = re.sub('\W',' ', line.lower())
    list_word = [word for word in new_line.split() if word not in stopwords_set]
    cleaned_line = ' '.join(list_word)
    f_out_trameur.write(cleaned_line)
    f_out_cleaned.write(cleaned_line)

請注意, write()不會添加換行符\n ,因此您可能必須添加此( f_out_trameur.write(cleaned_line+'\n')f_out_cleaned.write(cleaned_line+'\n') ),具體取決於您想要的方式output 文件來看。

暫無
暫無

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

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