1

私のWebアプリケーションでは、英語アラビア語の2つの異なる言語を使用しています。

Webアプリケーションに検索ボックスがあり、名前または名前の一部で検索すると、ユーザーの「出身地」を比較してDBから値を取得します。

説明:

ユーザーが故郷「California」に属し、「Victor」という名前を検索した場合、私のクエリでは、最初に同じ故郷「California」を持っている人と、 「California」を故郷として持っている人のリストが表示されます。 「Victor」 * name *が検索され、 「California」出身地で、「victor」が名前または名前の一部に含まれているユーザーが取得されます。

問題は、故郷の「カリフォルニア」英語で保存されている場合、値を比較して取得することです。ただし、「California」アラビア語で「كاليفورنيا」として保存されます。この場合、故郷の比較は失敗し、値を取得できません。

クエリで両方が同じ故郷を見つけて値を取得する必要があります。出来ますか?

比較のために、このロジックについてどのような代替案を考えるべきか。私は混乱しています。何か提案はありますか?

編集: *私は、故郷が得られた場合、Googleの翻訳者または翻訳者を使用して、故郷を別の言語に変更することが可能であるという考えを持っています。英語の場合はアラビア語に、英語の場合はアラビア語に、両方を結合した検索結果を表示します。なにか提案を?*

4

6 に答える 6

6

発生する問題は、2つ以上の言語の情報が必要であり、アプリケーションのユーザーが両方の言語を使用できるようにすることです。考えられるアプローチの1つは、アイテムごとに複数のレコードを保持し、主キーの一部として言語コードを含めることです。たとえば、レコードが

id   hometown   name
001  California Victor

言語コードを導入して保存することができます

id   lang hometown   name
001  en   California Victor
001  ar   كاليفورنيا Victor

次に、検索は「California」または「كاليفورنيا」のいずれかに一致し、ID 001が得られます。これを使用して、データのすべての翻訳(または現在の出力言語のデータのみ)をロードできます。このscemeは、言語の数と、テーブルを事前に入力する必要がないという追加の利点があります。レコードが知られるようになったときに、レコードに新しい翻訳を追加できます。

(警告:あなたのアラビア語の文字列を繰り返しただけで、それを読むことができません。また、「ar」はおそらくアラビア語の正しい言語コードではありませんが、あなたはその考えを理解しています。)

于 2010-11-26T18:35:30.863 に答える
3

アラビア語は「カリフォルニア」のように聞こえますか?もしそうなら、あなたは「音のような」基準で比較する必要があるでしょう、それはおそらく音素変換をもたらすでしょう。

于 2010-11-26T18:25:58.243 に答える
2

検索のためにすべての名前を同じ言語(英語など)に音訳し、レーベンシュタイン編集距離を使用して、名前の音声表現間の類似性を計算します。クエリをすべての名前と単純に比較すると、これは遅くなりますが、データベース内のすべての地名をBurkhard-Kellerツリーに事前にインデックス付けすると、クエリ用語からの距離を編集することで効率的に検索できます。

この手法を使用すると、実際に一致する名前で名前を並べ替えることができます。メタフォンやダブルメタフォンを使用するよりも、この方法で一致するものを見つける可能性が高くなりますが、これは実装がより困難です。

于 2010-11-26T19:21:45.830 に答える
1

あなたのグーグルの提案もそれは良いものかもしれないように聞こえますが、あなたはそれをいじってみて、あなたがその正確さに満足していることを確認するべきです。ヘブライ語と英語の間でどのように機能するかをテストしたところ、ヘブライ語に翻訳するときに、Googleが英語の地名を英語の文字のままにしておくことがあることに気付きました。

于 2010-11-28T00:42:58.893 に答える
0

クライアント側でローカリゼーションを使用して値を表示するのはどうですか。または、Californiaのインスタンスが「California」と「كاليفورنيا」の両方に対して返す方法でオーバーライドする、故郷のラッパークラスを作成します(ここで間違えた場合は、上からコピーして貼り付けてください)。equal(Object)true

于 2010-11-26T18:30:18.470 に答える
0

これは、古典的なエンコーディングの問題のように聞こえます。非ASCII文字を転送するときは常に、正しくエンコードされていることを確認する必要があります。アラビア語と英語の場合、 UTF-8を使用できると思います(ただし、アラビア語はわからないため、間違っている可能性があります)。

セットアップでは、おそらく次の点があります。

Browser <-> Servlet container <-> Database
                   |
                System.out

文字(16ビット)がバイト(8ビット)に変換されるシステムインターフェイスでは、エンコーディングが正しいことを確認する必要があります。

ブラウザからサーブレットコンテナへ

WebページからGETまたはPOSTリクエストを実行すると、ブラウザは1)サーバーからのHTTPヘッダー、特に、Content-Type: text/html; charset=UTF-8存在する場合はHTMLメタヘッダーをオーバーライドするHTTPヘッダーを確認します<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">

サーブレットコンテナ側では、HttpServletRequest.getParameter()に、サーバー設定で設定する必要がある可能性が最も高いエンコーディングが含まれます。

tomcatのserver.xmlの例

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
           maxThreads="2000"                
           connectionTimeout="20000" 
           redirectPort="8443" />

データベースへのサーブレットコンテナ

データベースには正しいエンコーディングが必要です。そうでないと、並べ替えなどが正しくありません。

MySQLのmy.cnfの例

[mysqld] 
 ....
init_connect=''SET collation_connection = utf8_general_ci'' 
init_connect='SET NAMES utf8' 
default-character-set=utf8 
character-set-server = utf8 
collation-server = utf8_general_ci 

[mysql] 
 ....
default-character-set=utf8 

次に、JDBCドライバーをUTF-8に設定する必要があります。

JDBC接続文字列の例

jdbc:mysql://localhost:3306/rimario?useUnicode=true&characterEncoding=utf-8

System.out

System.out.printnln()物事を検証するために信頼することはできません。まず、System.propertyを使用して設定されたjava vmのデフォルトのエンコーディングに依存します-Dfile.encoding=UTF-8。次に、System.outを実行する端末を、UTF-8に設定してサポートする必要があります。System.outを信用しないでください!

VM内の文字列が適切な文字になると、エンコーディングの影響を受けなくなります。メモリ内では、文字列内のすべての文字は16ビットであり、utf-8がエンコードできるすべての文字を(ほぼ)カバーします。文字列をファイルに書き込み、ファイルを調べて、VMに正しい文字が含まれているかどうかを実際に知ることができます。

于 2010-11-26T18:51:49.443 に答える