2012-05-08 29 views
6

假設我有一個字符串text = "A compiler translates code from a source language"。我希望做兩件事情:如何遍歷Python中的字符串的句子?

  1. 我需要通過每個字進行迭代,並使用NLTK庫幹。阻止的功能是PorterStemmer().stem_word(word)。我們必須通過「單詞」這個論點。我怎樣才能解決每個單詞並找回句子?

  2. 我需要從text字符串中刪除某些停用詞。包含停用詞列表存儲在一個文本文件(空格分隔)

    stopwordsfile = open('c:/stopwordlist.txt','r+') 
    stopwordslist=stopwordsfile.read() 
    

    如何從text刪除那些停止詞,並得到一個乾淨的新字符串?

+0

'一個字text.split(''):stemmer.stem_word(word)'? – birryree

+0

stemmed = for word in text.split(''):stemmer.stem_word(word)這個工作嗎? – ChamingaD

+1

不完全。如果你想要一個詞幹的列表,你可以在'text.split('')]'中做'stemmed = [stemmer.stem_word(w)]。如果你想要一個句子,你可以做'sente =''.join(stemmed)',這將返回所有詞幹的句子。讓我知道這是否有幫助。 – birryree

回答

9

我張貼這是一個評論,但認爲我還不如充實它與一些解釋一個完整的答案:

你想用str.split()分割字符串轉換成單詞,然後幹每個字:

for word in text.split(" "): 
    PorterStemmer().stem_word(word) 

當你想要得到的所有的梗單詞串起來,是微不足道的,然後加入這些莖一起回來。要做到這一點很容易和高效,我們使用str.join()generator expression

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ")) 

編輯:

您的其他問題:

with open("/path/to/file.txt") as f: 
    words = set(f) 

在這裏,我們打開使用the with statement(這是最好的文件打開文件的方式,因爲它可以正確地關閉它們,即使是在異常情況下也是如此,並且更具可讀性),並將內容讀取到一個集合中。我們使用一個集合,因爲我們不關心這些單詞的順序或重複,並且以後會更有效率。我假設每行有一個字 - 如果不是這種情況,並且它們用逗號分隔,或者使用str.split()(與適當的參數一起使用str.split())分隔的空格可能是一個很好的計劃。

stems = (PorterStemmer().stem_word(word) for word in text.split(" ")) 
" ".join(stem for stem in stems if stem not in words) 

這裏我們使用生成器表達式的if子句來忽略從文件中加載的單詞集中的單詞。一個集合上的成員資格檢查是O(1),所以這應該是相對有效的。

編輯2:

要刪除的話,他們是朵朵之前,這是更簡單:

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ") if word not in words) 

去除給定的話很簡單:

filtered_words = [word for word in unfiltered_words if not in set_of_words_to_filter] 
+0

我需要做另一件事。從該字符串中刪除停用詞。 stopwordsfile = open('c:/stopwordlist.txt','r +') stopwordslist = stopwordsfile.read() 我需要從文本中刪除那些停用詞'並得到清理新的字符串。 – ChamingaD

+0

@ChamingaD我會建議這是一個不同的問題,你應該打開一個新的問題。如果你這樣做,將來對於其他人來說會有更多的幫助,並且會更容易與我們合作。 –

+0

問題是我必須再等20分鐘才能開始新的問題:/ – ChamingaD

4

要經過的每個單詞在字符串中

for word in text.split(): 
    PorterStemmer().stem_word(word) 

使用字符串的連接方法(通過Lattyware推薦)來連接件一個大的字符串。

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ")) 
+2

這個問題確實詢問'並得到一個阻止句子'答案將是'「.join(PorterStemmer()。stem_word(word)for text.split(」「))''。 –