7

私はPythonチャットボットを書いています。手法が何であれ (レーベンシュタイン、LCS、正規表現など)、次のようMy name is [ A ].な文字列に一致するほどスマートなパターンが必要です。

My name is Tslmy.              #Distance should = 0, and groupdict()['a'] outputs "Tslmy"
My name is Tesla Tahomana.     #Distance should = 0(!), and groupdict()['a'] outputs "Tesla Tahomana"
my  naem ist tslmy .           #With a little typo, the distance = 5, and groupdict()['a'] outputs "tslmy "

モノ(実際に)がキャプチャgroupdict()['a']したものを参照するために使用させてください.[ A ](?P<identifier>match)

  • 他の方法では、省略/スキップ/空白/ネグレクトを含む「レーベンシュタイン」を探し、スキップされたものも選択します。
  • 別の方法では、パターンの厳密性を緩めることができるファジー(別名近似) 正規表現を探していgroupdict()ます。文字列に最もよく一致するパターン" 後で)。 これは、適切に管理されていれば「十分」であるため、推奨されるソリューションです。 ただし、最も近いソリューションであることがわかっている TRE ライブラリと REGEX ライブラリは、「あいまいさ」の値を提供していないようです。これが解決できれば、なおさらです!
    groupdict()

それは可能ですか?ご注意いただきありがとうございます。

アップデート:

最終的に強力な正規表現モジュールを使用することにしましたが、「ファジー値」を取得できませんでした。

このページの質問は理論的に解決されているため、追加しすぎると不名誉になります。そこで、この新しい問題について別の質問を提出しました。解決できることを願っています。

4

2 に答える 2

1

基本的な一致には正規表現を使用できます。

r"My name is (\w+){1,2}."

次に、TREライブラリを使用してバリエーションを許可します。

于 2013-06-10T04:54:55.393 に答える
0

DAT 正規表現 O_O

(?i)(?:(?:my|ym).?|.?(?:my|ym))\s+(?:.?(?:..me|n..e|na..) |(?:..me|n..e|na..).?)\s+(?:(?:is|si).?|.?(?:is|si))\s+(\w [\w\s] )\s

それを分割しましょう:

  • (?i):i大文字と小文字を区別しないように修飾子を設定します
  • (?:(?:my|ym).?|.?(?:my|ym)): これは一致しますmy, ym, My, Ym, may, amy etc...
  • \s+: 空白に 1 回以上一致
  • (?:.?(?:..am|n..e|na..)|(?:..am|n..e|na..).?): マッチname, naao, tame, lame, n99e, names, Naats etc...
  • \s+: 空白に 1 回以上一致
  • (?:(?:is|si).?|.?(?:is|si)): マッチis, si, ist, sit, siR etc...
  • \s+: 空白に 1 回以上一致
  • (\w[\w\s]*): 単語とスペースを 1 回以上一致させてグループ化します (単語で始まる必要があります\w)
  • \s*: ゼロ回以上の空白に一致

Online demo

于 2013-06-10T09:11:58.063 に答える