2010-12-06 7 views
5

私は単語のリストを2つ持っています.LIST1とLIST2を考えてみましょう。私は重複を見つけるためにLIST1とLIST2を比較したいが、それはまた、複数の単語と同様にフォームを見つける必要があります。例えば。言葉を比較する、また複数形を探す必要がありますか?

LIST1に "account"という単語があり、LIST2に "accounts、accounting"という単語があるとします。比較すると、単語 "account"に2つの一致が表示されます。

私はPHPでそれをやっており、mysqlテーブルにLISTを持っています。

+0

私はこれが古いスレッドだと知っていますが、私はちょうど答えを追加しました。 – quickshiftin

答えて

0

私はあなたの言葉をとり、それをLIST2と直接比較して、同時に、複数の単語または複数の単語を示すために、左の単語を探して比較する単語をすべて削除します(これは十分正確でなければなりません)。そうでない場合、あなたは今、LIST2へのList1を比較S.

Duplicate Ending List 
s 
es 
ing 

LIST1 
Gas 
Test 

LIST2 
Gases 
Tests 
Testing 

を追加するなど、そのように単純ではないとして、言葉のうちの複数形を作るためのアルゴリズムを生成する必要があります。同じ比較のループの間、アイテムと直接的な比較を行い、リスト1の単語がリスト2の現在の単語から削除されます。この結果は重複した終了リストにあります。

希望は意味があります。

0

問題は、少なくとも英語では複数形がすべて標準的な拡張子ではなく、存在しないということです。あなたはすべての単語+'ing'+'s'を使用して近似を行うことができますが、それは偽陽性と陰性を与えます。

必要に応じて、MySQLで直接処理できます。

SELECT DISTINCT l2.word 
    FROM LIST1 l1, LIST l2 
    WHERE l1.word = l2.word OR l1.word + 's' = l2.word OR l1.word + 'ing' = l2.word; 
5

その後、茎を比較し、その幹に各リスト項目をマップするためにporter stemmingと呼ばれる技術を使用することができます。 PHPでのPorter Stemmingアルゴリズムの実装はhereまたはhereです。

+0

ポーター・ステミング研究で私を始めてくれた人+1: – RobertPitt

+0

ニース。以前にその技術を聞いたことはありませんでした。 – Veign

+0

それが私の研究リストに載ったのです。私はアルゴリズムのおかげで – RobertPitt

0

この機能は、複数の単語を出力します。

http://www.exorithm.com/algorithm/view/pluralize

あなたはこのためstemmerと一緒にDoctrine Inflectorクラスを使用して検討するかもしれない動名詞と現在分詞のために書くことができます似たような(INGフォーム)

+0

ありがとうマイクCこのスクリプトは、シンプルで理解しやすくて、私がいくつかのアイデアを得るのを助けました – daron

0

ここアルゴリズムは「(ワイルドカードでdiffering portionを置き換え、検索ワード

  • ストリップ特殊文字
  • Singularize個別のスペースに分割検索文字列、プロセスの言葉
  • 小文字
    1. ハイレベルです% ')
    2. ステム、異なる部分をワイルドカード('% ')で置き換えます。

    ここで私は一緒に私はいくつかのテスト文字列おそらく

    Input String: Mary's Hamburgers 
    SearchString: SELECT * FROM LIST2 WHERE LOWER(some_field) LIKE 'mary% hamburger%'; 
    
    Input String: Office Supplies 
    SearchString: SELECT * FROM LIST2 WHERE LOWER(some_field) LIKE 'offic% suppl%'; 
    
    Input String: Accounting department 
    SearchString: SELECT * FROM LIST2 WHERE LOWER(some_field) LIKE 'account% depart%'; 
    

    ない完璧に走ったが、それはとにかく良いスタートだ

    /** 
    * Use inflection and stemming to produce a good search string to match subtle 
    * differences in a MySQL table. 
    * 
    * @string $sInputString The string you want to base the search on 
    * @string $sSearchTable The table you want to search in 
    * @string $sSearchField The field you want to search 
    */ 
    function getMySqlSearchQuery($sInputString, $sSearchTable, $sSearchField) 
    { 
        $aInput = explode(' ', strtolower($sInputString)); 
        $aSearch = []; 
        foreach($aInput as $sInput) { 
         $sInput = str_replace("'", '', $sInput); 
    
         //-------------------- 
         // Inflect 
         //-------------------- 
         $sInflected = Inflector::singularize($sInput); 
    
         // Otherwise replace the part of the inflected string where it differs from the input string 
         // with a % (wildcard) for the MySQL query 
         $iPosition = strspn($sInput^$sInflected, "\0"); 
    
         if($iPosition !== null && $iPosition < strlen($sInput)) { 
          $sInput = substr($sInflected, 0, $iPosition) . '%'; 
         } else { 
          $sInput = $sInput; 
         } 
    
         //-------------------- 
         // Stem 
         //-------------------- 
         $sStemmed = stem_english($sInput); 
    
         // Otherwise replace the part of the inflected string where it differs from the input string 
         // with a % (wildcard) for the MySQL query 
         $iPosition = strspn($sInput^$sStemmed, "\0"); 
    
         if($iPosition !== null && $iPosition < strlen($sInput)) { 
          $aSearch[] = substr($sStemmed, 0, $iPosition) . '%'; 
         } else { 
          $aSearch[] = $sInput; 
         } 
        } 
    
        $sSearch = implode(' ', $aSearch); 
        return "SELECT * FROM $sSearchTable WHERE LOWER($sSearchField) LIKE '$sSearch';"; 
    } 
    

    を入れる機能です!落ちる場所は、複数の一致が返されたときです。ベストマッチを決定するロジックはありません。それはMySQL fulltextLuceneのようなものが入ってくる場所です。もう少し考えれば、levenshteinを使ってこのアプローチで複数の結果をランク付けすることができます。

  • 関連する問題