【问题标题】:Replace apostrophe/short words in python在python中替换撇号/短词
【发布时间】:2017-08-18 11:39:21
【问题描述】:

我正在使用 python 来清理给定的句子。假设我的句子是:

What's the best way to ensure this?

我要转换:

What's -> What is

同样,

 must've -> must have

还有,动词原形,

told -> tell

单数到复数,依此类推。

我目前正在探索 textblob。但并非所有以上都可以使用它。

【问题讨论】:

  • 您实际上还没有问过问题。但是,如果您要求图书馆推荐,那么这对 SO 来说是题外话。

标签: python nlp textblob


【解决方案1】:

如果你想自己滚动,你可以用它来做收缩映射:

http://alicebot.blogspot.com/2009/03/english-contractions-and-expansions.html

这用于动词替换:

http://www.lexically.net/downloads/BNC_wordlists/e_lemma.txt

对于后者,您可能希望生成一个反向字典,将所有共轭形式映射到它们的原始形式(也许请记住,可能存在模棱两可的形式,因此请务必检查并正确处理它们)。

【讨论】:

  • 感谢您的帮助。我想使用英语收缩和扩展。
  • spacy 可以将缩略词扩展为两个词
【解决方案2】:

对于第一个问题,没有一个直接的模块可以为你做这件事,所以你必须自己构建,首先你需要一个像这样的收缩字典:

contractions = {
"ain't": "am not / are not",
"aren't": "are not / am not",
"can't": "cannot",
"can't've": "cannot have",
"'cause": "because",
"could've": "could have",
"couldn't": "could not",
"couldn't've": "could not have",
"didn't": "did not",
"doesn't": "does not",
"don't": "do not",
"hadn't": "had not",
"hadn't've": "had not have",
"hasn't": "has not",
"haven't": "have not",
"he'd": "he had / he would",
"he'd've": "he would have",
"he'll": "he shall / he will",
"he'll've": "he shall have / he will have",
"he's": "he has / he is",
"how'd": "how did",
"how'd'y": "how do you",
"how'll": "how will",
"how's": "how has / how is",
"i'd": "I had / I would",
"i'd've": "I would have",
"i'll": "I shall / I will",
"i'll've": "I shall have / I will have",
"i'm": "I am",
"i've": "I have",
"isn't": "is not",
"it'd": "it had / it would",
"it'd've": "it would have",
"it'll": "it shall / it will",
"it'll've": "it shall have / it will have",
"it's": "it has / it is",
"let's": "let us",
"ma'am": "madam",
"mayn't": "may not",
"might've": "might have",
"mightn't": "might not",
"mightn't've": "might not have",
"must've": "must have",
"mustn't": "must not",
"mustn't've": "must not have",
"needn't": "need not",
"needn't've": "need not have",
"o'clock": "of the clock",
"oughtn't": "ought not",
"oughtn't've": "ought not have",
"shan't": "shall not",
"sha'n't": "shall not",
"shan't've": "shall not have",
"she'd": "she had / she would",
"she'd've": "she would have",
"she'll": "she shall / she will",
"she'll've": "she shall have / she will have",
"she's": "she has / she is",
"should've": "should have",
"shouldn't": "should not",
"shouldn't've": "should not have",
"so've": "so have",
"so's": "so as / so is",
"that'd": "that would / that had",
"that'd've": "that would have",
"that's": "that has / that is",
"there'd": "there had / there would",
"there'd've": "there would have",
"there's": "there has / there is",
"they'd": "they had / they would",
"they'd've": "they would have",
"they'll": "they shall / they will",
"they'll've": "they shall have / they will have",
"they're": "they are",
"they've": "they have",
"to've": "to have",
"wasn't": "was not",
"we'd": "we had / we would",
"we'd've": "we would have",
"we'll": "we will",
"we'll've": "we will have",
"we're": "we are",
"we've": "we have",
"weren't": "were not",
"what'll": "what shall / what will",
"what'll've": "what shall have / what will have",
"what're": "what are",
"what's": "what has / what is",
"what've": "what have",
"when's": "when has / when is",
"when've": "when have",
"where'd": "where did",
"where's": "where has / where is",
"where've": "where have",
"who'll": "who shall / who will",
"who'll've": "who shall have / who will have",
"who's": "who has / who is",
"who've": "who have",
"why's": "why has / why is",
"why've": "why have",
"will've": "will have",
"won't": "will not",
"won't've": "will not have",
"would've": "would have",
"wouldn't": "would not",
"wouldn't've": "would not have",
"y'all": "you all",
"y'all'd": "you all would",
"y'all'd've": "you all would have",
"y'all're": "you all are",
"y'all've": "you all have",
"you'd": "you had / you would",
"you'd've": "you would have",
"you'll": "you shall / you will",
"you'll've": "you shall have / you will have",
"you're": "you are",
"you've": "you have"
}

