11

空白を含む文字列のリストがたくさんあります(例:「ニューヨーク」、「米国」、「ノースカロライナ」、「アラブ首長国連邦」、「英国および北アイルランド」...およびその周辺5000以上のそのような文字列)。

そして、私はこれらの文字列のいずれかを含む可能性のある大きなテキストを持っています(たとえば、「ノースカロライナに行く途中でニューヨークに行き、最終的にはアラブ首長国連邦に行く予定です」)。

正規表現を効率的に使用して、テキスト内のこれらの文字列の存在を検出するための最良の方法は何ですか?

または、テキストからバイグラムを抽出して、このリスト内のどの文字列がこれらのバイグラムと一致するかを確認するなど、逆に考える必要がありますか?


編集:

VoronoiPotatoとの興味深い議論の後、私は大きな文字列リストのアイテムのすべてのトークンにインデックスを付ける方が良いと思い始めました、そして私は関数でこれを行うことができました:

def indexing_list(li):
    index_dict={}
    for i in rl(li):
        words=li[i].split()
        for j in rl(words):
            index=complex(i,j)
            word=words[j].lower()
            try:
                index_dict[word].append(index)
            except:
                index_dict[word]=[index]
    return index_dict

そして、このリストで試してみました:

[u'United Kingdom of Great Britain and Northern Ireland', u'Democratic People\u2019s Republic of Korea', u'Democratic Republic of the Congo', u'Lao People\u2019s Democratic Republic', u'Saint Vincent and the Grenadines', u'United Republic of Tanzania', u'Iran (Islamic Republic of)', u'Central African Republic', u'Islamic Republic of Iran', u'United States of America', u'Bosnia and Herzegovina', u'Libyan Arab Jamahiriya', u'Saint Kitts and Nevis', u'Sao Tome and Principe', u'Syrian Arab Republic', u'United Arab Emirates', u'Antigua and Barbuda', u'Trinidad and Tobago', u'Dominican Republic', u'Russian Federation', u'Brunei Darussalam', u'Equatorial Guinea', u'Republic of Korea', u'Marshall Islands', u'Papua New Guinea', u'Solomon Islands', u'ComodRivadavia', u'Port-au-Prince', u'DumontDUrville', u'Czech Republic', u'United Kingdom', u'Dar es Salaam', u'Cambridge Bay', u'Coral Harbour', u'Port of Spain', u'Santo Domingo', u'St Barthelemy', u'Swift Current', u'Ujung Pandang', u'Yekaterinburg', u'South Georgia', u'C\xf4te d\u2019Ivoire', u"Cote d'Ivoire", u'Guinea-Bissau', u'Liechtenstein', u'United States', u'Johannesburg', u'Buenos Aires', u'Rio Gallegos', u'Blanc-Sablon', u'Campo Grande', u'Danmarkshavn', u'Dawson Creek', u'Indianapolis', u'North Dakota', u'Rankin Inlet', u'Scoresbysund', u'Longyearbyen', u'Kuala Lumpur', u'Antananarivo', u'Port Moresby', u'Burkina Faso', u'Saudi Arabia', u'Sierra Leone', u'South Africa', u'Turkmenistan', u'Addis Ababa', u'Brazzaville', u'Ouagadougou', u'El Salvador', u'Los Angeles', u'Mexico City', u'Pangnirtung', u'Porto Velho', u'Puerto Rico', u'Rainy River', u'Tegucigalpa', u'Thunder Bay', u'Yellowknife', u'Ho Chi Minh', u'Krasnoyarsk', u'Novosibirsk', u'Ulaanbaatar', u'Vladivostok', u'Broken Hill', u'Isle of Man', u'Kaliningrad', u'Guadalcanal', u'Afghanistan', u'Cock Island', u'El Salvador', u'Netherlands', u'New Zealand', u'Philippines', u'Saint Lucia', u'Switzerland', u'Timor-Leste', u'Casablanca', u'Libreville', u'Lubumbashi', u'Nouakchott', u'Porto-Novo', u'Costa Rica', u'Fort Wayne', u'Grand Turk', u'Guadeloupe', u'Hermosillo', u'Petersburg', u'Louisville', u'Monticello', u'Martinique', u'Montevideo', u'Montserrat', u'Paramaribo', u'Porto Acre', u'Rio Branco', u'St Vincent', u'Whitehorse', u'Antarctica', u'South Pole', u'Choibalsan', u'Phnom Penh', u'Ulan Bator', u'Cape Verde', u'Queensland', u'Yancowinna', u'Bratislava', u'Copenhagen', u'Luxembourg', u'San Marino', u'Simferopol', u'Zaporozhye', u'Kiritimati', u'Yugoslavia', u'Azerbaijan', u'Bangladesh', u'Cape Verde', u'Costa Rica', u'Kazakhstan', u'Kyrgyzstan', u'Luxembourg', u'Madagascar', u'Mauritania', u'Micronesia', u'Montenegro', u'Mozambique', u'San Marino', u'Seychelles', u'Tajikistan', u'Uzbekistan', u'Bujumbura', u'Mogadishu', u'Anchorage', u'Araguaina', u'Catamarca', u'Boa Vista', u'Chihuahua', u'Fortaleza', u'Glace Bay', u'Goose Bay', u'Guatemala', u'Guayaquil', u'Tell City', u'Vincennes', u'Menominee', u'Monterrey', u'New Salem', u'Sao Paulo', u'St Thomas', u'Vancouver', u'Ashkhabad', u'Chongqing', u'Chungking', u'Hong Kong', u'Jerusalem', u'Kamchatka', u'Pontianak', u'Pyongyang', u'Qyzylorda', u'Samarkand', u'Singapore', u'Vientiane', u'Jan Mayen', u'Reykjavik', u'St Helena', u'Australia', u'Lord Howe', u'Melbourne', u'Greenwich', u'Amsterdam', u'Bucharest', u'Gibraltar', u'Ljubljana', u'Mariehamn', u'Podgorica', u'Stockholm', u'Volgograd', u'Christmas', u'Kerguelen', u'Mauritius', u'Enderbury', u'Galapagos', u'Kwajalein', u'Marquesas', u'Pago Pago', u'Rarotonga', u'Tongatapu', u'Argentina', u'Australia', u'Guatemala', u'Indonesia', u'Lithuania', u'Mauritius', u'Nicaragua', u'Singapore', u'Sri Lanka', u'Swaziland', u'Macedonia', u'Venezuela', u'Blantyre', u'Djibouti', u'El Aaiun', u'Freetown', u'Gaborone', u'Khartoum', u'Kinshasa', u'Monrovia', u'Ndjamena', u'Sao Tome', u'Timbuktu', u'Windhoek', u'Anguilla', u'La Rioja', u'San Juan', u'San Luis', u'Asuncion', u'Atikokan', u'Barbados', u'Dominica', u'Edmonton', u'Eirunepe', u'Ensenada', u'Kentucky', u'Mazatlan', u'Miquelon', u'Montreal', u'New York', u'Resolute', u'Santiago', u'Shiprock', u'St Johns', u'St Kitts', u'St Lucia', u'Winnipeg', u'Ashgabat', u'Calcutta', u'Damascus', u'Dushanbe', u'Istanbul', u'Jayapura', u'Katmandu', u'Makassar', u'Sakhalin', u'Shanghai', u'Tashkent', u'Tel Aviv', u'Atlantic', u'Adelaide', u'Brisbane', u'Canberra', u'Lindeman', u'Tasmania', u'Victoria', u'Belgrade', u'Brussels', u'Budapest', u'Chisinau', u'Guernsey', u'Helsinki', u'Sarajevo', u'Tiraspol', u'Uzhgorod', u'Auckland', u'Funafuti', u'Honolulu', u'Johnston', u'Pitcairn', u'Barbados', u'Botswana', u'Bulgaria', u'Cambodia', u'Cameroon', u'Colombia', u'Djibouti', u'Dominica', u'Ethiopia', u'Holy See', u'Honduras', u'Kiribati', u'Malaysia', u'Maldives', u'Mongolia', u'Pakistan', u'Paraguay', u'Portugal', u'Slovakia', u'Slovenia', u'Suriname', u'Thailand', u'Tanzania', u'Viet Nam', u'Zimbabwe', u'Anguilla', u'Abidjan', u'Algiers', u'Conakry', u'Kampala', u'Mbabane', u'Nairobi', u'Tripoli', u'America', u'Antigua', u'Cordoba', u'Mendoza', u'Tucuman', u'Ushuaia', u'Caracas', u'Cayenne', u'Chicago', u'Curacao', u'Detroit', u'Godthab', u'Grenada', u'Halifax', u'Indiana', u'Marengo', u'Winamac', u'Iqaluit', u'Managua', u'Marigot', u'Moncton', u'Nipigon', u'Noronha', u'Phoenix', u'Rosario', u'Tijuana', u'Toronto', u'Tortola', u'Yakutat', u'McMurdo', u'Rothera', u'Baghdad', u'Bahrain', u'Bangkok', u'Bishkek', u'Colombo', u'Irkutsk', u'Jakarta', u'Karachi', u'Kashgar', u'Kolkata', u'Kuching', u'Magadan', u'Nicosia', u'Rangoon', u'Tbilisi', u'Thimphu', u'Yakutsk', u'Yerevan', u'Bermuda', u'Madeira', u'Stanley', u'Andorra', u'Belfast', u'Tallinn', u'Vatican', u'Vilnius', u'Mayotte', u'Reunion', u'Chatham', u'Fakaofo', u'Gambier', u'Norfolk', u'Albania', u'Algeria', u'Armenia', u'Austria', u'Bahamas', u'Bahrain', u'Belarus', u'Belgium', u'Bolivia', u'Burundi', u'Comoros', u'Croatia', u'Denmark', u'Ecuador', u'Eritrea', u'Estonia', u'Finland', u'Georgia', u'Germany', u'Grenada', u'Hungary', u'Iceland', u'Ireland', u'Jamaica', u'Lebanon', u'Lesotho', u'Liberia', u'Morocco', u'Myanmar', u'Namibia', u'Nigeria', u'Moldova', u'Romania', u'Senegal', u'Somalia', u'Tunisia', u'Ukraine', u'Uruguay', u'Vanuatu', u'Asmara', u'Asmera', u'Bamako', u'Bangui', u'Banjul', u'Bissau', u'Douala', u'Harare', u'Kigali', u'Luanda', u'Lusaka', u'Malabo', u'Maputo', u'Maseru', u'Niamey', u'Belize', u'Bogota', u'Cancun', u'Cayman', u'Cuiaba', u'Dawson', u'Denver', u'Havana', u'Inuvik', u'Juneau', u'La Paz', u'Maceio', u'Manaus', u'Merida', u'Nassau', u'Recife', u'Regina', u'Virgin', u'Mawson', u'Palmer', u'Vostok', u'Arctic', u'Almaty', u'Anadyr', u'Aqtobe', u'Beirut', u'Brunei', u'Harbin', u'Kuwait', u'Manila', u'Muscat', u'Riyadh', u'Saigon', u'Taipei', u'Tehran', u'Thimbu', u'Urumqi', u'Azores', u'Canary', u'Faeroe', u'Currie', u'Darwin', u'Hobart', u'Sydney', u'Europe', u'Athens', u'Berlin', u'Dublin', u'Jersey', u'Lisbon', u'London', u'Madrid', u'Geneva', u'Monaco', u'Moscow', u'Prague', u'Samara', u'Skopje', u'Tirane', u'Vienna', u'Warsaw', u'Zagreb', u'Zurich', u'Chagos', u'Comoro', u'Easter', u'Kosrae', u'Majuro', u'Midway', u'Noumea', u'Ponape', u'Saipan', u'Tahiti', u'Tarawa', u'Wallis', u'Andora', u'Angola', u'Belize', u'Bhutan', u'Brazil', u'Canada', u'Cyprus', u'France', u'Gambia', u'Greece', u'Guinea', u'Guyana', u'Israel', u'Jordan', u'Kuwait', u'Latvia', u'Malawi', u'Mexico', u'Monaco', u'Norway', u'Panama', u'Poland', u'Rwanda', u'Serbia', u'Sweden', u'Turkey', u'Tuvalu', u'Uganda', u'Zambia', u'Accra', u'Cairo', u'Ceuta', u'Dakar', u'Lagos', u'Tunis', u'Jujuy', u'Aruba', u'Bahia', u'Belem', u'Boise', u'Vevay', u'Thule', u'Casey', u'Davis', u'Syowa', u'Amman', u'Aqtau', u'Dacca', u'Dhaka', u'Dubai', u'Kabul', u'Macao', u'Macau', u'Qatar', u'Seoul', u'Tokyo', u'Faroe', u'Eucla', u'Perth', u'Malta', u'Minsk', u'Paris', u'Sofia', u'Vaduz', u'Cocos', u'Efate', u'Nauru', u'Palau', u'Samoa', u'Benin', u'Chile', u'China', u'Congo', u'Egypt', u'Gabon', u'Ghana', u'Haiti', u'India', u'Italy', u'Japan', u'Kenya', u'Libya', u'Malta', u'Nauru', u'Nepal', u'Niger', u'Palau', u'Qatar', u'Samoa', u'Spain', u'Sudan', u'Syria', u'Tonga', u'Yemen', u'Lome', u'Adak', u'Atka', u'Nuuk', u'Knox', u'Lima', u'Nome', u'Asia', u'Aden', u'Baku', u'Dili', u'Gaza', u'Hovd', u'Omsk', u'Oral', u'Zulu', u'Kiev', u'Oslo', u'Bonn', u'Riga', u'Rome', u'Mahe', u'Apia', u'Fiji', u'Guam', u'Niue', u'Truk', u'Wake', u'Chad', u'Cuba', u'Fiji', u'Iran', u'Iraq', u'Mali', u'Oman', u'Peru', u'Togo', u'GMT', u'Yap']

