Metin oluşturmayı göze çarpmayacak şekilde değiştirmenin yolları?


12

Konuşma tanıma ile kullanmak için bir emacs uzantısı yazıyorum ve belirli bir özellik için yardım arıyorum. Konuşma tanıyıcısının (Dragon) tutarlı bir şekilde kötü tanıdığı bazı kelimeler - kaç kez antrenman yaptığınız önemli değil, sadece belirli kelimeleri tanımayı emiyor. Aynı zamanda genellikle bir konu üzerine yazarken veya kodlama yaparken aynı kelimeleri tekrar tekrar kullanacaksınız.

Bu yüzden kelimelerin arabellekte nasıl işlendiğini değiştirmek için yer paylaşımları kullanan bir mod yazdım. Kelimede rastgele bir harf alır, rastgele bir rengin altını çizer ve üstüne rastgele bir aksan işareti (aksan, işaret, vb.) Yerleştirir. İşte bir ekran görüntüsü (işaretleri / alt çizgileri görmek için muhtemelen yakınlaştırmanız gerekecektir):

resim açıklamasını buraya girin

Sonra "mor p saç" diyebilirsiniz ve "a" nın altında mor bir alt çizgi olan kelimeyi saça benzeyen aksan işaretiyle arayacak ve sizin için bu kelimeyi yazacaktır. Yani yukarıdaki ekran görüntüsünde emacs'ın sizin için "regexp-quote" yazmasına neden olacağını söyleyerek.

Buradaki fikir, tanıyıcıyı tanımakta sürekli olarak iyi olan sınırlı bir kelime kümesi kullanarak, daha önce kullandığınız herhangi bir kelimeyi ifade etmenizi sağlar.

Oldukça iyi çalışıyor, ancak bazen bir çarpışma var. Bunu yapmak için tutarlı bir şekilde kelimelere atıfta bulunmayı öğrenebilirim (random). Sadece 6 kolayca ayırt edilebilir renk buldum (alt çizgi sadece bir karakter genişliğinde ve tek bir piksel kalınlığında zor) ve 3 kolayca ayırt edilebilir aksan işareti (birbirinden ayırt etmek kolay ve aynı zamanda yukarıdaki alt çizgiyle karıştırılamaz) satırını veya alt çizgiyle üst üste bindirme).

Çarpışma sıklığını azaltmak için oluşturmayı değiştirmek için daha fazla yola ihtiyacım var. İdeal olarak bir oluşturma değişikliği:

  • Metnin geri kalanından sarsılmaz. Bu, örneğin ters video özelliğini reddetmeme neden oldu.
  • Diğer değişikliklerle kolayca karıştırılmamalıdır. Üst çizgiler, önceki satırdaki alt çizgilerle kolayca karıştırılır. Yazı tipi boyutunuz pratik olarak büyük olmadıkça birçok aksan işareti benzer görünür.
  • Diğer değişikliklerin olduğu yere uzamsal olarak yaklaşın. Şu anda gözüm hedefleme karakterini bulduktan sonra tüm bilgiler orada, işaretçi, alt çizgi ve harf.
  • Diyakritik işaretleri doğru bir şekilde sabitleyen sabit genişlikli bir yazı tipiyle (kodlama için gerekli) güzel çalışın (işaretlerin doğru bir şekilde oluşturulması için Consolas'tan DejaVu Sans Mono'ya geçmek zorunda kaldım)
  • Latin alfabesi harfleri üzerinde çalışmak. Örneğin arapça birleştirici işaretler vardır, ancak latin alfabesi karakterleri üzerinde birleştirilmezler.
  • Sözdizimi vurgulaması için zaten kullanıldığından, harf rengini değiştirmeyin.
  • Aslında emacs lisp ile emacs yapılabilir;)

Belki de yeni olasılıkları açmak için kötüye kullanılabilen oluşturmayı kontrol eden özel unicode karakterler vardır? Ya da daha fazla rengi kolayca ayırt edebilmem için alt çizgileri kalınlaştırmanın bir yolu mu? Veya unicode dışında karakterlerin üstünde işaretler oluşturmanıza izin veren diğer bazı belirsiz emacs özelliği?


Sorunuza doğrudan bir yanıt değil, belki de yeni karakter görünümleri vermek için yer paylaşımlarını kullanan birkaç fikir. Bir fikir, iki bindirmeyi birleştirmek / sandviç yapmak - bunları normal bir karakterle aynı alana sığdırmaya zorlamak olacaktır - örneğin, ilk karakter renk eklenmiş ince bir çizgi (char-to-string ?\uFEFF)ve diğeri azaltılmış bir hedef karakterdir her ikisi de sığacak şekilde boyutlandırın. Başka bir fikir , kütüphanede kullanılana benzer dikey bir çarpma ( bazı yazı tiplerinde kullanılabilir, ancak hepsi değil) kullanmak olacaktır. vline.el Emacswiki.org/emacs/VlineMode
hukukçu

