2014-07-09 13 views
11

Tôi đã thử tất cả các phương pháp nltk để bắt đầu nhưng nó cho tôi kết quả lạ với một số từ.Phương pháp khởi đầu tốt nhất trong Python là gì?

Ví dụ

Nó thường cắt hết từ khi nó không nên làm điều đó:

  • chó xù => poodl
  • bài viết articl

hoặc không ngăn chặn rất tốt:

  • easi ly và dễ dàng không bắt nguồn ở cùng một từ
  • lá, phát triển, khá không bắt nguồn

Bạn có biết libs bắt nguồn khác trong trăn, hay một cuốn từ điển tốt?

Cảm ơn bạn

+1

các kết quả này không lạ vì 'bắt nguồn 'là quá trình giảm từ gốc, gốc hoặc gốc - nói chung là dạng chữ viết. Để biết thêm chi tiết, hãy xem [tại đây] (http: //en.wikipedia.org/wiki/Stemming) – eliasah

+0

btw NLTK là nền tảng tốt nhất để xây dựng các chương trình Python để làm việc với dữ liệu ngôn ngữ của con người. – eliasah

Trả lời

-2

Bạn đã thử xuất phát 1.0 here?

+0

Dường như họ sử dụng các thuật toán khác nhau. Tôi sẽ thử nó, cảm ơn! – PeYoTlL

+0

Lưu ý rằng bắt nguồn từ là một triển khai Python thuần túy và sẽ không nhanh như PyStemmer, một trình bao bọc xung quanh thư viện c và cũng có sẵn trong PyPi. – Spaceghost

50

Kết quả bạn nhận được (thường) được mong đợi đối với người gửi bằng tiếng Anh. Bạn nói rằng bạn đã thử "tất cả các phương pháp nltk" nhưng khi tôi thử các ví dụ của bạn, điều đó dường như không đúng.

Dưới đây là một số ví dụ sử dụng PorterStemmer

import nltk 
ps = nltk.stemmer.PorterStemmer() 
ps.stem('grows') 
'grow' 
ps.stem('leaves') 
'leav' 
ps.stem('fairly') 
'fairli' 

Kết quả là 'phát triển', 'leav' và 'fairli' mà, ngay cả khi họ là những gì bạn muốn, được bắt nguồn phiên bản của từ gốc.

Nếu chúng ta chuyển sang trình tạo quả cầu tuyết, chúng ta phải cung cấp ngôn ngữ làm tham số.

import nltk 
sno = nltk.stem.SnowballStemmer('english') 
sno.stem('grows') 
'grow' 
sno.stem('leaves') 
'leav' 
sno.stem('fairly') 
'fair' 

Kết quả như trước khi cho 'mọc' và 'lá' nhưng 'khá' được bắt nguồn để 'công bằng'

Vì vậy, trong cả hai trường hợp (và có hơn hai stemmers sẵn trong NLTK) , những từ mà bạn nói không phải là bắt nguồn, thực tế là vậy. Các LancasterStemmer sẽ trở lại 'dễ dàng' khi được cung cấp với 'dễ dàng' hoặc 'dễ dàng' như đầu vào.

Có thể bạn thực sự muốn có một kẻ ngộ độc? Điều đó sẽ trả về 'article' và 'poodle' không thay đổi.

import nltk 
lemma = nltk..wordnet.WordNetLemmatizer() 
lemma.lemmatize('article') 
'article' 
lemma..lemmatize('leaves') 
'leaf' 
+9

Đây phải là câu trả lời đã chọn. – gobrewers14

+1

Sự khác biệt b/w lemmantizer và stemmer: https://stackoverflow.com/questions/1787110/what-is-the-true-difference-between-lemmatization-vs-stemming –

4

Tất cả những stemmers đã được thảo luận ở đây là thuật toán Stemmer, vì thế họ luôn có thể tạo ra kết quả bất ngờ như

In [3]: from nltk.stem.porter import * 

In [4]: stemmer = PorterStemmer() 

In [5]: stemmer.stem('identified') 
Out[5]: u'identifi' 

In [6]: stemmer.stem('nonsensical') 
Out[6]: u'nonsens' 

Để có được một cách chính xác những từ gốc một cần một cuốn từ điển dựa Stemmer như Hunspell Stemmer.Here là một thực hiện python của nó trong link sau đây. Mã ví dụ ở đây

>>> import hunspell 
>>> hobj = hunspell.HunSpell('/usr/share/myspell/en_US.dic', '/usr/share/myspell/en_US.aff') 
>>> hobj.spell('spookie') 
False 
>>> hobj.suggest('spookie') 
['spookier', 'spookiness', 'spooky', 'spook', 'spoonbill'] 
>>> hobj.spell('spooky') 
True 
>>> hobj.analyze('linked') 
[' st:link fl:D'] 
>>> hobj.stem('linked') 
['link'] 
Các vấn đề liên quan