そして、私は自分が持っているテキストの分析を始めました:

text='I went to New York and New Orleans and London and United States, Canada, and Egypt, Saudi Arabia'
text_words=text.split()

そして、各単語を別々に調査しようとしました:

for i in rl(text_words):
    tw=text_words[i].lower()
    print i
    print tw
    print index_dict.get(tw)

方法は速いようですが、それをさらに進める方法がわかりません

4

6 に答える 6

10
whitespaces_list=['New York','United States', 'United Arab Emirates']
large_text="I went to New York on my way to North Carolina, and eventually will be going to United Arab Emirates."
for i in whitespaces_list:
    if i in large_text:
        print i," Exist in Large text"

このようなものを探していますか?

于 2012-08-10T13:44:37.767 に答える
6

ほとんどの人が言ったように、それはあなたのテキスト都市リストに依存し、方法を比較するために使用timeitすることは、どちらに行くかを選択するための最良の方法です:

list = ['New York','United States', 'United Arab Emirates']
text = "I went to New York on my way to North Carolina, and eventually will be going to United Arab Emirates."

1,000,000 ループのタイミングと各ループの 5 回の反復

timeit -n 1000000 -r 5 re.findall(token_regex, text)
1000000 loops, best of 5: 6.22 us per loop

timeit -n 1000000 -r 5 filter(lambda x: x in text, token_list)
1000000 loops, best of 5: 2.76 us per loop