@lawlist: Bu unicode çizgi fikri ilginç, bir 'kenar çizgisi' yapmama izin verecekti. Aşağıdaki karakterin boyutunu nasıl azaltacağınız hakkında bir fikriniz var mı? Belki de display özelliği ile kullanmak için bir görüntü oluşturmak olabilir ama AFAICT görüntü içine metin oluşturmak için emacs almak için hiçbir yolu yoktur, bu yüzden görüntüleri emacs dışında yapmak zorunda kalacak.
Joseph Garvin

Bu yorum (kaldırdığım) önceki yorumun yerine geçer ve aşağıdaki bağlantıdaki kod da güncellenmiştir - üç örnek (biri geçerli iş parçacığında aşağıda gönderdiğim yanıtla aynıdır) içerir: stackoverflow .com / sorular / 23744237 /…
kanun listesi

Yanıtlar:


4

Başka bir olasılık, satır numaralarını görüntülemek ve kelimeden önce satır numarasını söylemek olabilir veya tam satır numarasını almak için bakmak rahatsız edici olacağından, algoritma aramasının + veya - 5 veya 10 satır içinde söyle.

Ya da belki de içinde çalıştığınız bir bölge ya da işlevi beyan edin ve tüm aramaların sadece oraya bakmasını sağlayın. Bunun çarpışmaları sınırlandıracağını tahmin ediyorum.

Ayrıca, göze çarpmalarına yardımcı olmak için belirli bir renkteki bir sözcüğün öncesinde veya öncesinde unicode sembolleri oluşturabilirsiniz. Ve ayrıca kelimeyi başka bir renkle işaretleyin veya altını çizin. Bu şekilde 6 kelime rengi * 6 simge rengi * N sembolü olabilir. Muhtemelen 10 iyi sembol bulabilir ve 360 ​​kombinasyonunuz olabilir. Örneğin, burada kediyi ifade etmek için "mavi sarı yıldız" diyebilirsiniz.

resim açıklamasını buraya girin

Yıldız çok sarsıcıysa, çift olabilir: kutu ve iki farklı: alt çizgi.

Yani burada "mavi sarı kırmızı" kelimesini kullanarak 216 kelimeyi kullanabilirsiniz.

resim açıklamasını buraya girin


1
Kimsenin başka numaralarla gelip gelmeyeceğini görmek için biraz bekledim, ancak semboller eklemek girintiyi atabileceğinden muhtemelen çift alt çizgi rengiyle gideceğim. Kabul edildi, teşekkürler.
Joseph Garvin

2

As-atlama modunu duydun mu?

Belirttiğiniz gereksinimlerin hiçbirini karşılamıyor, ancak elde etmeye çalıştığınız şeye mükemmel bir şekilde uyuyor gibi görünüyor. Kullanıcının yalnızca 2 veya 3 kelime söyleyerek herhangi bir sözcüğü belirtmesine izin verir.

Size sunduğu karakter kümesini tanımlayabilirsiniz, böylece ayırt edilmesi zor ünsüzlerden kaçınabilirsiniz. Sonra kullanım sadece "dokuz düzeltmek" diyebilir ve ile başlayan 9. kelimeyi düzeltebilir a.


Ace-jump-mode'un neden işe yaramadığına dair tmalsburg'un gönderisine ilişkin yorumuma bakın.
Joseph Garvin

1

İlginç soru. Bahse girerim bazı ilginç öneriler alırsınız.

Bana gelen küçük bir öneri, altını çizmek için farklı renkler ve stiller kullanmaktır. Elisp kılavuzu, düğüm Bkz Face Attributesözelliği hakkında :underlineve :colorve :stylebileşenleri.

Ayrıca, öznitelik :boxve farklı çizgi genişlikleri ve stilleri ile deney yapabilirsiniz , ancak bu belki de çok sarsıcıdır.


1

Hedef kelimeyi seçmek için alternatif bir yol önererek cevap vereceğim. Kelimelerin yarısını vurgulayın (rastgele seçilir). Hedef kelime vurgulanırsa kullanıcı "evet", aksi takdirde "hayır" der. Kullanıcı "evet" derse, vurgulanan tüm kelimeleri alın ve yarısını rastgele vurgulayın. Kullanıcı "hayır" derse, vurgulanmayan kelimelerin yarısını rastgele vurgulayın. Yine kullanıcı "evet" veya "hayır" diyerek hedef kelimenin vurgulanıp vurgulanmadığını belirtir. Yalnızca hedef sözcük vurgulanana kadar tekrarlayın.

