.NET 用の自然言語日付/時刻パーサー?[閉まっている]
質問
次のような .NET 日付/時刻パーサーを知っている人はいますか? Ruby のクロニック (「明日」や「来週木曜日の午後 3 時」などを処理します)?
注記:私は Ruby を書いていますが (Chronic についてはそのように知っています)、このプロジェクトでは .NET を使用する必要があります。
解決
私たちは社内プロジェクトでまさにお客様が求めているものを開発しました。十分な必要性があれば公開したいと考えております。詳細については、このブログをご覧ください。 http://precisionsoftwaredesign.com/blog.php.
ご興味がございましたら、お気軽にお問い合わせください:contact@precisionsoftware.us
このライブラリは現在、SourceForge プロジェクトです。ページは次の場所にあります。
http://www.SourceForge.net/p/naturaldate
アセンブリはダウンロード セクションにあり、ソースは Mercurial で入手できます。
他のヒント
Chronic の .NET ポートが存在します。見る https://github.com/robertwilczynski/nChronic. 。いくつかの改善とバグ修正を加えたフォークを作成しました。ここにあります。 https://github.com/dorony/nChronic (プルリクエストを送信しましたが、作成者はまだ応答していません)。
@ブレア・コンラッド – 良いアイデアですね!IronRuby で Chronic を実行しようとしましたが、依存関係でいくつかの問題が発生しました。まだ準備ができているかどうかはわかりません。
でプロジェクトを見つけました コードプレックス (DateTime英語パーサー)同じことをしようとしています。まだ何年も時間もかかりませんが、良いスタートです。私はこのプロジェクトに少し取り組み、書かれた数字をより適切に処理するためのパッチを提供しました。
これは興味深い問題であり、正規表現をより深く理解するのに間違いなく役立ちましたので、引き続き取り組んでいきたいと思います。
ありました 似たようなスレッド 以前に、あなたが望むことを行うと思われるCodeProjectのライブラリへのリンクを提供しました。 http://www.codeproject.com/KB/edit/dateparser.aspx しかし残念なことに、このライブラリは MFC で書かれているようですので、そこから DLL を作成して、.NET プログラムから呼び出す必要があります。
Palmsey さん、私もつい最近同じ要求があったので、簡単なパーサーを作成してみました。あまり優れたコードではありませんが、次のような処理を行います。
「今日の午後2時」「火曜日午後2時 - 2010年7月15日午前2時」「前年の午前2時 - 2010年7月18日午後2時45分」
おそらく他の誰かが役立つと思うので、codeplex に貼り付けてください。それをチェックしてください: http://timestamper.codeplex.com/
いくつかのフレームワークとPythonをチェックしました 解析日時 最高に働きました。IronPython を使用して .NET から使用できます。
完全なサンプル プロジェクトに興味がある人は、回答にコメントしてください。作成してみます。
編集
リクエストに応じて、ライブラリで使用できる簡単なプロジェクトを次に示します。
http://www.assembla.com/code/relativedateparser/subversion/nodes
たとえば、次の使用例を試してください。
- 2008 年 8 月 25 日
- 2008 年 8 月 25 日
- 8月25日午後5時
- 8月25日午後5時
- 次の土曜日
- 明日
- 次の木曜日の午後4時
- 午後4時に
- エオド
- 明日は
- 火曜日
- オイ
- オム
- 5分以内に
- 今から 5 分後
- 今から5時間前
- 正午の2時間前
- 明日から2日間
私はそれを知りませんでしたが、素晴らしい問題のように思えたので、これに私が取り組んだ方法を示します (VB.NET)。
Private Function ConvertDateTimeToStringRelativeToNow(ByVal d As DateTime) As String
Dim diff As TimeSpan = DateTime.Now().Subtract(d)
If diff.Duration.TotalMinutes < 1 Then Return "Now"
Dim str As String
If diff.Duration.TotalDays > 365 Then
str = CInt(diff.Duration.TotalDays / 365).ToString() & " years"
ElseIf diff.Duration.TotalDays > 30 Then
str = CInt(diff.TotalDays / 30).ToString() & " months"
ElseIf diff.Duration.TotalHours > 24 Then
str = CInt(diff.Duration.TotalHours / 24) & " days"
ElseIf diff.Duration.TotalMinutes > 60 Then
str = CInt(diff.Duration.TotalMinutes / 60) & " minutes"
Else
str = CInt(diff.Duration.TotalMinutes).ToString() & " minutes"
End If
If str.StartsWith("1") Then str = str.SubString(0, str.Length - 1)
If diff.TotalDays > 0 Then
str &= " ago"
Else
str &= " from now"
End If
Return str
End Function
実際には、既存のものほど洗練されていませんが、おそらく問題なく動作すると思います。良い拡張メソッドになるかもしれません。
@バートン:少なくともリンク先のページの例からすると、彼は別の意味で言ったのだと思います。
Chronic.parse('tomorrow')
#=> Mon Aug 28 12:00:00 PDT 2006
Chronic.parse('monday', :context => :past)
#=> Mon Aug 21 12:00:00 PDT 2006
Chronic.parse('this tuesday 5:00')
#=> Tue Aug 29 17:00:00 PDT 2006
気づくまでは私も挑戦してみようと思ってました!(実装は良いですが)