def somefunc():
    for i in token_list:
        if i in text:
            pass

timeit -n 1000000 -r 5 somefunc()
1000000 loops, best of 5: 1.68 us per loop


t = [hash(x) for x in text.replace('.', '').replace(',','').split()] 
tl = [hash(x) for x in token_list]# this list contains single words, like "New" and "York" but not "New York"

def SomeFunc2():
    for x in tl:
        if x in t:
            pass

timeit -n 1000000 -r 5 SomeFunc2()
1000000 loops, best of 5: 6.26 us per loop

t = set([hash(x) for x in text.replace('.', '').replace(',','').split()])
tl = set(hash(x) for x in token_list])

timeit -n 1000000 -r 5 t.intersection(tl)
1000000 loops, best of 5: 1.75 us per loop

サンプル データを使用すると、 for ループの使用がかなり高速に見えます...しかし、私が言ったように、よりリアルタイムのデータでテストを行う必要があります。

編集:わかりました、より多くのリアルタイムデータを使用する方が良いと思いますので、次のデータセットで結果を再計算しています:

list = [u'United Kingdom of Great Britain and Northern Ireland', u'Democratic People\u2019s Republic of Korea', u'Democratic Republic of the Congo', u'Lao People\u2019s Democratic Republic', u'Saint Vincent and the Grenadines', u'United Republic of Tanzania', u'Iran (Islamic Republic of)', u'Central African Republic', u'Islamic Republic of Iran', u'United States of America', u'Bosnia and Herzegovina', u'Libyan Arab Jamahiriya', u'Saint Kitts and Nevis', u'Sao Tome and Principe', u'Syrian Arab Republic', u'United Arab Emirates', u'Antigua and Barbuda', u'Trinidad and Tobago', u'Dominican Republic', u'Russian Federation', u'Brunei Darussalam', u'Equatorial Guinea', u'Republic of Korea', u'Marshall Islands', u'Papua New Guinea', u'Solomon Islands', u'ComodRivadavia', u'Port-au-Prince', u'DumontDUrville', u'Czech Republic', u'United Kingdom', u'Dar es Salaam', u'Cambridge Bay', u'Coral Harbour', u'Port of Spain', u'Santo Domingo', u'St Barthelemy', u'Swift Current', u'Ujung Pandang', u'Yekaterinburg', u'South Georgia', u'C\xf4te d\u2019Ivoire', u"Cote d'Ivoire", u'Guinea-Bissau', u'Liechtenstein', u'United States', u'Johannesburg', u'Buenos Aires', u'Rio Gallegos', u'Blanc-Sablon', u'Campo Grande', u'Danmarkshavn', u'Dawson Creek', u'Indianapolis', u'North Dakota', u'Rankin Inlet', u'Scoresbysund', u'Longyearbyen', u'Kuala Lumpur', u'Antananarivo', u'Port Moresby', u'Burkina Faso', u'Saudi Arabia', u'Sierra Leone', u'South Africa', u'Turkmenistan', u'Addis Ababa', u'Brazzaville', u'Ouagadougou', u'El Salvador', u'Los Angeles', u'Mexico City', u'Pangnirtung', u'Porto Velho', u'Puerto Rico', u'Rainy River', u'Tegucigalpa', u'Thunder Bay', u'Yellowknife', u'Ho Chi Minh', u'Krasnoyarsk', u'Novosibirsk', u'Ulaanbaatar', u'Vladivostok', u'Broken Hill', u'Isle of Man', u'Kaliningrad', u'Guadalcanal', u'Afghanistan', u'Cock Island', u'El Salvador', u'Netherlands', u'New Zealand', u'Philippines', u'Saint Lucia', u'Switzerland', u'Timor-Leste', u'Casablanca', u'Libreville', u'Lubumbashi', u'Nouakchott', u'Porto-Novo', u'Costa Rica', u'Fort Wayne', u'Grand Turk', u'Guadeloupe', u'Hermosillo', u'Petersburg', u'Louisville', u'Monticello', u'Martinique', u'Montevideo', u'Montserrat', u'Paramaribo', u'Porto Acre', u'Rio Branco', u'St Vincent', u'Whitehorse', u'Antarctica', u'South Pole', u'Choibalsan', u'Phnom Penh', u'Ulan Bator', u'Cape Verde', u'Queensland', u'Yancowinna', u'Bratislava', u'Copenhagen', u'Luxembourg', u'San Marino', u'Simferopol', u'Zaporozhye', u'Kiritimati', u'Yugoslavia', u'Azerbaijan', u'Bangladesh', u'Cape Verde', u'Costa Rica', u'Kazakhstan', u'Kyrgyzstan', u'Luxembourg', u'Madagascar', u'Mauritania', u'Micronesia', u'Montenegro', u'Mozambique', u'San Marino', u'Seychelles', u'Tajikistan', u'Uzbekistan', u'Bujumbura', u'Mogadishu', u'Anchorage', u'Araguaina', u'Catamarca', u'Boa Vista', u'Chihuahua', u'Fortaleza', u'Glace Bay', u'Goose Bay', u'Guatemala', u'Guayaquil', u'Tell City', u'Vincennes', u'Menominee', u'Monterrey', u'New Salem', u'Sao Paulo', u'St Thomas', u'Vancouver', u'Ashkhabad', u'Chongqing', u'Chungking', u'Hong Kong', u'Jerusalem', u'Kamchatka', u'Pontianak', u'Pyongyang', u'Qyzylorda', u'Samarkand', u'Singapore', u'Vientiane', u'Jan Mayen', u'Reykjavik', u'St Helena', u'Australia', u'Lord Howe', u'Melbourne', u'Greenwich', u'Amsterdam', u'Bucharest', u'Gibraltar', u'Ljubljana', u'Mariehamn', u'Podgorica', u'Stockholm', u'Volgograd', u'Christmas', u'Kerguelen', u'Mauritius', u'Enderbury', u'Galapagos', u'Kwajalein', u'Marquesas', u'Pago Pago', u'Rarotonga', u'Tongatapu', u'Argentina', u'Australia', u'Guatemala', u'Indonesia', u'Lithuania', u'Mauritius', u'Nicaragua', u'Singapore', u'Sri Lanka', u'Swaziland', u'Macedonia', u'Venezuela', u'Blantyre', u'Djibouti', u'El Aaiun', u'Freetown', u'Gaborone', u'Khartoum', u'Kinshasa', u'Monrovia', u'Ndjamena', u'Sao Tome', u'Timbuktu', u'Windhoek', u'Anguilla', u'La Rioja', u'San Juan', u'San Luis', u'Asuncion', u'Atikokan', u'Barbados', u'Dominica', u'Edmonton', u'Eirunepe', u'Ensenada', u'Kentucky', u'Mazatlan', u'Miquelon', u'Montreal', u'New York', u'Resolute', u'Santiago', u'Shiprock', u'St Johns', u'St Kitts', u'St Lucia', u'Winnipeg', u'Ashgabat', u'Calcutta', u'Damascus', u'Dushanbe', u'Istanbul', u'Jayapura', u'Katmandu', u'Makassar', u'Sakhalin', u'Shanghai', u'Tashkent', u'Tel Aviv', u'Atlantic', u'Adelaide', u'Brisbane', u'Canberra', u'Lindeman', u'Tasmania', u'Victoria', u'Belgrade', u'Brussels', u'Budapest', u'Chisinau', u'Guernsey', u'Helsinki', u'Sarajevo', u'Tiraspol', u'Uzhgorod', u'Auckland', u'Funafuti', u'Honolulu', u'Johnston', u'Pitcairn', u'Barbados', u'Botswana', u'Bulgaria', u'Cambodia', u'Cameroon', u'Colombia', u'Djibouti', u'Dominica', u'Ethiopia', u'Holy See', u'Honduras', u'Kiribati', u'Malaysia', u'Maldives', u'Mongolia', u'Pakistan', u'Paraguay', u'Portugal', u'Slovakia', u'Slovenia', u'Suriname', u'Thailand', u'Tanzania', u'Viet Nam', u'Zimbabwe', u'Anguilla', u'Abidjan', u'Algiers', u'Conakry', u'Kampala', u'Mbabane', u'Nairobi', u'Tripoli', u'America', u'Antigua', u'Cordoba', u'Mendoza', u'Tucuman', u'Ushuaia', u'Caracas', u'Cayenne', u'Chicago', u'Curacao', u'Detroit', u'Godthab', u'Grenada', u'Halifax', u'Indiana', u'Marengo', u'Winamac', u'Iqaluit', u'Managua', u'Marigot', u'Moncton', u'Nipigon', u'Noronha', u'Phoenix', u'Rosario', u'Tijuana', u'Toronto', u'Tortola', u'Yakutat', u'McMurdo', u'Rothera', u'Baghdad', u'Bahrain', u'Bangkok', u'Bishkek', u'Colombo', u'Irkutsk', u'Jakarta', u'Karachi', u'Kashgar', u'Kolkata', u'Kuching', u'Magadan', u'Nicosia', u'Rangoon', u'Tbilisi', u'Thimphu', u'Yakutsk', u'Yerevan', u'Bermuda', u'Madeira', u'Stanley', u'Andorra', u'Belfast', u'Tallinn', u'Vatican', u'Vilnius', u'Mayotte', u'Reunion', u'Chatham', u'Fakaofo', u'Gambier', u'Norfolk', u'Albania', u'Algeria', u'Armenia', u'Austria', u'Bahamas', u'Bahrain', u'Belarus', u'Belgium', u'Bolivia', u'Burundi', u'Comoros', u'Croatia', u'Denmark', u'Ecuador', u'Eritrea', u'Estonia', u'Finland', u'Georgia', u'Germany', u'Grenada', u'Hungary', u'Iceland', u'Ireland', u'Jamaica', u'Lebanon', u'Lesotho', u'Liberia', u'Morocco', u'Myanmar', u'Namibia', u'Nigeria', u'Moldova', u'Romania', u'Senegal', u'Somalia', u'Tunisia', u'Ukraine', u'Uruguay', u'Vanuatu', u'Asmara', u'Asmera', u'Bamako', u'Bangui', u'Banjul', u'Bissau', u'Douala', u'Harare', u'Kigali', u'Luanda', u'Lusaka', u'Malabo', u'Maputo', u'Maseru', u'Niamey', u'Belize', u'Bogota', u'Cancun', u'Cayman', u'Cuiaba', u'Dawson', u'Denver', u'Havana', u'Inuvik', u'Juneau', u'La Paz', u'Maceio', u'Manaus', u'Merida', u'Nassau', u'Recife', u'Regina', u'Virgin', u'Mawson', u'Palmer', u'Vostok', u'Arctic', u'Almaty', u'Anadyr', u'Aqtobe', u'Beirut', u'Brunei', u'Harbin', u'Kuwait', u'Manila', u'Muscat', u'Riyadh', u'Saigon', u'Taipei', u'Tehran', u'Thimbu', u'Urumqi', u'Azores', u'Canary', u'Faeroe', u'Currie', u'Darwin', u'Hobart', u'Sydney', u'Europe', u'Athens', u'Berlin', u'Dublin', u'Jersey', u'Lisbon', u'London', u'Madrid', u'Geneva', u'Monaco', u'Moscow', u'Prague', u'Samara', u'Skopje', u'Tirane', u'Vienna', u'Warsaw', u'Zagreb', u'Zurich', u'Chagos', u'Comoro', u'Easter', u'Kosrae', u'Majuro', u'Midway', u'Noumea', u'Ponape', u'Saipan', u'Tahiti', u'Tarawa', u'Wallis', u'Andora', u'Angola', u'Belize', u'Bhutan', u'Brazil', u'Canada', u'Cyprus', u'France', u'Gambia', u'Greece', u'Guinea', u'Guyana', u'Israel', u'Jordan', u'Kuwait', u'Latvia', u'Malawi', u'Mexico', u'Monaco', u'Norway', u'Panama', u'Poland', u'Rwanda', u'Serbia', u'Sweden', u'Turkey', u'Tuvalu', u'Uganda', u'Zambia', u'Accra', u'Cairo', u'Ceuta', u'Dakar', u'Lagos', u'Tunis', u'Jujuy', u'Aruba', u'Bahia', u'Belem', u'Boise', u'Vevay', u'Thule', u'Casey', u'Davis', u'Syowa', u'Amman', u'Aqtau', u'Dacca', u'Dhaka', u'Dubai', u'Kabul', u'Macao', u'Macau', u'Qatar', u'Seoul', u'Tokyo', u'Faroe', u'Eucla', u'Perth', u'Malta', u'Minsk', u'Paris', u'Sofia', u'Vaduz', u'Cocos', u'Efate', u'Nauru', u'Palau', u'Samoa', u'Benin', u'Chile', u'China', u'Congo', u'Egypt', u'Gabon', u'Ghana', u'Haiti', u'India', u'Italy', u'Japan', u'Kenya', u'Libya', u'Malta', u'Nauru', u'Nepal', u'Niger', u'Palau', u'Qatar', u'Samoa', u'Spain', u'Sudan', u'Syria', u'Tonga', u'Yemen', u'Lome', u'Adak', u'Atka', u'Nuuk', u'Knox', u'Lima', u'Nome', u'Asia', u'Aden', u'Baku', u'Dili', u'Gaza', u'Hovd', u'Omsk', u'Oral', u'Zulu', u'Kiev', u'Oslo', u'Bonn', u'Riga', u'Rome', u'Mahe', u'Apia', u'Fiji', u'Guam', u'Niue', u'Truk', u'Wake', u'Chad', u'Cuba', u'Fiji', u'Iran', u'Iraq', u'Mali', u'Oman', u'Peru', u'Togo', u'GMT', u'Yap']

