0

とりわけ旅行情報が記載されたスプレッドシートがたくさんあります。

行が旅行を表す開始位置と終了位置、および行からさらに1つまたは2つのものを抽出する必要がありますが、これらの追加フィールドが何であるかは重要ではありません。

すべての場所の既知のリストやテキストの固定パターンはありません。私が探すことができるのは場所の名前だけです。

私が検索しているフィールドには0〜2の場所があり、場所にエイリアスがある場合もあります。

問題

これがある場合:

00229 | 445 | RTF | Jan   |  trn_rtn_co  | Chicago to Base1 
00228 | 445 | RTF | Jan   |  train       | Metroline to home coming from Base1
00228 | 445 | RTF | Jan   |  train_s     | Standard train journey to Friends

たとえば、私は(それは異なりますが)これが欲しいでしょう:

RTF|Jan|Chicago   |Base1
RTF|Jan|Home      |Base1
RTF|Jan|NULL      |Friends

次に、その人(一意のIDはRTF)の意味を調べてBase1Friends適切な場所に置き換えます(「友達」のセットが1つしかない場合)。

RTF|Jan|Chicago   |Rockford
RTF|Jan|Home      |Rockword
RTF|Jan|NULL      |Milwaukee

必要なもの

最後の列からキーワードを選択する方法が必要です。たとえば、次のようになります。Base1からのメトロラインからホームへ

私が探している単語は3種類あります。

  1. 自宅の場所
    これらは既知であり、限られています。リストから取得できます
  2. ホームエイリアス
    これらは既知であり、制限されています。リストから取得できます
  3. 離れた場所
    これらは不明ですが、英国の都市/町など私は文字列でこれらを認識する方法がわかりません。これが私の主な問題です

私のアイデア

私が考えていたプログラムに行くのはでしたがawk、場所の名前に適切な名詞(つまり場所)が使用されている場所を確実に検索できるかどうかはわかりません。

標準的な場所のパッケージ、ライブラリ、または辞書はありますか?

スプレッドシートを調べて場所の名前を「学習」するプログラムを入手できますか?

これはすでに解決されている問題のようです(つまり、テキストの文字列から単語を見つける)が、私が何をしているのかはわかりません。私は初心者プログラマーにすぎません。

私にできることについて何か助けていただければ幸いです。

編集:

「US_Locations_Citiesはチェックできるものです」、「awkのファイルに記載されている文字列を...を使用してチェックする」、「プログラムが場所の名前を認識できるようにする言語Xのライブラリがあります。 RegExではありませんが、機能する可能性があります」、または「ここに場所名の辞書があります」で問題ありません。

最終的には、やりたいこと(つまり、場所の名前を取得すること)を実行するのに役立つものはすべて優れています。

4

3 に答える 3

3

申し訳ありませんが、これは 100% プログラム可能ではないと思います。最善の策は、いくつかの標準検索を定義することです。

  • Chicago to Base1
    [WORD] to [WORD]:
    "to" は固定で、前後の 1 つの単語を検索します。その前の単語がソースであり、ターゲットの後の単語です

  • Base1 [WORD] から [WORD] への Metroline からホーム
    へ: [WORD] からの [WORD]:
    ここで、「to」と「coming from」は固定されており、適切なスロットで 3 つの単語を探します。

ソースとターゲットを一致させることができる場合 ->
何かを一致させることができない場合は、その行に対してエラーをスローし、ユーザーに決定させるか、適切な修正をより適切に実装して、プログラムにその行を自動的に再評価させます。

これらは重要な目標です。検討:

  • 私たちの外の都市
  • 英語以外のテキスト エントリ
  • 略語

自動エラー修正のために、見つかった [WORD] を私たちまたは他の都市のリストと照合してみてください。都市が見つからない場合は、エラーをスローします。エラーが見つかった場合は、見つからなかった都市を都市リストに追加するか、都市名を公に知られている (公式の) 名前に変換してください。

于 2012-08-17T12:04:49.447 に答える
1

私が提案できる最良の方法は、場所がすべて米国の都市である限り、このような郵便番号のデータベースを使用できることです。

Friendsプログラムが次のようなものをどのように取得することを期待しているのかわかりませんBase1

于 2012-08-17T13:08:03.357 に答える
1

私は、現状ではプログラム可能ではないというハックティックに同意する必要があります。唯一の解決策は、言語またはプロトコルを発明することのようです。

簡単な実装は次のとおりだと思います。

  1. この言語には 2 つのキーワードがあります: toand (同様にキーワード同義語としてfrom割り当てることもできます)。atfrom
  2. これらのキーワードは、名前を認識するための「スキャン領域」として続く文字列の一部を定義します

私は最も単純なスキャンの実装のみを計画していますが、投稿の最後に示されているように、フォールバックを行うことができます.

  1. 実装には、「優先名」ハッシュがあり、そこに表示されるものに表示する名前を定義します。

    { Base1   => 'Rockford'
    , Friends => 'Milwaukee'
    , ...
    }
    
  2. 次のルールを使用して、キーワード間のテキストのチャンクで文章を作成できsplitます。

    A. キーワードがない場合、最初のチャンクが「from」の値として取得されます。A. このチャンクまたは後続のチャンクで、キーワードの場合、その値のその後の次のチャンクを保存
    ます。A. 各値は、値として保存される前に、優先フレーズを「スキャン」されます。

    my @chunks 
        = grep {; defined and ( s/^\s+//, s/\s+$//, length ) } 
          split /\b(from|to)\s+/i, $note
        ;
    my %parts = ( to => '', from => '' );
    my $key;
    do { 
        last unless my $chunk = shift @chunks;
        if ( $key ) { 
            $parts{ $key } = $preferred_title{ $chunk } // $chunk;
            $key = '';
        }
        elsif ( exists $parts{ lc $chunk } ) { 
            $key = lc $chunk;
        }
        elsif ( !$parts{from} ) { 
            $parts{from} = $preferred_title{ $chunk } // $chunk;
        }
    } while ( @chunks );
    say join( '|', $note, @parts{ qw<from to> } );
    

少なくとも、これらの値を収集して出力することで、今後の行動方針を決定するためのふるいを得ることができます。これは'home coming、' が 'from' ステートメントと同様に認識されることを示してい'Standard train journey'ます。

*'home coming'次のように正規表現を修正することで修正できます。

 /\b(?:(?:coming )?(from)|(to))\s+/i

そして、次のキーと値のペアを preferred_title ハッシュに追加できます。

home => 'Home'

を単純に定義する'Standard train journey' => ''ことも、パターンに適合する場合に文字列を意味のある値として拒否する拒否パターンのリストを作成することもできます。

ただし、値のリストをダンプして、データのスキャンを改良することができます。もう 1 つの考えは、場所の大文字 (「家」を除く) の使用とかなり一致しているように見えるということです。そのため、チャンクを

/\b(home|\p{Upper}.*)/

これはまだ'Standard train journey'適切な場所を考慮していることに注意してください。したがって、これは引き続き拒否ルールで処理する必要があります。

ここで繰り返しますが、これはデータをスキャンして、このシステムが位置と見なすものを「80/20」で理解できるようにするための最小限のアプローチである可能性があることを繰り返します。残りの 20 のうち 80% を処理するようにアルゴリズムを調整し、最悪の場合、ほんの一握りのエントリを変更するだけで済むようになるまで繰り返すことができます。

次に、旅行メモを作成する際に従う必要がある仕様があります。入力されたメモをスキャンして、「メモに宛先が見つかりません!」などの警告を表示することもできます。

于 2012-08-17T15:16:20.347 に答える