Cümleden bilgi çıkartın


11

Basit bir chatbot oluşturuyorum. Kullanıcı yanıtından bilgi almak istiyorum. Örnek bir senaryo:

Bot : Hi, what is your name?
User: My name is Edwin.

Edwin ismini cümleden çıkarmak istiyorum. Ancak, kullanıcı aşağıdaki gibi farklı şekillerde yanıt verebilir:

User: Edwin is my name.
User: I am Edwin.
User: Edwin. 

Kelimeler arasındaki bağımlılık ilişkilerine güvenmeye çalıştım ama sonuç iyi sonuç vermiyor.

Bu sorunu çözmek için hangi tekniği kullanabileceğime dair bir fikrin var mı?

[GÜNCELLENMİŞ]

Adlandırılmış varlık tanıma ile birlikte konuşma etiketleyici ve ayrıştırıcısının bir kısmını test ettim. Çoğu modelin, kişinin adı veya uygun isim için varlığın ilk karakterinin büyük harf olması gerektiği şekilde eğitildiğini öğrendim. Bu normal belge için geçerli olabilir, ancak bir sohbet botu için ilgisizdir. Örneğin

User: my name is edwin.

Çoğu NER bunu tanıyamadı.


Bu , modern sohbet botlarının nasıl inşa edildiğini açıklıyor, ancak basit olarak adlandırmam. "Soru cevaplama" için arama yaparak daha fazla bilgi edinebilirsiniz.
Emre

İnsanların soru sormalarını ve cevap almalarını nasıl bir cevabı kabul edilebilir olarak işaretlediklerini çok
beğendim

Yanıtlar:


7

Muhtemelen bir Adlandırılmış Varlık Tanıma ve Sözdizimsel Analiz kombinasyonunu kullanabilirsiniz - Edwin sözcüğü kesinlikle desteklerken, adın Edward Philip Martel olduğu bir durum hayal edin . NER her kelimeyi ayrı bir varlık olarak algılar (dolayısıyla 3 farklı varlık) - bu nedenle, bunları bir mantığa dayanarak bir araya getirmeniz gerekir. Ayrıca, birden fazla ismin bulunması durumunda, belirsizleşmesi zorlaşabilir (örneğin , Winterfell'de dined John & Ramsey ).

Burada cümle sözdiziminin analizi de yardımcı olacaktır (son kullanıcının nispeten tutarlı ve uygun bir cümleye girdiği varsayılarak - argo ve kısa metin formları kullanılıyorsa, Stanford NLP bile sadece belirli bir dereceye kadar yardımcı olabilir).

Sözdizimi analizi / ayrıştırma ve NER'den yararlanmanın bir yolu aşağıdaki örneklerdir -

 1. User: Edwin is my name.
 2. User: I am Edwin.
 3. User: My name is Edwin.

Vakaların her birinde (genel olarak da olduğu gibi), Varlık Adı (Özel İsim / İsim) bir Fiile yakın olarak ilişkilidir. Bu nedenle, fiilleri belirlemek için önce cümleyi ayrıştırır ve sonra çevredeki (+/- 1 veya 2) kelimelere NER uygularsanız, sorunu çözmek için nispeten iyi bir yolunuz olabilir. Bu çözüm, öncelikle NER'leri tanımlamak için oluşturduğunuz sözdizimi kurallarına ve fiillerin etrafındaki pencereye bağlı olacaktır.


2
Muhtemelen her cümlenin bir örüntünün kabul ettiği bir yanıt olduğu bir 'deterministik olmayan sonlu otomata' uygulayacaksınız. Bazı gramerler böyle bir şeye uygulanır. (NLP / dilbilgisi). Bunun nasıl yapılacağı gerekiyorsa, stanfordnlp.github.io/CoreNLP
Intruso


4

Bu, CRF'ler ile kolayca yapılabilir . Cümlenizi etiketlemek için BIO kodlamasını kullanabilirsiniz . Sonra CRF'lere iletin. Aşağıdaki gibi eğitim amaçlı birkaç etiketli cümle oluşturmanız gerekir,

 I am Edwin.
 O O  B-NAME

 You can call me Alfred
 O   O    O    O B-NAME

 My name is  Edwin   thomas
 O  O     O  B-NAME  I-NAME

CRFsuite ve CRF ++ iyi uygulamalardan bazılarıdır. CRFsuite adında bir piton kurdelelesini pycrfsuite oldukça kolay uygulamaktır. NER'in uçtan uca uygulanması için bu ipython not defterini veya github'daki bu kod snippet'ini kontrol edin .

Python ile yazılmış NER ve Niyet Sınıflandırması ile github'daki bu Açık kaynak Sohbet bot projesini kontrol edin . Onlar botları cümlelerden bilgi ayıklamak için eğitebilirsiniz kullanımı kolay bir eğitim UI var.


0

Bu tür görevleri yüksek doğrulukla gerçekleştirmek için, word2vec yardımıyla kelime düğünleriyle bir LSTM modeli oluşturmanızı öneririm. LSTM'ler cümledeki bilgileri almanın yanı sıra cümle içinde zaten bir dizi kelime bulunduğunda verilen bir sonraki karakteri veya kelimeyi tahmin etmeye yardımcı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.