2010-08-06 16 views
5

tôi có:Trích xuất một tập hợp các từ với Python/NLTK, sau đó so sánh nó với một cuốn từ điển tiếng Anh chuẩn

from __future__ import division 
import nltk, re, pprint 
f = open('/home/a/Desktop/Projects/FinnegansWake/JamesJoyce-FinnegansWake.txt') 
raw = f.read() 
tokens = nltk.wordpunct_tokenize(raw) 
text = nltk.Text(tokens) 
words = [w.lower() for w in text] 

f2 = open('/home/a/Desktop/Projects/FinnegansWake/catted-several-long-Russian-novels-and-the-NYT.txt') 
englishraw = f2.read() 
englishtokens = nltk.wordpunct_tokenize(englishraw) 
englishtext = nltk.Text(englishtokens) 
englishwords = [w.lower() for w in englishwords] 

mà là trực tiếp từ hướng dẫn NLTK. Những gì tôi muốn làm tiếp theo là so sánh vocab với một tập hợp đầy đủ các từ tiếng Anh, như OED, và trích xuất sự khác biệt - tập hợp các từ Finnegans Wake mà không có, và có lẽ sẽ không bao giờ, được trong OED. Tôi là một người nói nhiều hơn một người theo định hướng toán học, vì vậy tôi chưa tìm ra cách để làm điều đó, và hướng dẫn đi vào chi tiết quá nhiều về những thứ tôi không thực sự muốn làm. Tôi cho rằng đó chỉ là một hoặc hai dòng mã nữa.

+0

Nhân tiện, làm cách nào để định dạng trăn trong câu hỏi với các đánh dấu, vì nó sẽ xuất hiện trong trình soạn thảo văn bản? – magnetar

+0

Thụt lề tất cả. Tự động hoàn tất nếu bạn đánh dấu nó và nhấp vào nút có các nút và số 0 phía trên trình chỉnh sửa. – katrielalex

+0

Ồ, và mã của bạn không hiệu quả nhất ... bạn có thể sử dụng một cách khôn ngoan các vòng lặp để lưu nhiều lần. – katrielalex

Trả lời

4

Nếu từ điển tiếng Anh của bạn thực sự là một tập hợp (hy vọng các từ lowercased),

set(vocab) - english_dictionary 

mang đến cho bạn những bộ lời mà này nằm trong bộ vocab nhưng không phải trong english_dictionary một. (Thật đáng tiếc là bạn đã biến vocab thành danh sách theo đó sorted, vì bạn cần phải biến nó trở lại thành một bộ để thực hiện các hoạt động như sự khác biệt này!).

Nếu từ điển tiếng Anh của bạn là trong một số định dạng khác nhau, chứ không phải thực sự là một bộ hay không bao gồm duy nhất của lời lowercased, bạn sẽ phải cho chúng tôi biết định dạng mà là để chúng tôi có thể giúp đỡ -!)

Sửa: trao của OP chỉnh sửa cho thấy rằng cả hai words (trước đây được gọi là vocab) và englishwords (những gì tôi trước đây gọi là english_dictionary) là trong danh sách thực tế của từ lowercased, sau đó

newwords = set(words) - set(englishwords) 

hoặc

newwords = set(words).difference(englishwords) 

là hai cách để diễn tả "tập hợp các từ không phải là từ tiếng anh". Trước đây là ngắn gọn hơn một chút, sau này có thể dễ đọc hơn một chút (vì nó sử dụng từ "khác biệt" một cách rõ ràng, thay vì dấu trừ) và có lẽ hiệu quả hơn một chút (vì nó không biến đổi rõ ràng danh sách englishwords thành thiết lập - mặc dù, nếu tốc độ là rất quan trọng này cần phải được kiểm tra bằng cách đo lường, vì "nội bộ" difference vẫn cần phải làm một số loại "chuyển đổi để thiết lập" giống như hoạt động).

Nếu bạn mong muốn có một danh sách như là kết quả thay vì một tập, sorted(newwords) sẽ cung cấp cho bạn một danh sách theo thứ tự abc sắp xếp (list(newwords) sẽ cung cấp cho bạn một danh sách nhanh hơn một chút, nhưng để hoàn toàn tùy ý, và tôi nghi ngờ bạn 'd thay vì chờ thêm một lượng thời gian nhỏ và nhận được, bù lại, một kết quả được xếp theo thứ tự chữ cái độc đáo ;-).

+0

Sửa đổi câu hỏi một chút để phản ánh thông tin mới này. – magnetar

+0

Đó chính xác là những gì tôi cần. Cảm ơn, Alex! – magnetar

+0

@tsimotki, bạn được chào đón.Lưu ý rằng với danh tiếng hiện tại của bạn, bạn có thể "upvote" câu trả lời bạn thích (cho dù là câu hỏi của bạn hay người khác) - thực sự, nó thực sự lạ (đối với bất kỳ ai có đủ đại diện) chấp nhận câu trả lời mà không upvoting nó (chấp nhận có nghĩa là nó là một trong những hữu ích nhất để giải quyết vấn đề của bạn, không upvoting có nghĩa là bạn đã không thực sự thích nó ... kết hợp bất thường ;-). –

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