Data.Text的区分大小写/不敏感的比较?

时间:2014-07-02 14:32:08

标签: haskell text comparison

我经常需要对具有不同的区分大小写要求的Data.Text值进行比较 - 当我使用chatter进行NLP任务时,这种情况经常出现。

例如,在搜索令牌以寻找信息提取任务时,我经常需要根据比标准字符串相等性更少限制的等式关系进行搜索。区分大小写是这些更改中最常见的,但它通常是特定令牌的功能。像"激活"这样的术语通常可能是小写,但如果它是一个句子中的第一个单词,它将以一个主要资本开头,或者如果在标题文本中使用可能是全部大写或大写中句,那么忽略案例的比较是有道理的。相反,首字母缩略词(例如," US")根据大小写具有不同的语义。

这就是说我不能轻易地为每个相等级创建一个类型类包装器,因为它是一个价值驱动的方面。 (因此case-insensitive包看起来不会起作用)。

到目前为止,我使用toLower进行规范表示,并比较这些表示,以便创建带有敏感度标记的文本比较函数的自定义版本,例如:

matches :: CaseSensitive -> Text -> Text -> Bool
matches Sensitive   x y = x == y
matches Insensitive x y = (T.toLower x) == (T.toLower y)

但是,我担心这需要额外传递输入文本。我可以想象它在某些情况下融合,但可能并非全部(例如:T.isSuffixOf,T.isInfixOf)。

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

如果比较的样式是由被比较的东西的语义驱动的,那么通过这些语义传递实际文本是否有意义?然后,您也可以在适当的时候进行标准化,以避免以后重复传递:

data Token = Token CaseSensitive Text -- Text is all lower-case if Insensitive
    deriving Eq

并且可能定义一个智能构造函数:

token Sensitive t = Token Sensitive t
token Insensitive t = Token Insensitive (T.toLower t)

这意味着首字母缩略词“US”永远不会与“我们”这个词相提并论,但这似乎是合乎逻辑的。

您也可以使用更为详细的内容标记值,例如首字母缩略词/ word / ...而不仅仅是Sensitive / Insensitive