2012-05-20 30 views
15

của python Tôi có nhiều văn bản và tôi muốn tạo các cấu hình của chúng dựa trên việc sử dụng các phần khác nhau của lời nói, như danh từ và động từ. Về cơ bản, tôi cần đếm số lần sử dụng từng phần của lời nói.Đếm động từ, danh từ và các phần khác của lời nói với NLTK

Tôi đã gắn thẻ văn bản nhưng không chắc chắn làm thế nào để đi xa hơn:

tokens = nltk.word_tokenize(text.lower()) 
text = nltk.Text(tokens) 
tags = nltk.pos_tag(text) 

Làm thế nào tôi có thể lưu được tính cho từng phần của bài diễn văn vào một biến?

+0

Bạn đã gặp phải 'collections.Counter' chưa? – katrielalex

Trả lời

26

Phương pháp pos_tag mang đến cho bạn trở lại danh sách (token, thẻ) cặp:

tagged = [('the', 'DT'), ('dog', 'NN'), ('sees', 'VB'), ('the', 'DT'), ('cat', 'NN')] 

Nếu bạn đang sử dụng Python 2.7 hoặc mới hơn, sau đó bạn có thể làm điều đó chỉ đơn giản với:

>>> from collections import Counter 
>>> counts = Counter(tag for word,tag in tagged) 
>>> counts 
Counter({'DT': 2, 'NN': 2, 'VB': 1}) 

Để chuẩn hóa số lượng (cho bạn tỷ lệ mỗi số) làm:

>>> total = sum(counts.values()) 
>>> dict((word, float(count)/total) for word,count in counts.items()) 
{'DT': 0.4, 'VB': 0.2, 'NN': 0.4} 

Lưu ý rằng trong các phiên bản cũ hơn của Python, bạn sẽ phải tự thực hiện Counter mình:

>>> from collections import defaultdict 
>>> counts = defaultdict(int) 
>>> for word, tag in tagged: 
... counts[tag] += 1 

>>> counts 
defaultdict(<type 'int'>, {'DT': 2, 'VB': 1, 'NN': 2}) 
+0

Điều đó hoàn toàn tuyệt vời, cảm ơn bạn. Tôi đang sử dụng Python 2.7. Có cách nào để tôi có thể tìm ra tỷ lệ phần trăm của văn bản được gắn thẻ sử dụng từng phần-của-lời nói không? Ví dụ: bằng cách chia số danh từ cho tổng số thẻ và nhân với 100 (để nhận phần trăm) ... nhưng làm điều đó cho mọi thứ? Vì vậy, có được kết quả như: 23% danh từ, 14% động từ và như vậy? – Zach

+0

@Zach, tôi đã thêm một cái gì đó về bình thường hóa số lượng cho bạn. – dhg

+0

@dgh, cảm ơn nó hoạt động tuyệt vời. Một câu hỏi cuối cùng, bạn có biết tập hợp thẻ nào được sử dụng bởi nltk.pos_tag() không? ví dụ. Brown, Penn Treebank, v.v ...? – Zach