Bu yaklaşımın bazı faydaları:

  • Ekranda ne kadar kelime olursa olsun bu işe yarar.
  • Süslü renklere, yazı tiplerine veya simgelere ihtiyacınız yoktur. Tek renkli bir ekran yeterlidir.
  • Çok düşük bilişsel yük, çünkü bir kelimenin vurgulanıp vurgulanmadığını söylemek kolaydır.

Dezavantajı: Çok sık "evet" ve "hayır" demek zorundasınız. Ancak, bu fikrin aşağıdaki varyasyonu ile giderilir: kelimeleri vurgulamayın, onlar için renkler kullanın. Kolayca ayırt edilebilen 6 rengin olduğunu söylüyorsun. Bu, ekranda 100 kelimeniz varsa, hedef kelimeyi seçmek için ortalama 2,6 rengin adlandırılmasını gerektirir. 1000 kelime varsa, ortalama 3.9 renk belirtmelisiniz.


1
Maalesef konuşulan kelime sayısı yanıltıcı bir metriktir. Bu çözüm tarzı ile ilgili sorun, algılama / aksiyon turları içermesidir. Rengi görmek, sonra tepki vermek, sonra görmek, tepki vermek, görmek zorundayım. Her biri arasında durmak zorunda kalmadan 3 kelime söylemek pratikte yaptığınız bir çözümden daha hızlı olmalı, özellikle Dragon'un gecikmesi zayıf. Bu gidiş-dönüş yolculukları bir sorun olmasaydı, sadece ace-jump-modunu kullanırdım. Aksanlı işaretlerle ekrana bir kez bakabilir ve Dragon'un her kelimeden sonra tepki vermesi için duraklamak zorunda kalmadan söyleyeceklerimin tamamını bilirim.
Joseph Garvin

1

Aşağıda, xpm görüntü formatını destekleyen grafiksel Emacs sürümleri için xpm görüntüsüne sahip bir kaplama kullanan bir örnek verilmiştir. 11 piksel genişliğindedir; 20 piksel yüksekliğinde; ve kullanıcı tarafından belirlenen 4 olası renge sahiptir. Snow Leopard 10.6.8 çalıştıran bir Mac kullanıyorum ve Emacs kullanırken tercih ettiğim yazı tipi -*-Courier-normal-normal-normal-*-18-*-*-*-m-0-iso10646-1- frame-char-width11 ve frame-char-height20'dir. Büyük harf "A" nın soluna "A" harfinin soluna ince bir dikey sarı çizgi ekledim. özel resimlerin nasıl çizileceğine örnek. Bu noktada karakterin ikame edilmesi, (char-after (point))bu sayı kullanılarak ve bu sayı kullanılarak - bu durumda "A" büyük harf için 65 olan - ve uygun değişkenin (ör.) Değiştirilmesi (cond ((eq (char-after (point)) 65) cap-ltr-a-xpm) . . .ve yer paylaşımı - ör.(overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm). Bu, hem kesilmiş arabelleklerde hem de word-wrap ile çok güzel çalışır, çünkü displaybir kelimenin ortasındaki bir karakterdeki overlay özelliği word-wrap'in kelimenin ilk bölümünün önceki satırın sonuna ait olduğunu düşünmesine neden olmaz. . Tabii ki, favori xpm görüntülerinin özel bir kütüphanesini oluşturmak zaman alacaktır.

ImageMagick, belirli bir yazı tipi ailesine ve boyutuna dayalı olarak belirli bir karakterin yarı hassas bir xpm'sini üretebilir, ancak umduğum kadar kesin değildi - işte bu harici yardımcı programı kullanma talimatlarına bir bağlantı: https: / /stackoverflow.com/a/14168154/2112489 Özetle, kullanıcı xpm görüntülerini kendi isteğine göre özelleştirmeye zaman ayırmaya hazır olmalıdır.

(defun xpm-example ()
(interactive)
"Doc-string"
  (let* (
      (cap-ltr-a-xpm `(image :type xpm :mask nil :ascent center :data
        "/* XPM */
        static char * letters_xpm[] = {
        /* columns rows colors chars-per-pixel */
        /* columns = 1 pixel in width -- see also (frame-char-width) */
        /* rows = 1 pixel in height -- see also (frame-char-height) */
        \"11 20 4 1\",
        \". c #000000\",
        \"+ c #FF0000\",
        \"@ c #7F0000\",
        \"% c yellow\",
        \"%..........\",
        \"%....++....\",
        \"%....++....\",
        \"%..++..++..\",
        \"%..++..++..\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++++++++++\",
        \"%++++++++++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%..........\"};"))  )
    (overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm)))

@wasamasa - teşekkür ederim - XBM bitmap'leriyle ilgili hatalı ifadeyi kaldırdım.
hukukçu
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.