@hmghaly の例から取得したリストには、 645の国と都市が含まれています

text = "Lorem ipsum dolor Turkey sit amet, Brussels consectetur adipisicing elit, sed do Santo Domingo eiusmod tempor incididunt ut labore Tell City et dolore magna aliqua. Ut Goose Bay enim ad minim veniam, Bahrain quis nostrud exercitation New Salem ullamco laboris nisi Mongolia ut aliquip ex ea Yekaterinburg commodo consequat. Chihuahua Duis aute irure dolor in Nouakchott reprehenderit in voluptate velit Ireland esse cillum dolore eu fugiat nulla Lome pariatur. Excepteur sint occaecat San Marino cupidatat non proident, Comoro sunt in culpa qui officia Belem deserunt mollit anim id est laborum"

テキストスライスは、国/都市名がランダムに配置された古典的なLorem ipsumテキストです。最終的なテキストは、同じテキストを 51 回連結した結果で、合計4590語と 30344文字になります。(ここに書くには長すぎるので、同じテキストの繰り返しです)

タイミングは 1,000 回のループ (以前は 1,000,000 回のループでテスト) に基づいており、各ループには 2 回の繰り返しが含まれています。

正規表現

regex = '('+'|'.join(list)+')'
%timeit -n 1000 -r 2 re.findall(regex, text)
1000 loops, best of 2: 3.36 ms per loop

