Bir dize 544 sözcükten herhangi örneklerini kaldırmak için şık bir yol arayan

2 Cevap php

Ben boolean modunda kısmi bir maç tam metin arama çalışmasına biçimlendirmek sonra, kullanıcı tarafından girilen bir arama dize 544 tam metin stopwords herhangi örneklerini kaldırmak gerekir.

girdi: "new york city" çıktı: "+ york * + şehir *" ("yeni" a stopword olduğunu).

Ben çalışan bir çirkin çözüm var: kelimelerin bir diziye arama dizesini patlayabilir stopwords dizideki her kelimeyi aramak, bir maç varsa bunları yoketmek, kalan kelimeleri implode ve nihayet boolean modu eklemek için bir regex çalıştırın biçimlendirme. Daha zarif bir çözüm olmalı.

Benim soru 2 bölümden oluşmaktadır.

1) bunu yapmak için temiz yoldur ne düşünüyorsunuz?

2) Ben büyük bir regex kullanarak sorunun bir kısmını çözmüş ama bu başka bir soru kaldırdı.

EDIT: Bu aslında çalışır. Ben (ve benim regex olduğuna inanıyordu) sahip olduğu hafıza sorunu aslında stopwords filtreleme nedeniyle sonra maç çok sayıda daha sonra kodu oluşturulur olduğunu söylemeye utanıyorum.

$tmp  = preg_replace('/(\b('.implode('|',$stopwords).')\b)+/','',$this->val);
$boolified = preg_replace('/([^\s]+)/','+$1*',$tmp);

2 Cevap

Daha sonra bir kelime dizide bir arama dize bölmek ve

  • array_diff do () stopwords dizi
  • ya stopwords yapmak bir karma ve karma aramalarını kullanabilirsiniz (eğer isset ($ stopwords [$ kelime]) daha sonra ...)
  • veya kriteri stopwords tutmak ve her kelime için ikili arama kullanmak

daha hızlı olması için neler söylemek zor, her seçeneği profile isteyebilirsiniz (ve bunu yaparsanız, sonuç paylaşın lütfen!)

Tutulan 544 kelimeden bir suffix tree oluşturun ve sadece mektupla giriş dizesi mektupla birlikte yalak yürümek ve her yeni kelimenin başında geri ağacın köküne atlamak. Bir kelimenin sonunda bir maç bulduğunuzda, bunu çıkarın. Kelime listesi statik reamins Bu giriş dizeleri uzunluğu boyunca O (n) 'dir.