2012-12-10 39 views
-1

我正在使用Python NLTK庫在大語料庫上執行詞幹。我正在做以下操作是否有任何第三方工具可用於在Python中執行詞幹

text = [porter.stem(token) for token in text.split()] 
text = ' '.join(text) 

「text」代表我的文件的一行。我的文件中有數百萬行,並且這個過程花費了大量的時間。我只想問,有沒有更好的方法來做這個操作?

+1

你能提供更多信息嗎?關於你的代碼,唯一能說的就是'text =''.join(對於text.split()中token的porter.stem(token))'可能會快一點,但它不會大大增加效率。如果沒有整個循環,我們不能說「數百萬行是大量數據,這意味着大量的處理時間」。 – Bakuriu

+0

嗨!謝謝!回覆。你需要什麼信息? – Sangeeta

+1

你說「文本」只是一條線,而你正在處理數百萬行,那麼你能說明整個過程是如何完成的嗎?是的,的確,通常優化循環內的部件會更好(因爲它們會執行更多次),但在這種情況下,您無法做得更好,因此您應該嘗試優化循環的其他部分。 – Bakuriu

回答

1

「數以百萬計」有多少,以及「大量時間」有多長?波特詞幹不是一個複雜的算法,應該是相當快的。我懷疑你是I/O有限而不是其他任何東西。儘管如此,你可以嘗試一些改進。

如果順序不重要,並且不需要每個詞幹的每個副本,則可能會發現使用詞典和/或集合來存儲詞幹更簡單(並且更具有內存效率)。這樣可以避免需要干擾您已經看到的詞語,這可以提高性能,並將每個詞幹存儲一次。

例如:

seenwords = set() 
seenstems = set() 

for line in input_file: 
    line = line.lower().split() 
    seenstems.union(porter.stem(token) for token in line if token not in seenwords) 
    seenwords.union(line) 

這可以遏制的話不止一次如果他們是在同一行,但對後續行,他們將不再需要加以遏制下去。您也可以逐個處理這些單詞,這樣可以避免在同一行中多次使用這些單詞,但是在使用生成器表達式而非for循環時會有一些速度優勢。

+0

好的!謝謝!我會試試這個。 – Sangeeta

相關問題