然后编写一些代码来根据字典修改你的文本,如下所示:

text="What's the best way to ensure this?"
for word in text.split():
    if word.lower() in contractions:
        text = text.replace(word, contractions[word.lower()])
print(text)

关于改变动词时态的第二个问题,nodebox's linguistics library 非常受欢迎,强烈推荐用于此类任务。在downloading their zip file之后,解压并复制到python的site-package目录下。完成后,您可以编写如下内容:

import en
for word in text.split():
    if en.is_verb(word.lower()):
        text = text.replace(word, en.verb.present(word.lower()))
print text

注意:此库仅适用于 Python 2,因为它尚不支持 Python 3。

【讨论】:

  • 似乎更快地改变所有'必须拥有,'将要,'将要,等等......或者我错过了什么?
  • @Totem 这就是我在下面的回答中所做的
  • 我有相同的方法来扩大收缩,但我对“属于”也以“'s”结尾的收缩感到震惊。例如,他正在驾驶汤姆的车。这里应该有什么规则?要考虑的两个选项是用空字符替换 's 或将其转换为像 tom's -> tom is 这样的规则。这类词怎么解决?
【解决方案3】:

上面的答案将非常有效,并且对于模棱两可的收缩可能更好(尽管我认为没有那么多模棱两可的情况)。我会使用更易读、更容易维护的东西:

import re

def decontracted(phrase):
    # specific
    phrase = re.sub(r"won\'t", "will not", phrase)
    phrase = re.sub(r"can\'t", "can not", phrase)

    # general
    phrase = re.sub(r"n\'t", " not", phrase)
    phrase = re.sub(r"\'re", " are", phrase)
    phrase = re.sub(r"\'s", " is", phrase)
    phrase = re.sub(r"\'d", " would", phrase)
    phrase = re.sub(r"\'ll", " will", phrase)
    phrase = re.sub(r"\'t", " not", phrase)
    phrase = re.sub(r"\'ve", " have", phrase)
    phrase = re.sub(r"\'m", " am", phrase)
    return phrase


test = "Hey I'm Yann, how're you and how's it going ? That's interesting: I'd love to hear more about it."
print(decontracted(test))
# Hey I am Yann, how are you and how is it going ? That is interesting: I would love to hear more about it.

它可能有一些我没有想到的缺陷。

【讨论】:

  • +1 我喜欢这种方法。我发现的一个很容易修复的错误是“不能”得到变成“不能”;一个可能的解决方法是在特定下添加phrase = re.sub(r"can\'t", "can not", phrase)
  • @gionni 谢谢我一定(错误地)认为不能是这种情况的一个例子:phrase = re.sub(r"\'t", " not", phrase)。但是你绝对是对的,因为第一种情况,它最终会出现在 ca 中。感谢您指出,我已经更新了我的答案!
  • 我认为需要在细节中添加以下词语:ain't,shan't,sha'n't,ma'am,y'all
  • 这不是把'my comment'变成amy comment'吗?
  • 确实,单引号只能用在双引号内。像“她说:'我的评论'”之类的东西。这是相当罕见的。但如果你碰巧有很多嵌套引号的文本,那么这不是一个好主意。或者,您可以拥有一个仅替换引用块“...”之外的缩略词的 RE。
【解决方案4】:

这可能不适合您的特定解决方案,但(就一般知识而言)有一个很棒的开源软件库,名为Spacy。它使类似情况下的生活更轻松。演示:

texts = ["what's", "must've", "told"]

for text in texts:
   doc = nlp(text)
   lemmatized_text = ' '.join([token.lemma_ for token in doc])
   print(lemmatized_text)

输出:

what be
must have
tell

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2014-07-22
    • 2013-01-04
    相关资源
    最近更新 更多