ラムダ

%timeit -n 1000 -r 2 filter(lambda x: x in text, list)
1000 loops, best of 2: 140 ms per loop

ループ用

def somefunc():
    for i in list:
        if i in text:
            pass

%timeit -n 1000 -r 2 somefunc()
1000 loops, best of 2: 138 ms per loop

基数ツリー

from radix_tree import RadixTree
Tokens = list(set(list))

trie = RadixTree()
for token in Tokens:
    trie.insert(token, token)

def FindMatches(trie, text):
    while 0 < len(text):
        try:
            test = text[:text.index(" ")]
        except ValueError:
            test = text

        for token in trie.search_prefix(test, 100):
            if text.startswith(token):
                pass # no need to print to screen

        try:
            text = text[text.index(" ") + 1:]
        except ValueError:
            break # End of string

%timeit -n 1000 -r 2 FindMatches(trie, text)
1000 loops, best of 2: 236 ms per loop

セットと正規表現

def SomeMoreFunc():
    rgx = '([A-Z][A-Za-z]*)' #@VoronoiPotato's approach
    filtered_text = set(re.findall(rgx, text)) #make a set of all words that starts with a capital letter 
    for x in list:
         #we split city name if it is constucted with 2 or more words, and parse it to a set, then check if all parts of the string are in the filtered text. If yes, then our city is within our text body
        if set(x.split()).issubset(filtered_text):
            pass 

