2011-01-17 40 views
5

Tôi có một danh sách chứa nhiều câu. Tôi muốn lặp qua danh sách, hoặc bỏ ra khỏi tất cả các câu từ như "và", "the", "a", "là", vvXóa tất cả các bài viết, từ kết nối, v.v., từ một chuỗi trong Python

Tôi cố gắng này:

def removearticles(text): 


articles = {'a': '', 'an':'', 'and':'', 'the':''} 
for i, j in articles.iteritems(): 
    text = text.replace(i, j) 
return text 

Như bạn có thể có thể nói, tuy nhiên, điều này sẽ loại bỏ "a" và "an" khi nó xuất hiện ở giữa từ. Tôi cần phải loại bỏ chỉ các trường hợp của các từ khi chúng được giới hạn bởi không gian trống, và không phải khi chúng nằm trong một từ. Cách hiệu quả nhất để thực hiện điều này là gì?

Trả lời

6

tôi sẽ đi cho regex, một cái gì đó như:

def removearticles(text): 
    re.sub('(\s+)(a|an|and|the)(\s+)', '\1\3', text) 

hoặc nếu bạn muốn loại bỏ các khoảng trắng hàng đầu cũng như:

def removearticles(text): 
    re.sub('\s+(a|an|and|the)(\s+)', '\2', text) 
+0

Tuyệt vời! Tôi biết ai đó sẽ gửi regex làm giải pháp. Tôi sợ tôi là một người nghiệp dư. Bạn có biết bất kỳ hướng dẫn/tham chiếu regex nào tốt không? – Parseltongue

+1

Có một hướng dẫn [ở đây] (http://www.regular-expressions.info/tutorialcnt.html), tôi đã không làm tất cả vì vậy tôi không chắc chắn như thế nào tốt nó là mặc dù. Công cụ chính tôi sử dụng để thiết kế regex là [My Regex Tester] (http://www.myregextester.com), giúp bạn dễ dàng biết được tại sao và tại sao mọi thứ lại phù hợp. – Nemo157

+0

Làm chủ các cụm từ thông dụng (bởi Friedl, quán rượu O'reilly) đáng để sở hữu. http://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/0596528124/ –

1

Hãy thử một cái gì đó dọc theo dòng của

articles = ['and', 'a'] 
newText = '' 
for word in text.split(' '): 
    if word not in articles: 
     newText += word+' ' 
return newText[:-1] 
+0

Cho rằng tôi không quen thuộc với regex, tôi đã nghĩ đến việc giải quyết vấn đề theo cùng một cách! Cảm ơn bạn. – Parseltongue

+0

Không sao, :). – erbridge

0

Có thể thực hiện bằng cách sử dụng regex. Lặp lại thông qua các chuỗi của bạn hoặc ('' .join danh sách và gửi nó như là một chuỗi) để regex sau đây.

>>> import re 
>>> rx = re.compile(r'\ban\b|\bthe\b|\band\b|\ba\b') 
>>> rx.sub(' ','a line with lots of an the and a baad') 
' line with lots of   baad' 
1
def removearticles(text): 


articles = {'a': '', 'an':'', 'and':'', 'the':''} 
rest = [] 
for word in text.split(): 
    if word not in articles: 
     rest.append(word) 
return ' '.join(rest) 

in điều hành của dict chạy nhanh hơn so với danh sách.

+0

Điều này có chạy nhanh hơn regex không? – Parseltongue

+0

@ParseItongue Tôi chỉ kiểm tra phương pháp và giải pháp regex được cung cấp bởi Senthil Kumaran. Với mô đun Timer, tôi xử lý tệp tin NEWS.txt được cài đặt với Python2.6 là 118kb. Cả hai phương pháp chạy 1000 lần, phương pháp của tôi là nhanh hơn một chút, khoảng 2 giây trong máy tính của tôi, hơn là regex. Cả hai phương pháp phương pháp là đủ tốt, đưa bất cứ ai bạn thích :) – xiaowl

3

Điều này trông giống như một công việc NLP hơn là một cái gì đó bạn sẽ làm với regex thẳng. Tôi sẽ kiểm tra NLTK (http://www.nltk.org/) IIRC nó đi kèm với một kho chứa đầy các từ phụ như những người bạn đang cố gắng để thoát khỏi.

Các vấn đề liên quan