-1

wwwjdicの例からEDICT辞書ファイルからデータを抽出しています:

相同器官 [そうどうきかん] /(n) homologous organ/
相同染色体 [そうどうせんしょくたい] /(n) homologous chromosome/
相同組換え [そうどうくみかえ] /(n) homologous recombination/
相同的組み換え [そうどうてきくみかえ] /(n) homologous recombination/
相同的組換 [そうどうてきくみかえ] /(n) homologous recombination/
相同的組換え [そうどうてきくみかえ] /(n) homologous recombination/
相入れない [あいいれない] /(iK) (exp,adj-i) in conflict/incompatible/out of harmony/running counter/mutually exclusive/clashing with/
相年 [あいどし] /(n,adj-no) the same age/
相伴 [しょうばん] /(n,vs) partaking/participating/taking part in/sharing (something with someone)/
相伴う [あいともなう] /(v5u) to accompany/
相判 [あいはん] /(n,vs) (1) official seal/verification seal/affixing a seal to an official document/(2) making a joint signature or seal/
相判 [あいばん] /(n) (1) medium-sized paper (approx. 15x21 cm, used for notebooks)/(2) medium-sized photo print (approx. 10x13 cm)/
相判 [あいばん] /(n,vs) (1) official

行は、各エントリがどの品詞であるかを指定します。つまり/(n)、名詞と/(adj)形容詞です。この配列で品詞のラベルが付けられたすべてのエントリを取得することに興味があります。

["n", "n-adv", "n-pref", "n-suf", "n-t", "num", "pn", "adj-no", "adj-f", "adv-n", "vs"] 

私はそのように行を分割しようとしています

file = File.open("EDICT.txt")
file.each_line do |line|
   if line[#Regex]
.
.

私は正規表現を使用していますが、私が得た最も遠いものは

/\/[(](n|n-adv|n-pref|n-suf|n-t|num|pn|adj-no|adj-f|adv-n|vs|n,vs)[)]/

これは堅牢ではありません。さらに、時々、次のようなタグがあります。

/(adj-no,n-adv,n-t)

正規表現と一致しません。同時に、次の用語と一致するべきではありません。

["adj-i", "adj-na", "adj-pn", "adj-t", "adj", "adv", "adv-to", "aux", "aux-v", "aux-adj", "conj",
"ctr", "exp", "int", "iv", "pref", "prt", "suf", "v1", "v2a-s", "v4h", "v4r", "v5", "v5argu", 
"v5b", "v5g", "v5k", "v5k-s", "v5m", "v5n", "v5r", "v5r-i", "v5s", "v5t", "v5u", "v5u-s", "v5uru",
"v5z", "vz", "vi", "vk", "vn", "vs-c", "vs-i", "vs-s", "vt"] 

/()行に必要なタグが含まれているかどうかを確認するためのより良い、より堅牢な方法は何ですか?

4

1 に答える 1

-1
class String
  Nouns = %w[n n-adv n-pref n-suf n-t num pn adj-no adj-f adv-n vs]
  def noun_entry?; self[%r{/\(([^)]+)\)}, 1].split(/,\s*/).&(Nouns).any? end
end

"相同器官 [そうどうきかん] /(n) homologous organ/".noun_entry?
# => true
"相判 [あいばん] /(n,vs) (1) official".noun_entry?
# => true
"ある単語 [あるたんご] /(adj-no,n-adv,n-t) .../".noun_entry?
# => true
"別の単語 [べつのたんご] /(ctr,exp,int) .../".noun_entry?
# => false
  • [^)]は何でもありません)
  • [^)]+を含まない空でないシーケンスです)
  • ([^)]+)このようなシーケンスをキャプチャします。
  • %r{/\(([^)]+)\)}/(とで囲まれたそのようなシーケンスを持つ正規表現です)
  • [regex, 1]一致の最初のキャプチャを取り出します。つまり、一致するものは何でも[^)]+
  • split(/,\s*/)そのシーケンスをコンマ (オプションで白い文字が続く) で区切り、配列に入れます。
  • &(Nouns)は、その配列と配列の交点を取りますNouns
  • any?交差点に何かあるかどうかを確認します。
于 2013-09-03T12:55:19.240 に答える