通过删除Python

时间:2016-12-13 06:15:20

标签: python python-3.x nltk

我有一系列短语出现在较大的文字中。我想强调这些短语,但我想首先压缩这些短语。我正在使用Python 3.5和NLTK进行大部分处理。

例如,如果我有句子:

  

快速的棕色狐狸跳过懒狗

和短语

  

棕色狐狸

     

快速的棕色狐狸

我希望生成的HTML看起来像

The <b>quick brown fox</b> jumped over the lazy dog

The <b>quick <b>brown fox</b></b> jumped over the lazy dog

似乎我应该能够创建某种列表理解,删除列表中其他项的子集,但我似乎无法完全理解它。关于如何折叠我的短语以删除其他条目的子集的任何想法?

2 个答案:

答案 0 :(得分:1)

如果条款列在清单中:

terms = ['brown fox', 'quick brown', 'quick brown fox']

我会通过检查term列表来创建一个子集列表,并收集列表中其他术语子集的所有术语:

subsets = []
for x in terms:
    for y in terms:
        if x in y and x != y:
            subsets.append(x)

或使用列表理解:

subsets = [x for x in terms for y in terms if x in y and x != y]

然后从术语列表中删除所有已知子集:

phrases = [x for x in terms if x not in subsets]

或单行(可能不推荐,因为它非常难以理解):

phrases = [z for z in terms if z not in [x for x in terms for y in terms if x in y and x != y]]

应该给你:

>>> print(phrases)
['quick brown fox']

答案 1 :(得分:1)

我认为最好的方法是编写自己的解析器。这种方式,而不是删除其他标签,我们根本不会插入它们。您可以逐个扫描句子中的字符,并将其与短语中的字符进行匹配。如果匹配,我们会在适当的位置插入标签。

我也按照长度的降序排列短语。因此可以自动避免嵌套标记。一旦匹配,将不会检查其他短语。

这是我的解析器:

#sentence is a string
#phrases are considered as list
def highlightphrases(sentence, phrases):
    phrases.sort(key=len, reverse=True)
    sentenceCharIndex = 0
    while sentenceCharIndex < len(sentence):
        for phrase in phrases:
            phraseCharIndex = 0
            while phraseCharIndex < len(phrase) and \
                  sentenceCharIndex + phraseCharIndex < len(sentence) and \
                  phrase[phraseCharIndex] == sentence[sentenceCharIndex + phraseCharIndex]:
                phraseCharIndex += 1
            if(phraseCharIndex == len(phrase)):
                sentence = sentence[:sentenceCharIndex+phraseCharIndex] +\
                           "</b>" + sentence[sentenceCharIndex+phraseCharIndex:]
                sentence = sentence[:sentenceCharIndex] +\
                           "<b>" + sentence[sentenceCharIndex:]
                sentenceCharIndex += phraseCharIndex + 6
                break;
        sentenceCharIndex+=1
    return sentence

注意:我基本上不是python程序员所以请不要介意代码是否破旧,请告诉我答案的语法是否可以改进。建议编辑。我是python的新手,仍然在学习各种方法,欢迎提出建议:)