rcr*_*ick 5 comparison text haskell
我经常需要对具有区分大小写的不同要求的Data.Text值进行比较 - 当我使用chatter进行NLP任务时,这经常会出现.
例如,在搜索令牌以寻找信息提取任务时,我经常需要根据比标准字符串相等性更少限制的等式关系进行搜索.区分大小写是这些更改中最常见的,但它通常是特定标记的函数.像"激活"这样的术语通常可能是小写,但如果它是句子中的第一个单词,它将以一个主要资本开头,或者如果在标题文本中使用可能是全部大写或大写中句,那么忽略案例的比较是有道理的.相反,首字母缩略词(例如,"US")具有取决于大小写的不同语义.
这就是说我不能轻易地为每个相等类创建一个类型类包装器,因为它是一个价值驱动的方面.(所以不区分大小写的包看起来不像它会起作用).
到目前为止,我正在使用toLower
规范表示,并比较这些表示,以便我可以创建带有敏感性标记的文本比较函数的自定义版本,例如:
matches :: CaseSensitive -> Text -> Text -> Bool
matches Sensitive x y = x == y
matches Insensitive x y = (T.toLower x) == (T.toLower y)
Run Code Online (Sandbox Code Playgroud)
但是,我担心这需要额外传递输入文本.我可以想象它在某些情况下融合,但可能不是全部(例如:T.isSuffixOf,T.isInfixOf).
有一个更好的方法吗?
如果比较的风格是由所比较事物的语义驱动的,那么将这些语义与实际文本一起传递是否有意义?然后,您还可以在适当的情况下进行标准化,以避免以后重复传递:
data Token = Token CaseSensitive Text -- Text is all lower-case if Insensitive
deriving Eq
Run Code Online (Sandbox Code Playgroud)
也许定义一个智能构造函数:
token Sensitive t = Token Sensitive t
token Insensitive t = Token Insensitive (T.toLower t)
Run Code Online (Sandbox Code Playgroud)
这意味着首字母缩略词“US”永远不会与单词“us”相比,但这似乎是合乎逻辑的。
您还可以使用更详细的内容标记值,例如首字母缩略词/单词/... 而不仅仅是Sensitive
/ Insensitive
。