%timeit -n 1000 -r 2 SomeMoreFunc()
1000 loops, best of 2: 2.81 ms per loop

@VoronoiPotato のアプローチをset使用法で変更しました。


トークンの索引付け

def indexing_list(li):
    index_dict={}
    for i in range(len(li)):
        words=li[i].split()
        for j in range(len(words)):
            index=complex(i,j)
            word=words[j].lower()
            try:
                index_dict[word].append(index)
            except:
                index_dict[word]=[index]
    return index_dict

def someFunc():
    ind_dic = indexing_list(lst)
    text_words=text.split()
    for i in range(len(text_words)):
        tw=text_words[i].lower()
        index_dict.get(tw)


%timeit -n 1000 -r 2 someFunc()
1000 loops, best of 2: 7.41 ms per loop

新しいデータ セットでは、単純なテキスト検索の代わりに正規表現を使用することが明確であり、セットを使用するとパフォーマンスが向上します (同様の単語をトリミングissubsetし、より簡単で高速な cmparison に使用できるようにすることにより)。基数ツリー検索は、これらのアプローチの中で最悪の結果をもたらします。以前のデータセットでは、正規表現の使用はテキスト検索よりも悪かった...

編集: トークンのインデックス作成の結果が追加されます。ただし、この例では 1 つの単語のみを検索し、2 つ以上の単語を含む都市名のコントロールはありません。

