Python 如何从杂乱的字符串中提取有意义的单词?

Python 如何从杂乱的字符串中提取有意义的单词?,python,regex,nlp,Python,Regex,Nlp,考虑如下字符串,如何提取任何有意义的单词 ctl00_PD_lblProductTitle ---> 'Product Title' (ct100_PD_lbl is not a complete word, ignore) prod-detail-info ---> 'Detail Info' (prod is not a complete word, ignore) prodprice price-onsale ---> 'price on sale' (prod is

考虑如下字符串,如何提取任何有意义的单词

ctl00_PD_lblProductTitle ---> 'Product Title' (ct100_PD_lbl is not a complete word, ignore)

prod-detail-info ---> 'Detail Info' (prod is not a complete word, ignore)

prodprice price-onsale ---> 'price on sale' (prod is not a complete word, ignore)

rating-score ---> 'Rating Score'

RatingScore ---> 'Rating Score' 
很想知道这叫做什么技术或过程,以及任何库(如果有的话)。正则表达式是否足够健壮?

我建议:

  • 提取所有单词(字母序列-这将包括诸如ProductTitle之类的复合词),即将所有非字母的单词分组。正则表达式类似于
    ([a-zA-Z])+?)
    <代码>+?表示不贪婪
  • 对于每个单词,请在英语词典数据库中查找该单词。如果有匹配项,则转到下一个单词。如果没有,请转至步骤3
  • 如果不匹配,则尝试在复合词中查找多个单词,例如ProductTitle->Product Title。这不是一项简单的任务,需要决策树类型的操作和回滚能力。看看,看看
  • 我建议:

  • 提取所有单词(字母序列-这将包括诸如ProductTitle之类的复合词),即将所有非字母的单词分组。正则表达式类似于
    ([a-zA-Z])+?)
    <代码>+?表示不贪婪
  • 对于每个单词,请在英语词典数据库中查找该单词。如果有匹配项,则转到下一个单词。如果没有,请转至步骤3
  • 如果不匹配,则尝试在复合词中查找多个单词,例如ProductTitle->Product Title。这不是一项简单的任务,需要决策树类型的操作和回滚能力。看看,看看

  • 简而言之,您提供的示例无法按照您希望的方式进行评估,除非您将决策树或分类器倾斜到特定数据。(例如,考虑数字2和3。Prod是任何英语词典中的一个词,但信息不一定会出现在大多数英语词典中。)

    如果您在这些特定数据上训练分类器或决策树,只有这样您才能得到想要的结果。但一般来说,您可以尝试首先标记文本(正如@user2314737所建议的):

    然后,您可能会找到更多具有正则表达式的可能单词,例如:

    >>> re.findall(r'[A-Z][a-z]{2,}', 'ctl00_PD_lblProductTitle')  # also works for 'RatingScore'
    ['Product', 'Title']
    
    此正则表达式将查找以大写字母开头,然后后跟2个或更多小写字母的所有序列。关于您的评论,不,此正则表达式不适用于unicode。不幸的是,Python中的正则表达式目前无法以相同的方式区分大小写。在这种情况下,您可能需要这样的东西(我很快就把它拼凑起来了,没有花时间让它变得漂亮):


    然后,正如@acarlon所建议的,您将开始需要对照字典检查子字符串(例如)。但即便如此,你也会发现“意义”可能是没有人想要传达的。此外,您将发现您不感兴趣的单词(如prod)。

    简而言之,您提供的示例无法按照您希望的方式进行评估,除非您将决策树或分类器倾斜到特定数据。(例如,考虑数字2和3。Prod是任何英语词典中的一个词,但信息不一定会出现在大多数英语词典中。)

    如果您在这些特定数据上训练分类器或决策树,只有这样您才能得到想要的结果。但一般来说,您可以尝试首先标记文本(正如@user2314737所建议的):

    然后,您可能会找到更多具有正则表达式的可能单词,例如:

    >>> re.findall(r'[A-Z][a-z]{2,}', 'ctl00_PD_lblProductTitle')  # also works for 'RatingScore'
    ['Product', 'Title']
    
    此正则表达式将查找以大写字母开头,然后后跟2个或更多小写字母的所有序列。关于您的评论,不,此正则表达式不适用于unicode。不幸的是,Python中的正则表达式目前无法以相同的方式区分大小写。在这种情况下,您可能需要这样的东西(我很快就把它拼凑起来了,没有花时间让它变得漂亮):


    然后,正如@acarlon所建议的,您将开始需要对照字典检查子字符串(例如)。但即便如此,你也会发现“意义”可能是没有人想要传达的。此外,您将发现您不感兴趣的单词(如prod)。

    示例二:“prod详细信息”-->“Rod详细信息”。我想您必须更详细地定义问题和预期结果。示例二:“产品详细信息”-->“棒详细信息”。我想你必须更详细地定义问题和预期结果。@Nabla。是的,这就是第三步的用武之地。@Nabla。是的,这就是第三步。我用一个手工制作的非常简单的马尔可夫链来解决这样的问题。我很好奇,你会用什么具体的分类器来解决这个问题?@dsign Markov链在这里可以很好地工作,因为单词(或事件)似乎是相关的,并且可能是一种(或两种)类型的特征,尽管我猜该模型(或任何其他)的成功取决于OP有多少数据。但也许你正在考虑从更微观的层面对文本进行分类(这可能会识别英语中常见的语素,并呈现可能的组合)。许多单词似乎也是名词或形容词,因此词性标记也可能是决策树的一个组成部分。我没怎么考虑过这种问题。谢谢!pos-tagger这个术语对我来说是新的,pos-classification当然可以帮助我。这个正则表达式到底做了什么?我认为正则表达式解决方案可能足够好,然后通过拼写检查程序运行它,但它对其他语言(如芬兰语或汉语)有效吗?@Kim Jong-Woo查看我上面的编辑。我已经解释了正则表达式,并为使用ascii以外字符的语言提供了另一种选择。我使用手工制作的非常简单的马尔可夫链来解决这样的问题。我很好奇,什么
    >>> def split_at_uppercase(text):
        result = []
        new_word = []
        for char in text:
            if char.isupper():
                if new_word:
                    result.append(''.join(new_word))
                new_word = []
                new_word.append(char)
            elif new_word and char == ' ':  # in more complicate scenarios, may need to use regex for white space
                result.append(''.join(new_word))
                new_word = []
            elif char != ' ':
                new_word.append(char)
        else:
            result.append(''.join(new_word))
        return result
    
    >>> t = 'καὶ τοῦΠιλάτου εἰςἹεροσόλυμα'
    >>> split_at_uppercase(t)
    ['καὶ', 'τοῦ', 'Πιλάτου', 'εἰς', 'Ἱεροσόλυμα']