Подсчет совпадений из словарного файла в окне, окружающем ключевое слово

Для своего исследования я пытаюсь подсчитать из корпуса, сколько раз (совпадение) ряд составных терминов (например, «Опасность безопасности»), хранящихся в файле, по 1 строке на фразу, появляется в окне из 16 слов целевое ключевое слово (например, Facility). Я не программист, я пытался разбить его на 2 элемента: сначала извлеките файл из корпуса, где у меня есть совпадение по моему целевому ключевому слову, с 8 словами до и после. Затем попытайтесь сопоставить мой «словарный файл» с этим отрывком. Я нахожусь в части 1, пробовал это, но я просто получаю сообщение ‹_sre.SRE_Match по адресу 0x028FFE78> и изо всех сил пытаюсь использовать repr: Любые предложения приветствуются или другие способы сделать это. В конечном счете, мне нужен файл экспорта, в котором есть слова из моего словаря со счетом после них, указывающим, как часто они были найдены в этом окне с моим целевым словом. Использование логики re.search основано на том, что я нашел на этой доске объявлений, поэтому я попробовал это:

input=open("Corpus.txt", "r")
matches=[]
lines=input.readlines()
for line in lines:
  m=re.search(r'(\S+\s+){0,8}facility(\s+\S+){0,8}',line)
  if m:
    matches.append(m)
    for m in matches:
      output.write(str(m))
      output.close()

Любая помощь приветствуется, Пол


person Paul    schedule 03.06.2013    source источник
comment
Это похоже на python, за исключением отступов .... что это за язык, не могли бы вы добавить эту информацию в свои теги? Вы также можете уточнить, означает ли окно из 16 слов {8 слов }‹поисковый запрос› {еще 8 слов} или это гибкое окно.   -  person tink    schedule 04.06.2013
comment
Спасибо за ответ тинк. Извините, мой первый пост здесь. Да, это Python, добавлен Python в качестве тега. Окно является абсолютным в том смысле, что не имеет значения, повторяются ли слова, мне просто нужно захватить 8 слов до ‹искомого слова› и 8 слов после.   -  person Paul    schedule 04.06.2013


Ответы (1)


Ваш корпус уже токенизирован? Вы действительно должны убедиться, что это так.

В любом случае, я думаю, вас интересуют группы объекта соответствия:

output.write(''.join(m.groups()) + '\n')

Затем вы обнаружите, что ваши группы будут захватывать только последнее слово каждого окна. Вам нужно поставить дополнительную пару скобок:

m = re.search(r'((?:\S+\s+){0,8})facility((?:\s+\S+){0,8})', line)

(?:...) — это незахватывающая группа: она определяет область действия {0,8}, но в результате не дает вам дополнительной группы.

Ознакомьтесь с официальным RegEx Howto Python или выполните поиск по web для учебника RegEx. И в любом случае, возможно, вам стоит поискать готовый корпусный инструмент вместо того, чтобы заново изобретать велосипед.

EDIT:
Чтобы сопоставить несколько вхождений ключевого слова в одной строке, используйте re.findall() (возвращает список) или re.finditer() (возвращает итератор):

context = re.findall(r'((?:\S+\s+){0,8})facility((?:\s+\S+){0,8})', line)

context будет списком пар, т.е. левое и правое окно для каждого вхождения ключевого слова. Обратите внимание, однако, что это все равно не будет работать, если два вхождения одного и того же ключевого слова имеют между собой менее 8 слов, например.

foo bar заведение bla foo bar заведение baz foo bar

будет генерировать только одно совпадение для первого вхождения "facility", имея второе в своем правом окне. Второй «объект» не будет генерировать собственное совпадение, поскольку re.findall() не выполняет совпадений с перекрытием, а это означает, что он будет искать другой «объект» только после окончания правильного контекста. Это также означает, что если между ними находится от 9 до 15 слов, в левом окне второго «объекта» будет меньше того, что уже потребляется первым.

person lenz    schedule 04.06.2013
comment
Спасибо, Ленц. Использовали готовый инструмент LMOSS [ссылка]indiana.edu/~clcl/LMOSS позволяет вам ввести корпус, выбрать ключевое слово для поиска, вставить словарные термины, которые вы хотите подсчитать, вхождение в данное окно слова поискового термина. Был очень полезен. К сожалению, он обрабатывает только отдельные слова, и теперь мне нужно проверить составные слова. Отсюда мой набег на программирование, знаете ли вы какие-нибудь другие? Прочитал Regex и внес изменения, которые вы предложили для исследования и групп. Теперь я получаю текстовый вывод, хотя некоторые дублирования, мне нужно исследовать. - person Paul; 04.06.2013
comment
Я не слишком увлекаюсь совместными действиями, но я думаю, что вам следует поискать в Google инструмент KWIC (ключевое слово в контексте) и найти тот, который позволит вам искать многословный термин. Но, просто напомню еще раз, если вы думаете, что это варианты «безопасность», «безопасность», «безопасность», «безопасность». и т. д. все принадлежат одному и тому же слову, вам нужно выполнить некоторую предварительную обработку вашего корпуса (хороший инструмент корпуса может сделать это за вас). - person lenz; 04.06.2013
comment
Спасибо, Ленц. Приведенный выше код Python кажется таким близким к тому, что мне нужно сейчас, но, похоже, он не находит все вхождения ключевого слова в строке. Например, если до или после него меньше 8 слов, он ничего не фиксирует. Любые идеи? - person Paul; 04.06.2013
comment
Если вы ожидаете более одного вхождения ключевого слова в line, вы можете выполнить сопоставление с re.findall() или re.finditer(). - person lenz; 04.06.2013
comment
@len: Если вы отредактируете исходный ответ, чтобы он содержал все, что решило проблему, вы получите положительный ответ. :) - person tink; 04.06.2013