навигация по поиску текстовых файлов в Python - PullRequest
1 голос
/ 04 февраля 2012

Вот пример текстового файла, с которым я работаю:

<Opera>

Tristan/NNP
and/CC
Isolde/NNP
and/CC
the/DT
fatalistic/NN
horns/VBZ
The/DT
passionate/JJ
violins/NN
And/CC
ominous/JJ
clarinet/NN
;/:

Заглавные буквы после косой черты - странные теги.Я хочу иметь возможность искать в файле что-то вроде "NNP,CC,NNP" и чтобы программа возвращала для этого сегмента "Tristan and Isolde" три слова в строке, соответствующие этим тэгам в строке.

Проблема, с которой я столкнулся, заключается в том, что я хочу, чтобы строка поиска вводилась пользователем, поэтому она всегда будет отличаться.
Я могу прочитать файл и найти одно совпадение, но не знаю, как отсчитать в обратном направлении отэтой точки, чтобы напечатать первое слово или как определить, соответствует ли следующий тег.

Ответы [ 3 ]

1 голос
/ 04 февраля 2012

Создание регулярного выражения динамически из списка тегов, которые вы хотите найти:

text = ("Tristan/NNP and/CC Isolde/NNP and/CC the/DT fatalistic/NN horns/VBZ "
    "The/DT passionate/JJ violins/NN And/CC ominous/JJ clarinet/NN")

tags = ["NNP", "CC", "NNP"]
tags_pattern = r"\b" + r"\s+".join(r"(\w+)/{0}".format(tag) for tag in tags) + r"\b"
# gives you r"\b(\w+)/NNP\s+(\w+)/CC\s+(\w+)/NNP\b"

from re import findall
print(findall(tags_pattern, text))
1 голос
/ 04 февраля 2012
>>> import re 
>>> s = "Tristan/NNP and/CC Isolde/NNP and/CC the/DT fatalistic/NN horns/VBZ The/DT passionate/JJ violins/NN And/CC ominous/JJ clarinet/NN ;/:"
>>> re.findall("(\w+)/NNP (\w+)/CC (\w+)/NNP", s)
[('Tristan', 'and', 'Isolde')]

Точно так же вы можете делать то, что вам нужно.

РЕДАКТИРОВАТЬ: более обобщенно.

>>> import re
>>> pattern = 'NNP,CC,NNP'
>>> pattern = pattern.split(",")
>>> p = ""
>>> for i in pattern:
...     p = p + r"(\w+)/"+i+ r"\n"
>>> f = open("yourfile", "r")
>>> s = f.read()
>>> f.close()
>>> found = re.findall(p, s, re.MULTILINE)
>>> found #Saved in found
[('Tristan', 'and', 'Isolde')]
>>> found_str = " ".join(found[0]) #Converted to string
>>> f = open("written.txt", "w")
>>> f.write(found_str)
>>> f.close()
0 голосов
/ 04 февраля 2012

Похоже, ваш исходный текст был создан с помощью Natural Language Toolkit (nltk) .

Используя nltk, вы можете токенизировать текст, разделить токен на (word, part_of_speech) кортежии переберите ngram, чтобы найти те, которые соответствуют шаблону:

import nltk
pattern = 'NNP,CC,NNP'
pattern = [pat.strip() for pat in pattern.split(',')]
text = '''Tristan/NNP and/CC Isolde/NNP and/CC the/DT fatalistic/NN horns/VBZ
          The/DT passionate/JJ violins/NN And/CC ominous/JJ clarinet/NN ;/:'''
tagged_token = [nltk.tag.str2tuple(word) for word in nltk.word_tokenize(text)]
for ngram in nltk.ingrams(tagged_token,len(pattern)):
    if all(gram[1] == pat for gram,pat in zip(ngram,pattern)):
        print(' '.join(word for word, pos in ngram))      

приводит к

Tristan and Isolde

Ссылка по теме:

...