найти (два) слова рядом друг с другом в текстах с python с операторами близости. исключительное решение - PullRequest
0 голосов
/ 02 июля 2018

Я относительно новичок в Python и ищу решение для следующей проблемы.

Я должен "отсканировать" тексты в поисках концепций.

Концепция выглядит так: (электрический 3d автомобиль)

Я должен искать появления слова «автомобиль», где в непосредственной близости от 3 слов («3d») есть другое «электрическое» (например, обычный электрический автомобиль, электрический двигатель, автономный автомобиль с электроприводом и т. Д.). )

Я знаю, что вы можете работать с текстом, как если бы это был список слов и знаков препинания.

Я подумал о следующем решении:

with open(filepath) as fp:
    concept=['motor','3d','car']
    concept_appearences=0 ## counters
    concept_positions=[]
    concept_list=[]
    word1 = concept[0]
    word2 = concept[2]
    separator=concept[1]

    distance=[int(s) for s in separator if s.isdigit()]
    distance=int(distance[0])

    distanceright=distance
    if 'd' in separator: distanceleft=distance
    if 'w' in separator: distanceleft=0

    for line in fp:
      ## look for the concepts in every line which is like a paragraph

      for index,word in enumerate(line.split()):
           if word.upper()==word1.upper():
                ## i found the first concept-word
                for i in range(index-distanceleft,index+distanceright,1):
                if line.split()[i]==word2:
                    ##print('thline.split()[i],word2)
                    print('i found the concept in postion', i )
                    start,end=i,index
                    if index<i:start,end=index,i 
                         print('check:',line.split()[start:end+1])
                         concept_appearences +=1
                         concept_list.append(line.split()[start:end+1])
                         concept_positions.append(start)
  print('the concept appeared {} times'.format(concept_appearences))
  print('in positoins',concept_positions)
  print('list of concepts',concept_list)

Примечание. Еще не реализован тот случай, когда между обоими словами есть точка, которая исключает попадание из концепции. (например: бла-бла-электрик. Автомобиль моей тети-бла-бла .... это не должно быть хитом по понятным причинам)

Возможно, это не супер-пифонический код, но он работает до сих пор. Вопросы здесь.

Во-первых: Мне кажется, это довольно распространенная проблема. Есть ли какая-нибудь библиотека для этого? Я даже не знаю «технического» названия для такой вещи, кроме «операторов близости» Примечание: я довольно много читал о NLTK (библиотека NL), но на самом деле не нашел решения для этого.

Во-вторых: Есть идеи, как сделать этот код масштабируемым? значение этого (электрический 3d автомобиль) само по себе может стать концепцией в рамках концепции, если, например, найти (электрический 3d автомобиль) в окружении "бензина", являющегося бензином на расстоянии не более 10 слов: ((электрический 3d автомобиль) 10 Вт бензин)

Третье: Если для такой вещи нет библиотеки, приветствуются любые комментарии по скорости, мне нужно поискать тысячи концепций в тексте на 100 страниц.

Большое спасибо.

Повторно отредактируйте, добавив файл ввода и вывода в соответствии с запросом @Mathieu thx.

ВХОДНОЙ ТЕКСТ: Ссылаясь на фиг. На фиг.1-3 электромобиль 1 содержит кузов 2, пары колес 3, 4 сцепления с землей спереди и сзади, электродвигатель 5, приводящий в движение передние колеса 3 через подходящую трансмиссию (не показана), и комплекты 6А, 6В аккумуляторных батарей для питания подача электрической энергии на двигатель 5. Подходящий механизм управления (не показан), приспособленный для работы водителем, служит для управления работой электродвигателя 5 и, следовательно, движением автомобиля 1. Старая электрическая машина, найденная в гараже, была выкрашена в желтый цвет. вместо синего.

Выход: концепция появилась 2 раза в позитоинах [7, 82] список [['электрический', 'автомобиль'], ['электрический', 'управляемый', 'автомобиль']]

...