また、Set & Regex および Token Indexing メソッドには危険なバグが存在し、都市名を考慮する

El Salvador

および次のテキスト:

Salvador Dali lorem ipsum dolor. El Dranges porte quantera. 

どちらの方法でも、単語を分割して個別に検索するため、 El SalvadorSalvadorおよびElが一致します。

于 2012-08-10T14:22:39.950 に答える
4

テキスト内の大文字の単語をチェックする正規表現を使用します。これにより、チェックにかかる時間が大幅に短縮されます

[AZ] [az] *

一致するもの(大文字)を取得したら、それがリストの最初の単語と一致するかどうかを確認します。一致する場合は、完全に一致するまで次の一致をリストの2番目の単語と並べます。

于 2012-08-10T14:07:58.287 に答える
1

基数ツリーが最も効率的であることに気付くかもしれません。

基本的な考え方は、検索対象のテキストを、他の文字列を見つけるのに効率的なツリーに変換することです。ただし、検索しているトークンには空白が含まれているため、最適な定義を見つけるためにいじる必要があります。トークン。

たとえば、X 個の単語のグループはすべて 1 つのトークンです。ここで、X は、検索している特定のアイテム内の単語の最大数です。例:「ここはすべて緑」のツリー。トークンの長さが 3 語の場合、「Everything is green」、「is green over」、および「green over here」が含まれます。

