2013-06-03 3 views
0

Для моего исследования я пытаюсь подсчитать из корпуса количество раз (совпадение) ряда сложных терминов (например, Safety Hazard), хранящихся в файл, 1 строка за фразу, отображаются в окне 16 слов целевого ключевого слова (например, средства). Я не программист, пытаюсь разбить его на 2 элемента: сначала извлеките файл из корпуса, где у меня есть совпадение с ключевым словом-мишенью, с 8 словами до и после. Затем попытайтесь сопоставить мой «файл словарного запаса» с этим выпиской. Я на части 1, попробовал это, но я просто получаю сообщение _sre.SRE_Match в сообщении 0x028FFE78> и изо всех сил пытаюсь использовать репрезентацию: любые одобренные предложения или другие способы сделать это. В конечном счете, я хочу, чтобы файл экспорта имел свои словарные слова со счетом после них, указывая, как часто они были найдены в этом окне с моим целевым словом. Использование 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() 

Любая помощь оценили, Пол

+0

Этот вид выглядит как python, минус indentation .... на каком языке он говорит, добавив эту информацию в свои тэги? Вы также можете уточнить, означает ли окно с 16 словами «{8 слов} {еще 8 слов}» или это гибкое окно. – tink

+0

Спасибо за ответ tink. Извините, мой первый пост здесь. Да, это Python, добавлен Python в качестве тега. Окно абсолютное в том, что не имеет значения, повторяются ли слова, мне просто нужно захватить 8 слов перед и 8 словами после. – Paul

ответ

1

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

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

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

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

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

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

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

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

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

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

Foo бар объект бла Foo бар Баз объект Foo бар

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

+0

Спасибо Lenz. Использовали инструмент с ползунком LMOSS [ссылка] http://www.indiana.edu/~clcl/LMOSS/ позволяет вводить корпус, выбирать ключевое слово для поиска, вставлять словарные термины, которые вы хотите подсчитать, в данном окне слова искать термин. Был очень полезен. К сожалению, он обрабатывает только одно слово, и теперь мне нужно проверить составные слова. Следовательно, мой набег на программирование, знаете ли вы о других? Прочитал Regex и внес изменения, которые вы предложили re.search и группы. Теперь я получаю текстовый вывод, хотя некоторое дублирование, мне нужно будет исследовать. – Paul

+0

Я не слишком много соседей, но я думаю, что вам нужно google для инструмента KWIC (ключевое слово в контексте), и найдите тот, который позволяет вам искать многословный термин. Но, просто напоминая вам снова, если вы считаете, что эти варианты безопасности, безопасности, безопасности, безопасности. и т. д. все принадлежат к одному и тому же «слову», вам нужно сделать некоторую предварительную обработку вашего корпуса (хороший инструмент корпуса может сделать это для вас). – lenz

+0

Спасибо Lenz. Код Python выше кажется настолько близким к тому, что мне нужно сейчас, но, похоже, он не находит все вхождения ключевого слова в строке. Например, если до или после него осталось менее 8 слов, оно ничего не захватывает. Есть идеи? – Paul