2014-11-30 17 views
6

Tôi có một thiết lập cơ sở dữ liệu wordnet và tôi đang cố tạo các từ đồng nghĩa cho các từ khác nhau.Sử dụng Wordnet để tạo các từ so sánh, so sánh và tính từ

Ví dụ: từ "vĩ đại nhất". Tôi sẽ xem xét và tìm một số từ đồng nghĩa khác nhau, nhưng không có từ nào trong số chúng thực sự phù hợp với định nghĩa - ví dụ, một là "bậc nhất".

Tôi đoán rằng tôi cần thực hiện một số loại kiểm tra theo tần suất trong một ngôn ngữ cụ thể hoặc bắt nguồn từ để có được từ cơ sở (ví dụ: lớn nhất -> tuyệt vời, tuyệt vời -> tốt nhất).

Tôi nên sử dụng bảng nào để đảm bảo các từ của tôi có chút ý nghĩa?

+0

Lemmatize, không ngăn chặn. Ngoài ra, bạn có thể xây dựng trên "bảng gì ... cảm giác?" –

+0

Greatest to great có thể được đưa ra bởi một người viết bài nói từng phần, xem JJ, JJR, JJS tại đây https://gate.ac.uk/sale/tao/splitap7.html#x39-802000G. Là một đề xuất thực sự được tìm nạp nhiều, bạn có thể xem xét các từ nhúng: https://code.google.com/p/word2vec/ Đóng các từ không phải là từ đồng nghĩa nhưng có lẽ việc điều chỉnh mô hình và đào tạo trên dữ liệu phù hợp có thể tạo ra các từ đồng nghĩa . Hoặc nhận được giao điểm giữa các kết quả từ điển đồng nghĩa và cụm từ. – Yasen

Trả lời

4

Cả Stemmer hoặc lemmatizer có thể giúp bạn có được từ greatest ->great:

>>> from nltk.stem import WordNetLemmatizer 
>>> from nltk.stem import WordNetLemmatizer, PorterStemmer 
>>> porter = PorterStemmer() 
>>> wnl = WordNetLemmatizer() 
>>> greatest = 'greatest' 
>>> porter.stem(greatest) 
u'greatest' 
>>> wnl.lemmatize(greatest) 
'greatest' 
>>> greater = 'greater' 
>>> wnl.lemmatize(greater) 
'greater' 
>>> porter.stem(greater) 
u'greater' 

Nhưng có vẻ như bạn có thể tận dụng một số tính chất tốt đẹp của các tagset PennTreeBank để có được từ greatest -> great:

>>> from nltk import pos_tag 
>>> pos_tag(['greatest']) 
[('greatest', 'JJS')] 
>>> pos_tag(['greater']) 
[('greater', 'JJR')] 
>>> pos_tag(['great']) 
[('great', 'JJ')] 

Hãy thử hệ thống dựa trên quy tắc điên rồ, hãy bắt đầu từ greatest:

>>> import re 
>>> word1 = 'greatest' 
>>> re.sub('est$', '', word1) 
'great' 
>>> re.sub('est$', 'er', word1) 
'greater' 
>>> pos_tag([re.sub('est$', '', word1)])[0][1] 
'JJ' 
>>> pos_tag([re.sub('est$', 'er', word1)])[0][1] 
'JJR' 
>>> word1 
'greatest' 

Bây giờ chúng ta biết rằng chúng ta có thể xây dựng trình biên dịch gốc/lemmatizer/tail_substituter của chúng ta, hãy viết một quy tắc cho biết nếu một từ cung cấp thẻ POS so sánh nhất và số tail_substituter của chúng ta cho JJ khi chúng ta bắt đầu và JJR khi chúng ta chuyển đổi, chúng ta có thể an toàn nói rằng hình thức so sánh và cơ sở của từ có thể dễ dàng nhận với tail_substituter của chúng tôi:

>>> if pos_tag([word1])[0][1] == 'JJS' \ 
... and pos_tag([re.sub('est$', '', word1)])[0][1] == 'JJ' \ 
... and pos_tag([re.sub('est$', 'er', word1)])[0][1] == 'JJR': 
...  comparative = re.sub('est$', 'er', word1) 
...  adjective = re.sub('est$', '', word1) 
... 
>>> adjective 
'great' 
>>> comparative 
'greater' 

Bây giờ mà được bạn khỏi greatest -> greater -> great. Từ great -> best là loại kỳ lạ, vì từ vựng chúng không liên quan mặc dù tương đối ngữ nghĩa của chúng có vẻ liên quan.

Vì vậy, tôi nghĩ rằng nó sẽ là chủ quan để nói rằng great -> best là một sự chuyển đổi hợp lệ

+0

Tôi không thực sự sử dụng NLTK, nhưng Wordnet được chuyển đổi thành cơ sở dữ liệu MySQL. Nhưng tôi sẽ xem xét điều này - điều này có vẻ như là một giải pháp hợp lý. –

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