質問の例(上記が書かれた後に投稿された)を考えると、以下のコードで上記の提案を逆にすることになりました。検索対象のトークンが Trie/Radix ツリーに追加され、テキスト文字列が徐々に検索されます。トークンが少なく、検索するテキストが多い場合は、上記の取り消し線の行がより効率的です

これは基数ツリーのPython 実装であるため、必ずしも自分で記述する必要はありません。その基数ツリーを使用した実装は次のとおりです。

from radix_tree import RadixTree
Tokens = list(set([.....the list in the question.....])) # 'El Salvador' is listed twice, this is to make it unique easily.

trie = RadixTree()
for token in Tokens:
   trie.insert(token, token)

def FindMatches(trie, text):
   while 0 < len(text):
      try:
         test = text[:text.index(" ")]
      except ValueError:
         test = text

      for token in trie.search_prefix(test, 100):
         if text.startswith(token):
            print token

      try:
         text = text[text.index(" ") + 1:]
      except ValueError:
         break # End of string

FindMatches(trie, "I went to New York and New Orleans and London and United States, Canada, and Egypt, Saudi Arabia")

search_prefix注: ニューオーリンズはトークンのリストに含まれておらず、テスト文字列のトークンに「,」が含まれているため、カナダとエジプトは内部のトライによって検出されていません。

于 2012-08-10T14:50:13.153 に答える
0

PyPI で正規表現の実装を試して、それがより高速かどうかを確認する価値があるかもしれません。

http://pypi.python.org/pypi/regex

特に「名前付きリスト」機能について考えています。

于 2012-08-11T01:03:50.707 に答える
-1

実際の解析方法に関係なく、データが非常に大きいため、それらをファイルに入れることになりますが、おそらくすでに何らかの方法で行っています。データをPythonに取り込むのに最も効率的だと思う方法は次のとおりです。

search.txt- 検索する文字列はsearchterms、文字列のリストになります

large.txt- 検索するテキストlargeは単一の文字列になります

 with open('search.txt') as x: searchterms = x.readlines()
 with open('large.txt') as x: large = x.read()

HussainNagriが彼の回答で提案したように、繰り返しsearchtermsて一致を見つけることをお勧めします。large

for i in searchterms:
  if i in large:
    print i, " found in text"
于 2012-08-10T14:13:54.077 に答える