Saya sudah mencoba PorterStemmer dan Snowball tetapi keduanya tidak bekerja pada semua kata, kehilangan beberapa kata yang sangat umum.
Kata-kata pengujian saya adalah: " kucing menjalankan komunitas komunitas komunitas kaktus kaktus kaktus ", dan keduanya mendapatkan kurang dari setengah benar.
Lihat juga:
nlp
stemming
lemmatization
manixrock.dll
sumber
sumber
Jawaban:
Jika Anda tahu Python, The Natural Language Toolkit (NLTK) memiliki lemmatizer yang sangat kuat yang menggunakan WordNet .
Perhatikan bahwa jika Anda menggunakan lemmatizer ini untuk pertama kali, Anda harus mengunduh korpus sebelum menggunakannya. Ini dapat dilakukan dengan:
Anda hanya perlu melakukan ini sekali. Dengan asumsi Anda sekarang telah mengunduh korpus, ini berfungsi seperti ini:
Ada lemmatizer lain di modul nltk.stem , tapi saya belum mencobanya sendiri.
sumber
dies
, itu memberi Andady
alih-alihdie
. Bukankah ada semacam kamus stemmer hardcode?WordNetLemmatizer
salah lemmatize?Saya menggunakan stanford nlp untuk melakukan lemmatisasi. Saya mengalami masalah serupa dalam beberapa hari terakhir. Semua berkat stackoverflow untuk membantu saya menyelesaikan masalah ini.
Mungkin juga merupakan ide yang baik untuk menggunakan stopwords untuk meminimalkan lemma keluaran jika digunakan nanti di pengklasifikasi. Silakan lihat ekstensi coreNlp yang ditulis oleh John Conwell.
sumber
Saya mencoba daftar istilah Anda di situs demo bola salju ini dan hasilnya terlihat oke ....
Sebuah stemmer seharusnya mengubah bentuk kata-kata yang berubah menjadi beberapa akar yang sama. Bukan tugas stemmer untuk membuat root itu menjadi kata kamus yang 'tepat'. Untuk itu Anda perlu mencermati penganalisis morfologi / ortografi .
Saya pikir pertanyaan ini kurang lebih sama, dan jawaban Kaarel untuk pertanyaan itu adalah dari mana saya mengambil tautan kedua.
sumber
Perdebatan tentang stemmer vs lemmatizer terus berlanjut. Ini masalah mengutamakan presisi daripada efisiensi. Anda harus berhati-hati untuk mencapai satuan yang bermakna secara linguistik dan tetap menggunakan jus komputasi minimal dan tetap mengindeks sebuah kata dan variasinya di bawah kunci yang sama.
Lihat Stemmers vs Lemmatizers
Berikut contoh dengan python NLTK:
sumber
WordNetLemmatizer
'slemmatize()
dapat mengambil tag POS. Jadi dari contoh Anda:" ".join([wnl.lemmatize(i, pos=VERB) for i in sent.split()])
memberi'cat run run cactus cactuses cacti community communities'
.pos=NOUN
? BTW: Lama tidak bertemu, semoga kita akan bertemu satu sama lain di konferensi segera =)pos=VERB
Anda hanya melakukan lemmatisasi pada kata kerja. Kata benda tetap sama. Saya hanya perlu menulis beberapa kode saya sendiri untuk berputar di sekitar tag POS Penn Treebank yang sebenarnya untuk menerapkan lemmatisasi yang benar ke setiap token. Juga,WordNetLemmatizer
bau di tokenizer default nltk lemmatizing. Jadi contoh sepertidoes n't
jangan lemmatizedo not
.port.stem("this")
menghasilkanthi
danport.stem("was")
wa
, bahkan ketika posisi yang tepat disediakan untuk masing-masing.Halaman resmi Martin Porter berisi Porter Stemmer dalam PHP serta bahasa lainnya .
Jika Anda benar-benar serius tentang stemming yang baik meskipun Anda akan perlu memulai dengan sesuatu seperti Algoritma Porter, perbaiki dengan menambahkan aturan untuk memperbaiki kasus salah yang umum terjadi pada dataset Anda, dan akhirnya menambahkan banyak pengecualian pada aturan tersebut . Ini dapat dengan mudah diimplementasikan dengan pasangan kunci / nilai (dbm / hash / kamus) di mana kuncinya adalah kata yang akan dicari dan nilainya adalah kata bertangkai untuk menggantikan aslinya. Mesin pencari komersial yang saya kerjakan pernah mendapatkan 800 pengecualian untuk algoritme Porter yang dimodifikasi.
sumber
http://wordnet.princeton.edu/man/morph.3WN
Untuk banyak proyek saya, saya lebih suka lemmatizer WordNet berbasis leksikon daripada porter stem yang lebih agresif.
http://wordnet.princeton.edu/links#PHP memiliki tautan ke antarmuka PHP ke WN API.
sumber
Berdasarkan berbagai jawaban di Stack Overflow dan blog yang saya temui, ini adalah metode yang saya gunakan, dan tampaknya mengembalikan kata-kata nyata dengan cukup baik. Idenya adalah untuk membagi teks yang masuk menjadi array kata (gunakan metode mana pun yang Anda suka), dan kemudian temukan parts of speech (POS) untuk kata-kata itu dan gunakan itu untuk membantu membendung dan menyesuaikan kata-kata.
Contoh Anda di atas tidak berfungsi dengan baik, karena POS tidak dapat ditentukan. Namun, jika kita menggunakan kalimat nyata, segalanya bekerja lebih baik.
sumber
Lihatlah WordNet, basis data leksikal besar untuk bahasa Inggris:
http://wordnet.princeton.edu/
Ada API untuk mengaksesnya dalam beberapa bahasa.
sumber
Ini terlihat menarik: MIT Java WordnetStemmer: http://projects.csail.mit.edu/jwi/api/edu/mit/jwi/morph/WordnetStemmer.html
sumber
Lihatlah LemmaGen - perpustakaan sumber terbuka yang ditulis dalam C # 3.0.
Hasil untuk kata uji Anda ( http://lemmatise.ijs.si/Services )
sumber
Paket atas python (tanpa urutan tertentu) untuk lemmatization adalah:
spacy
,nltk
,gensim
,pattern
,CoreNLP
danTextBlob
. Saya lebih suka implementasi spaCy dan gensim (berdasarkan pola) karena mereka mengidentifikasi tag POS dari kata tersebut dan memberikan lemma yang sesuai secara otomatis. Itu memberi lemma yang lebih relevan, menjaga maknanya tetap utuh.Jika Anda berencana menggunakan nltk atau TextBlob, Anda harus berhati-hati dalam menemukan tag POS yang tepat secara manual dan menemukan lemma yang tepat.
Contoh Lemmatisasi dengan spaCy:
Contoh Lemmatisasi Dengan Gensim:
Contoh di atas dipinjam dari halaman lemmatisasi ini .
sumber
Lakukan pencarian untuk Lucene, saya tidak yakin apakah ada port PHP tetapi saya tahu Lucene tersedia untuk banyak platform. Lucene adalah pustaka pengindeksan dan pencarian OSS (dari Apache). Secara alami itu dan ekstra komunitas mungkin memiliki sesuatu yang menarik untuk dilihat. Setidaknya Anda bisa mempelajari bagaimana melakukannya dalam satu bahasa sehingga Anda bisa menerjemahkan "ide" ke dalam PHP
sumber
Jika saya dapat mengutip jawaban saya untuk pertanyaan yang disebutkan StompChicken:
Karena mereka tidak memiliki pemahaman tentang bahasa dan tidak lari dari kamus istilah, mereka tidak memiliki cara untuk mengenali dan menanggapi dengan tepat kasus yang tidak teratur, seperti "run" / "ran".
Jika Anda perlu menangani kasus yang tidak teratur, Anda harus memilih pendekatan yang berbeda atau menambah stemming Anda dengan kamus koreksi kustom Anda sendiri untuk dijalankan setelah stemmer menyelesaikan tugasnya.
sumber
Versi terbaru dari stemmer di NLTK adalah Snowball.
Anda dapat menemukan contoh tentang cara menggunakannya di sini:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.stem.snowball2-pysrc.html#demo
sumber
Anda bisa menggunakan batang Morpha. UW telah mengunggah morpha stemmer ke pusat Maven jika Anda berencana untuk menggunakannya dari aplikasi Java. Ada pembungkus yang membuatnya lebih mudah digunakan. Anda hanya perlu menambahkannya sebagai dependensi dan menggunakan
edu.washington.cs.knowitall.morpha.MorphaStemmer
kelasnya. Instance aman untuk thread (JFlex asli memiliki kolom kelas untuk variabel lokal yang tidak perlu). Buat instance kelas dan jalankanmorpha
serta kata yang ingin Anda akhiri.sumber
.Net Lucene memiliki porter stemmer bawaan. Anda bisa mencobanya. Tetapi perhatikan bahwa kata dasar porter tidak mempertimbangkan konteks kata saat menurunkan lemma. (Telusuri algoritme dan implementasinya dan Anda akan melihat cara kerjanya)
sumber
Martin Porter menulis Snowball (bahasa untuk algoritma stemming) dan menulis ulang "English Stemmer" di Snowball. Ada Stemmer Bahasa Inggris untuk C dan Java.
Dia secara eksplisit menyatakan bahwa Porter Stemmer telah diimplementasikan kembali hanya karena alasan historis, jadi pengujian kebenaran stemming terhadap Porter Stemmer akan memberi Anda hasil yang (seharusnya) sudah Anda ketahui.
Dr. Porter menyarankan untuk menggunakan stemmer Inggris atau Porter2, bukan stemmer Porter. Stemmer bahasa Inggris adalah apa yang sebenarnya digunakan di situs demo seperti yang telah dijawab @StompChicken sebelumnya.
sumber
Di Jawa, saya menggunakan tartargus-snowball untuk kata dasar
Maven:
Kode sampel:
sumber
Coba yang ini di sini: http://www.twinword.com/lemmatizer.php
Saya memasukkan kueri Anda di demo
"cats running ran cactus cactuses cacti community communities"
dan mendapatkan["cat", "running", "run", "cactus", "cactus", "cactus", "community", "community"]
dengan bendera opsionalALL_TOKENS
.Kode sampel
Ini adalah API sehingga Anda dapat menyambungkannya dari lingkungan mana pun. Seperti inilah tampilan panggilan REST PHP.
sumber
Saya sangat merekomendasikan menggunakan Spacy (parsing & penandaan teks dasar) dan Textacy (pemrosesan teks tingkat tinggi yang dibangun di atas Spacy).
Kata - kata lemmatized tersedia secara default di Spacy sebagai
.lemma_
atribut token dan teks dapat lemmatized saat melakukan banyak prapemrosesan teks lainnya dengan textacy. Misalnya saat membuat sekantong istilah atau kata atau umumnya tepat sebelum melakukan beberapa pemrosesan yang membutuhkannya.Saya mendorong Anda untuk memeriksa keduanya sebelum menulis kode apa pun, karena ini dapat menghemat banyak waktu Anda!
sumber
sumber